云存储实现之简单的文件存储
1.获取上传页面
2.选取本地文件,form形式上传文件
3.云端接收文件流,写入本地存储
4.云端更新文件元信息集合
文件元信息查询接口实现
//获取文件元信息集合
func GetMetaHandler(w http.ResponseWriter,r *http.Request){
r.ParseForm()//解析客户端的操作
filehash:=r.Form["filehash"][0] //由请求解析得到filehash的数组第一个string
fMeta:=meta.GetFileMeta(filehash)//返回传入string对应的结构体
data,err:=json.Marshal(fMeta)//转换为jso数据
if err!=nil{
w.WriteHeader(http.StatusInternalServerError)
return
}
w.Write(data)
}
文件下载接口
//文件下载
func DownLoadHandler(w http.ResponseWriter,r *http.Request){
r.ParseForm()
fshal:=r.Form.Get("filehash")
fm:=meta.GetFileMeta(fshal)//返回对象即结构体信息
f,err:=os.Open(fm.Location)//结构体中的Location是服务的存储文件的指定的位置
//将文件从服务端读到内存再返回给客户端
if err!=nil{
w.WriteHeader(http.StatusInternalServerError)
return
}
defer f.Close()
data,err:=ioutil.ReadAll(f)//读取到内存中,小文件
if err!=nil{
w.WriteHeader(http.StatusInternalServerError)
return
}
w.Header().Set("Content-Type","application/octect-stream")
w.Header().Set("Content-disposition","attachment;filename=\""+fm.FileName+"\"")
w.Write(data)
}
修改文件元信息名
//修改文件元信息名
func FileMetaUpdateHandler(w http.ResponseWriter,r *http.Request){
r.ParseForm()//解析请求参数
opType:=r.Form.Get("op")
fileShal:=r.Form.Get("filehash")
newFileName:=r.Form.Get("filename")
if opType!="0"{
w.WriteHeader(http.StatusForbidden)
return
}
if r.Method!="POST"{
w.WriteHeader(http.StatusMethodNotAllowed)
return
}
curFileMeta:=meta.GetFileMeta(fileShal)
curFileMeta.FileName=newFileName
meta.UpdateFileMeta(curFileMeta)
//修改返回给客户端
data,err:=json.Marshal(curFileMeta)
if err!=nil{
w.WriteHeader(http.StatusInternalServerError)
return
}
w.WriteHeader(http.StatusOK)
w.Write(data)
}
文件删除
//删除
func FileDeleteHandler(w http.ResponseWriter,r *http.Request){
r.ParseForm()
fileShal:=r.Form.Get("filehash")
fMeta:=meta.GetFileMeta(fileShal)//删除本地文件
os.Remove(fMeta.Location)
meta.RemoveFileMeta(fileShal)//删除在客户端的索引
w.WriteHeader(http.StatusOK)
}