ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Golang仿云盘项目-2.2 保留文件元信息

2022-07-09 20:02:59  阅读:188  来源: 互联网

标签:文件 http string err 云盘 Golang meta go 2.2


本文来自博客园,作者: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. 任意上传一张图片
    image
  2. 计算这张图片的sha1值
    image
  3. 文件上传成功后,访问获取文件元信息的接口
http://localhost:8080/file/meta?filehash=该文件的sha1值

image

标签:文件,http,string,err,云盘,Golang,meta,go,2.2
来源: https://www.cnblogs.com/cenjw/p/16459817.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有