当前位置: 首页 > news >正文

Go语言操作文件上传和下载应用教程

Go语言操作文件上传和下载应用教程

我们在使用Go的日常开发中,经常会遇到对文件的处理,例如:上传、下载、读写等(详情见Go 文件操作基本方法大全),且我们在实际应用中,基本都是使用框架自带的文件处理功能,但是在熟悉一个语言的过程中,我们有时更应该关注原生底层实现的原理,了解这个语言底层是如何实现的,所以接下来我们来了解一下,文件上传和下载用原生库来实现上述功能,本文将详细介绍如何使用Go标准库中的net/http包来实现文件的上传和下载功能。
在这里插入图片描述

一、文件上传

使用WEB端做示例,在WEB端中文件上传通常通过HTTP的POST请求完成,请求中包含multipart/form-data类型的表单数据。

1. HTML 表单设计

首先,你需要一个HTML表单来允许用户选择文件并上传。这个表单的enctype属性必须设置为multipart/form-data

<form action="/upload" method="post" enctype="multipart/form-data"><input type="file" name="file" /><input type="submit" value="Upload" />
</form>
2. Go 服务器处理

在Go的HTTP服务器中,你需要处理/upload路由,并读取表单中的文件数据。

package mainimport ("fmt""io""net/http""os"
)func uploadHandler(w http.ResponseWriter, r *http.Request) {// 设置最大内存大小err := r.ParseMultipartForm(32 << 20) // 32 MBif err != nil {http.Error(w, err.Error(), http.StatusBadRequest)return}// 获取文件file, handler, err := r.FormFile("file")if err != nil {http.Error(w, err.Error(), http.StatusBadRequest)return}defer file.Close()// 创建本地文件f, err := os.Create(handler.Filename)if err != nil {http.Error(w, err.Error(), http.StatusInternalServerError)return}defer f.Close()// 复制文件内容_, err = io.Copy(f, file)if err != nil {http.Error(w, err.Error(), http.StatusInternalServerError)return}fmt.Fprintf(w, "File uploaded successfully")
}func main() {http.HandleFunc("/upload", uploadHandler)http.ListenAndServe(":8080", nil)
}

在这个例子中,服务器首先调用r.ParseMultipartForm来解析请求中的表单数据,然后使用r.FormFile获取文件句柄。文件被存储在服务器的指定路径下。

二、文件下载

文件下载通常通过HTTP的GET请求完成,服务器返回文件内容并设置相应的HTTP头信息。

Go 服务器处理

在Go的HTTP服务器中,你需要处理特定的路由,读取本地文件,并将其内容发送给客户端。

package mainimport ("fmt""io""net/http""os"
)func downloadHandler(w http.ResponseWriter, r *http.Request) {// 设置文件名和文件路径fileName := "test.txt"filePath := "./" + fileName// 打开文件file, err := os.Open(filePath)if err != nil {http.Error(w, err.Error(), http.StatusInternalServerError)return}defer file.Close()// 设置响应头w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=%s", fileName))w.Header().Set("Content-Type", "text/plain")// 发送文件内容_, err = io.Copy(w, file)if err != nil {http.Error(w, err.Error(), http.StatusInternalServerError)return}
}func main() {http.HandleFunc("/download", downloadHandler)http.ListenAndServe(":8080", nil)
}

在这个例子中,服务器设置了响应头中的Content-Dispositionattachment,以指示浏览器下载文件,而不是尝试打开它。然后,服务器读取本地文件的内容,并将其写入响应体中。

三、总结

本文介绍了如何在Go语言中使用net/http包来实现文件的上传和下载功能。通过HTML表单上传文件,并在Go的HTTP服务器中处理文件存储和发送逻辑。对于下载,通过设置HTTP响应头并发送文件内容来触发浏览器下载文件。


http://www.mrgr.cn/news/9108.html

相关文章:

  • 微服务基础与Spring Cloud框架
  • LlamaIndex 实现 RAG(三)- 向量数据
  • PostgreSQL16.1(Linux版本离线下载)
  • OpenAI 重回巅峰:ChatGPT-4O 最新模型超越谷歌 Gemini 1.5,多项测试夺冠!
  • RongCallKit iOS 端本地私有 pod 方案
  • docker手动部署django项目Dockerfile编排-后端发布
  • HTML静态网页成品作业(HTML+CSS)——家乡漳州介绍设计制作(1个页面)
  • 如何知道当前网卡连接的下位机的IP,通过工具实现
  • python异步编程-channels使用,创建websocket服务
  • 尚品汇-选中状态缓存变更、删除缓存购物车(三十八)
  • 案例分享—医疗行业国外优秀界面设计案例
  • 趣味算法------煤球数目
  • 关闭Chrome快捷键
  • 回归分析系列11—时间序列数据中的回归
  • 海思SD3403/SS928V100开发(16)Tsensor驱动开发
  • 两种Python进行cpu并行运算的方式
  • 笔试题(9)
  • C++深入剖析智能指针
  • 【PyTorch】关于Transforms的简单使用
  • 解决MySQL的PacketTooBigException异常问题