利用net/http库及gorilla/mux库实现了一个简单的文件上传服务,
示例如下:

package mainimport ("fmt""github.com/gorilla/mux""io""net/http""os"
)const uploadHTML = `
<html>  <head>  <title>选择文件</title></head>  <body>  <form enctype="multipart/form-data" action="/" method="post">  <input type="file" name="uploadfile" />  <input type="submit" value="上传文件" />  </form>  </body>
</html>`const destLocalPath = "/data/files/"func index(w http.ResponseWriter, r *http.Request) {w.Write([]byte(uploadHTML))
}func upload(w http.ResponseWriter, r *http.Request) {if r.Method == "GET" {index(w, r)return}r.ParseMultipartForm(32 << 20) // max memory is set to 32MBclientfd, handler, err := r.FormFile("uploadfile")if err != nil {fmt.Println(err)w.Write([]byte("upload failed."))return}defer clientfd.Close()localpath := fmt.Sprintf("%s%s", destLocalPath, handler.Filename)localfd, err := os.OpenFile(localpath, os.O_WRONLY|os.O_CREATE, 0666)if err != nil {fmt.Println(err)w.Write([]byte("upload failed."))return}defer localfd.Close()io.Copy(localfd, clientfd)w.Write([]byte("upload finish."))
}func newRouter() http.Handler {hdl := mux.NewRouter()hdl.HandleFunc("/", upload)return hdl
}func main() {http.ListenAndServe(":8877", newRouter())
}

假如需要在接收文件的时候计算文件hash值, 应该如何做呢?
根据io.TeeReader库,可以在文件上传过程中自动计算hash值, 完整代码修改为:

package mainimport ("crypto/sha1""encoding/hex""fmt""github.com/gorilla/mux""io""net/http""os"
)const uploadHTML = `
<html>  <head>  <title>选择文件</title></head>  <body>  <form enctype="multipart/form-data" action="/" method="post">  <input type="file" name="uploadfile" />  <input type="submit" value="上传文件" />  </form>  </body>
</html>`const destLocalPath = "/data/files/"func index(w http.ResponseWriter, r *http.Request) {w.Write([]byte(uploadHTML))
}func upload(w http.ResponseWriter, r *http.Request) {if r.Method == "GET" {index(w, r)return}r.ParseMultipartForm(32 << 20) // max memory is set to 32MBclientfd, handler, err := r.FormFile("uploadfile")if err != nil {fmt.Println(err)w.Write([]byte("upload failed."))return}defer clientfd.Close()localpath := fmt.Sprintf("%s%s", destLocalPath, handler.Filename)localfd, err := os.OpenFile(localpath, os.O_WRONLY|os.O_CREATE, 0666)if err != nil {fmt.Println(err)w.Write([]byte("upload failed."))return}defer localfd.Close()// 利用io.TeeReader在读取文件内容时计算hash值fhash := sha1.New()io.Copy(localfd, io.TeeReader(clientfd, fhash))hstr := hex.EncodeToString(fhash.Sum(nil))w.Write([]byte(fmt.Sprintf("upload finish:%s", hstr)))
}func newRouter() http.Handler {hdl := mux.NewRouter()hdl.HandleFunc("/", upload)return hdl
}func main() {http.ListenAndServe(":8877", newRouter())
}

