本文來自部落格園,作者:Jayvee,轉載請註明原文連結:https://www.cnblogs.com/cenjw/p/16459817.html
目錄結構
E:\goproj\FileStorageDisk
│ main.go
│ program.txt
│
├─handler
│ handler.go
│
├─meta
│ filemeta.go
│
├─static
│ └─view
│ index.html
│
└─util
util.go
檔案元資訊介面
檔案元資訊資料結構:meta\filemeta.go
點選檢視程式碼
package meta
// FileMeta: 檔案元資訊結構
type FileMeta struct {
FileSha1 string // unique id
FileName string
FileSize int64
Location string
UploadAt string
}
// 儲存每個上傳檔案的元資訊,key是檔案的FileSha1
var fileMetas map[string]FileMeta
// 初始化
func init() {
fileMetas = make(map[string]FileMeta)
}
// 介面1:更新或新增檔案元資訊
func UpdateFileMeta(fmeta FileMeta) {
fileMetas[fmeta.FileSha1] = fmeta
}
// 介面2:通過唯一標識獲取檔案的元資訊物件
func GetFileMeta(fsha1 string) FileMeta {
return fileMetas[fsha1]
}
本文來自部落格園,作者:Jayvee,轉載請註明原文連結:https://www.cnblogs.com/cenjw/p/16459817.html
獲取檔案元資訊的介面
更新handler\handler.go
點選檢視程式碼
func UploadHandler(w http.ResponseWriter, r *http.Request) {
if r.Method == "GET" {
...
} else if r.Method == "POST" {
...
defer file.Close()
fileMeta := meta.FileMeta{
FileName: head.Filename,
Location: "/tmp/" + head.Filename,
UploadAt: time.Now().Format("2006-01-02 15:04:05"),
}
// newfile, err := os.Create("/tmp/" + head.Filename)
newfile, err := os.Create(fileMeta.Location)
...
fileMeta.FileSize, err = io.Copy(newfile, file)
if err != nil {
fmt.Printf("Failed to save the data to file, err:%s\n", err.Error())
return
}
newfile.Seek(0, 0) // 把檔案控制程式碼的位置移到開始位置
fileMeta.FileSha1 = util.FileSha1(newfile) // 計算檔案sha1值
meta.UpdateFileMeta(fileMeta) // 更新檔案元資訊
http.Redirect(w, r, "/file/upload/ok", http.StatusFound)
}
}
// 獲取檔案元資訊的介面
func GetFileMetaHandler(w http.ResponseWriter, r *http.Request) {
// 需要解析客戶端傳送請求的引數
r.ParseForm()
filehash := r.Form["filehash"][0] // filehash要與前端對應
// 獲取檔案元資訊物件
fMeta := meta.GetFileMeta(filehash)
// 轉成jsonString格式返回客戶端
data, err := json.Marshal(fMeta)
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
}
w.Write(data)
}
最後,記得到main.go註冊handler function
http.HandleFunc("/file/meta", handler.GetFileMetaHandler)
util\util.go 是一個工具包,提供計算檔案元資訊的函式。
本文來自部落格園,作者:Jayvee,轉載請註明原文連結:https://www.cnblogs.com/cenjw/p/16459817.html
上傳示例
- 任意上傳一張圖片
- 計算這張圖片的sha1值
- 檔案上傳成功後,訪問獲取檔案元資訊的介面
http://localhost:8080/file/meta?filehash=該檔案的sha1值