Golang仿雲盤專案-2.2 檔案查詢資訊介面

2022-07-09 21:00:29

本文來自部落格園,作者: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

上傳範例

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