[golang]简单文件上传服务相关推荐

  1. 如何基于OSS和MPS,快速搭建音视频文件上传服务?

    背景 本文主要介绍如何基于OSS服务和MPS的上传SDK,快速搭建一个音视频文件上传服务. 优势 使用MPS的上传SDK上传音视频文件,具有以下优势: 增加文件列表管理功能. 增加STS Token ...

  2. 如何基于OSS和MTS,快速搭建音视频文件上传服务?

    摘要: 背景 本文主要介绍如何基于OSS服务和MTS的上传SDK,快速搭建一个音视频文件上传服务. 优势 使用MTS的上传SDK上传音视频文件,具有以下优势: 增加文件列表管理功能. 增加STS To ...

  3. [NodeJS] 使用Express multer搭建文件上传服务

    1. 搭建Express项目 安装express npm install express 创建express项目,以下app-server为项目名 express app-server cd 进入ap ...

  4. 二阶段补充:文件上传服务端处理,后端文件上传、前端两种文件上传方式

    1.文件上传 2.后端文件上传 两种方案: 兼容性较好的commons-fileupload,支持所有版本的Servlet,即所有版本的Tomcat 优点: 兼容性 缺点 需要外部jar,比较麻烦.代 ...

  5. salesforce 零基础学习(四十二)简单文件上传下载

    项目中,常常需要用到文件的上传和下载,上传和下载功能实际上是对Document对象进行insert和查询操作.本篇演示简单的文件上传和下载,理论上文件上传后应该将ID作为操作表的字段存储,这里只演示文 ...

  6. Tornado web开发之简单文件上传

    1.介绍 我们知道,在web开发过程中,文件上传是经常用到的功能,比如上传附件,上传照片等 下面我们来介绍一下利用tornado 来实现文件上传功能 2.代码 由于实现文件上传的表单很简单,只需要几行 ...

  7. 带有进度报告的Angular 9/8多文件上传服务

    目录 先决条件 第1步-创建Angular服务 第2步-实现上传方法 结论 先决条件 我们将仅看到如何实现用于发送POST请求以上传文件和侦听进度事件的服务,但是我们不会从头开始创建项目,因此您需要安 ...

  8. springboot---fastDFS 简单文件上传/下载/删除

    本来想简单的记录一下上传/下载,后来看着看着,发现这块的知识点太多.就记录下简单的操作,后面在补充 这里采用fastdfs分布式文件系统的形式来进行操作的(关于fastdfs的知识点有很多,这里就不赘 ...

  9. html引入axios文件,axios实现简单文件上传功能

    axios实现简单文件上传功能 发布时间:2020-10-08 16:59:37 来源:脚本之家 阅读:144 作者:pia_082 本文实例为大家分享了axios实现文件上传功能的具体代码,供大家参 ...

最新文章

  1. 学python要考什么证-这十个Python常用库,学习Python的你必须要知道!
  2. linux父子进程之间之间的区别与联系
  3. 阿里云安全送您六道平安符,恭贺新春!
  4. python开发工具管理系统_Python之软件管理
  5. action中写php函数,WordPress中add_action(将函数连接到指定action)
  6. 深入浅出Win32多线程程序设计之线程通信
  7. bzoj1211 [HNOI2004]树的计数 prufer序列+组合数
  8. fastjson将json字符串转化成map的五种方法
  9. 计算机算法需要什么数学知识,计算机编程算法和数学有什么关系?
  10. 世界各国国家代号与区号
  11. 导出excel 手动拼装复杂表头
  12. java 统计数字个数_JAVA统计数字个数
  13. 打造个性QQ,适合网吧做自己安全的QQ
  14. java作为微信小程序的后端_微信小程序连接java后端
  15. 同里古镇百年古建筑深夜被毁
  16. c#filestream与streamwriter用法
  17. 郝健: Linux内存管理学习笔记-第3节课
  18. P1475智力大冲浪,详细的解题思路
  19. 总结二十:程序员激励的基本因素
  20. 2022-2028全球自动车道警告系统行业调研及趋势分析报告

热门文章

  1. 一文回顾 Java 入门知识(上)
  2. iPhone 14 全系售价及配置曝光,绝了!
  3. 暖火柴打一数字_火柴里的天堂
  4. 全球及中国泵真空系统行业发展战略与十四五布局规划报告2022版
  5. 西南科技大学计算机综合大纲,西南科技大学(专业学位)计算机技术研究生考试科目和考研参考书目...
  6. 零基础学3D建模难不难?
  7. knex.js中文文档
  8. UVALive6578-Trending Topic
  9. Linux开机自启动挂盘以及进入紧急模式的解决办法
  10. 测试硬盘软件hd不能结束进程,终于解决了HD TUNE以及所有其他硬盘检测工具都不能使用的情况。。...