Golang仿雲盤項目-2.2 文件查詢資訊介面

本文來自部落格園,作者:Jayvee,轉載請註明原文鏈接://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,轉載請註明原文鏈接://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,轉載請註明原文鏈接://www.cnblogs.com/cenjw/p/16459817.html

上傳示例

  1. 任意上傳一張圖片
    image
  2. 計算這張圖片的sha1值
    image
  3. 文件上傳成功後,訪問獲取文件元資訊的介面
//localhost:8080/file/meta?filehash=該文件的sha1值

image