本文来自博客园,作者:Jayvee,转载请注明原文链接:https://www.cnblogs.com/cenjw/p/16459817.html

目录结构

  1. E:\goproj\FileStorageDisk
  2. main.go
  3. program.txt

  4. ├─handler
  5. handler.go

  6. ├─meta
  7. filemeta.go

  8. ├─static
  9. └─view
  10. index.html

  11. └─util
  12. util.go

文件元信息接口

文件元信息数据结构:meta\filemeta.go

点击查看代码
  1. package meta
  2. // FileMeta: 文件元信息结构
  3. type FileMeta struct {
  4. FileSha1 string // unique id
  5. FileName string
  6. FileSize int64
  7. Location string
  8. UploadAt string
  9. }
  10. // 存储每个上传文件的元信息,key是文件的FileSha1
  11. var fileMetas map[string]FileMeta
  12. // 初始化
  13. func init() {
  14. fileMetas = make(map[string]FileMeta)
  15. }
  16. // 接口1:更新或新增文件元信息
  17. func UpdateFileMeta(fmeta FileMeta) {
  18. fileMetas[fmeta.FileSha1] = fmeta
  19. }
  20. // 接口2:通过唯一标识获取文件的元信息对象
  21. func GetFileMeta(fsha1 string) FileMeta {
  22. return fileMetas[fsha1]
  23. }

本文来自博客园,作者:Jayvee,转载请注明原文链接:https://www.cnblogs.com/cenjw/p/16459817.html

获取文件元信息的接口

更新handler\handler.go

点击查看代码
  1. func UploadHandler(w http.ResponseWriter, r *http.Request) {
  2. if r.Method == "GET" {
  3. ...
  4. } else if r.Method == "POST" {
  5. ...
  6. defer file.Close()
  7. fileMeta := meta.FileMeta{
  8. FileName: head.Filename,
  9. Location: "/tmp/" + head.Filename,
  10. UploadAt: time.Now().Format("2006-01-02 15:04:05"),
  11. }
  12. // newfile, err := os.Create("/tmp/" + head.Filename)
  13. newfile, err := os.Create(fileMeta.Location)
  14. ...
  15. fileMeta.FileSize, err = io.Copy(newfile, file)
  16. if err != nil {
  17. fmt.Printf("Failed to save the data to file, err:%s\n", err.Error())
  18. return
  19. }
  20. newfile.Seek(0, 0) // 把文件句柄的位置移到开始位置
  21. fileMeta.FileSha1 = util.FileSha1(newfile) // 计算文件sha1值
  22. meta.UpdateFileMeta(fileMeta) // 更新文件元信息
  23. http.Redirect(w, r, "/file/upload/ok", http.StatusFound)
  24. }
  25. }
  26. // 获取文件元信息的接口
  27. func GetFileMetaHandler(w http.ResponseWriter, r *http.Request) {
  28. // 需要解析客户端发送请求的参数
  29. r.ParseForm()
  30. filehash := r.Form["filehash"][0] // filehash要与前端对应
  31. // 获取文件元信息对象
  32. fMeta := meta.GetFileMeta(filehash)
  33. // 转成jsonString格式返回客户端
  34. data, err := json.Marshal(fMeta)
  35. if err != nil {
  36. w.WriteHeader(http.StatusInternalServerError)
  37. }
  38. w.Write(data)
  39. }

> 本文来自博客园,作者:Jayvee,转载请注明原文链接:https://www.cnblogs.com/cenjw/p/16459817.html

最后,记得到main.go注册handler function

  1. http.HandleFunc("/file/meta", handler.GetFileMetaHandler)

util\util.go 是一个工具包,提供计算文件元信息的函数。

上传示例

  1. 任意上传一张图片

  2. 计算这张图片的sha1值

  3. 文件上传成功后,访问获取文件元信息的接口
  1. http://localhost:8080/file/meta?filehash=该文件的sha1值

Golang仿云盘项目-2.2 保留文件元信息的更多相关文章

  1. 项目附 - 云盘项目-分析echo.c

    分析FastCGI源码目录下example中echo.c代码: /* * echo.c -- * * Produce a page containing all FastCGI inputs * * ...

  2. PC 端 360 云盘初体验

    首先吐槽一下安装软件,文件名是 360wangpan,安装好后软件名称是"360云盘",好歹得统一下嘛,不然还以为下错了安装文件呢. 一般使用和其他网盘差不多,速度也还行,但还是没 ...

  3. (原创)高仿360云盘android端的UI实现

    前些日子几大互联网巨头展开了一轮网盘空间大战.一下子从G级别提高到了T级别.以后谁的空间没有1T估计都不好意思开口了~~~ 试用了一下360云盘的客户端,比较小清新(不是给360打广告~~~).刚好U ...

  4. CentOS 7 yum 安装ownCloud 搭建云盘服务器

    基于CentOS7.0 64位系统+ownCloud 10.0 稳定版本构建 ownCloud 是一个开源免费专业的私有云存储项目,它能帮你快速在个人电脑或服务器上架设一套专属的私有云文件同步网盘,可 ...

  5. 哭瞎!360云盘将关停,你的几十T照片和文件该怎么办

    IDO老徐刚得到了一个非常不开心的消息,360云盘将停止个人云盘服务...进行业务转型,在网盘存储.传播内容的合法性和安全性得到彻底解决之前不再考虑恢复,之后转型企业云服务. 而且之前共享的所有资料, ...

  6. 360云盘、百度云、微云……为什么不出 OS X(Mac 端)应用呢?(用户少,开发成本高)(百度网盘Mac版2016.10.18横空出世)

    已经说的很好了,现有的云盘所谓的 OS X 版只有云同步功能,不过 115 是个例外,不过 115 的现状……不言自明.接下来说点和本题答案无关的,其实在官方客户端流氓 + 限速的大背景下 OS X ...

  7. 使用Hadoop打造私有云盘之API操作

    项目介绍:使用hadoop实现云盘的增删读获取列表功能,hadoop不支持数据修改,特性是一次写入多次读取.主流的网盘也不支持该功能.今天我们用hdfs的FileSystem实现这些操作. 1.上传功 ...

  8. 挑战以Dropbox为代表的传统“同步网盘”,Seafile推出“分布式文件同步技术”打造的私有云服务

    挑战以Dropbox为代表的传统“同步网盘”,Seafile推出“分布式文件同步技术”打造的私有云服务#36氪开放日# 其他 JasonZheng • 2012-04-07 15:14 来自36氪开放 ...

  9. 基于Hadoop2.2.0版本号分布式云盘的设计与实现

    基于Hadoop2.2.0版本号分布式云盘的设计与实现 一.前言 在学习了hadoop2.2一个月以来,我重点是在学习hadoop2.2的HDFS.即是hadoop的分布式系统,看了非常久的源代码看的 ...

随机推荐

  1. Apache Flink系列-④有状态函数

    有状态函数:独立于平台的有状态无服务器堆栈   这是一种在现代基础设施上创建高效.可扩展且一致的应用程序的简单方法,无论规模大小.   有状态函数是一种API,它通过为无服务器架构构建的运行时简化了分 ...

  2. MySQL事务基本使用

    目录 1 事务概述 1.1 事务的支持情况 1.2 事务的特性 1.3 事务的状态 2 使用事务 2.1 显示事务 2.2 隐藏事务 3 事务隔离等级 3.1 数据并发问题 3.2 事务隔离等级介绍 ...

  3. 解决:Could not resolve dependencies for project xxx: Could not find artifact xxx

    引言 运行A module,找不到B module的依赖报错.A.B module都在project中. 报错信息 [INFO] Scanning for projects... [INFO] [IN ...

  4. Linux-ssh-key验证

    ssh登录验证方式介绍 ssh服务登录的常用验证方式 用户/口令 基于密钥 基于用户和口令登录验证 客户端发起ssh请求,服务器会把自己的公钥发送给用户 用户会根据服务器发来的公钥对密码进行加密 加密 ...

  5. 用漫画了解Linux内核到底长啥样

    一个执着于技术的公众号 原文链接:http://985.so/hRL6 往期精彩 ◆  干货 | 给小白的Nginx10分钟入门指南 ◆  什么是集群?看完这篇你就知道啦! ◆  干货 | Linux ...

  6. Bootstrap Blazor Table 组件(四)自定义列生成

    原文链接:https://www.cnblogs.com/ysmc/p/16223154.html Bootstrap Blazor 官方链接:https://www.blazor.zone/tabl ...

  7. go-micro集成链路跟踪的方法和中间件原理

    前几天有个同学想了解下如何在go-micro中做链路跟踪,这几天正好看到wrapper这块,wrapper这个东西在某些框架中也称为中间件,里边有个opentracing的插件,正好用来做链路追踪.o ...

  8. jQuery.extend()[$.extend()]

    jQuery.extend(target, object1[,objectN]);jQuery.extend([deep], target, object1[,objectN]);jQuery.ext ...

  9. JUC的数据库连接池小练习

    JUC练习数据库连接池实现 通过一个连接数组来充当连接池 一个原子的标记数组 通过cas来保持多线程下的安全,用synchronized来进行暂停和唤醒 @Slf4j public class MyC ...

  10. 最新版2022年任我行管家婆工贸版ERP M7 V22.0进销存财务生产管理软件网络版——云上的集团化制造管理系统

    在互联网+制造业的时代背景下,制造业在利用互联网技术进行转型升级的同时,也面临着供应链体系和生产模式的重塑,主要呈现出以下特点: 多元化发展 对外,传统企业正在通过"互联网+"逐步 ...