Go语言通过net/http包实现文件上传下载,服务端使用multipart/form-data接收文件并保存,客户端可通过curl或Go程序发送请求;2. 下载功能由服务端读取文件并设置Content-Disposition响应头触发浏览器下载;3. 实际应用需校验文件类型、使用随机命名、添加权限控制和身份验证以提升安全性。

Go语言实现文件上传下载主要依赖标准库中的net/http包,结合文件操作相关功能即可完成。下面分别介绍如何用Golang实现文件上传和下载功能。
文件上传(客户端到服务器)
实现文件上传需要一个HTTP服务端接收multipart/form-data格式的请求,然后将接收到的文件保存到本地。
服务端代码示例:
处理文件上传的Handler:
package mainimport ( "io" "net/http" "os")func uploadHandler(w http.ResponseWriter, r *http.Request) { if r.Method != "POST" { http.Error(w, "只支持POST方法", http.StatusMethodNotAllowed) return } // 限制上传大小(例如10MB) r.ParseMultipartForm(10 << 20) file, handler, err := r.FormFile("file") if err != nil { http.Error(w, "获取文件失败", http.StatusBadRequest) return } defer file.Close() // 创建本地文件用于保存 dst, err := os.Create("./uploads/" + handler.Filename) if err != nil { http.Error(w, "创建文件失败", http.StatusInternalServerError) return } defer dst.Close() // 将上传的文件内容拷贝到本地文件 _, err = io.Copy(dst, file) if err != nil { http.Error(w, "保存文件失败", http.StatusInternalServerError) return } w.WriteHeader(http.StatusOK) w.Write([]byte("文件上传成功: " + handler.Filename))}func main() { // 确保上传目录存在 os.MkdirAll("./uploads", os.ModePerm) http.HandleFunc("/upload", uploadHandler) http.ListenAndServe(":8080", nil)}
客户端上传示例(使用curl或Go程序):
使用curl测试:
立即学习“go语言免费学习笔记(深入)”;
curl -X POST -F "file=@/path/to/local/file.txt" http://localhost:8080/upload
或者使用Go编写客户端:
package mainimport ( "bytes" "fmt" "io" "mime/multipart" "net/http" "os")func uploadFile(filepath, url string) error { file, err := os.Open(filepath) if err != nil { return err } defer file.Close() body := &bytes.Buffer{} writer := multipart.NewWriter(body) part, _ := writer.CreateFormFile("file", filepath) io.Copy(part, file) writer.Close() req, _ := http.NewRequest("POST", url, body) req.Header.Set("Content-Type", writer.FormDataContentType()) client := &http.Client{} res, err := client.Do(req) if err != nil { return err } defer res.Body.Close() response, _ := io.ReadAll(res.Body) fmt.Println(string(response)) return nil}func main() { uploadFile("./test.txt", "http://localhost:8080/upload")}
文件下载(服务器到客户端)
实现文件下载是让HTTP服务端读取指定文件并以附件形式返回给客户端。
服务端代码示例:
提供文件下载的Handler:
func downloadHandler(w http.ResponseWriter, r *http.Request) { filename := r.URL.Query().Get("file") if filename == "" { http.Error(w, "缺少文件名参数", http.StatusBadRequest) return } filepath := "./uploads/" + filename // 检查文件是否存在 if _, err := os.Stat(filepath); os.IsNotExist(err) { http.Error(w, "文件不存在", http.StatusNotFound) return } // 设置响应头,触发浏览器下载 w.Header().Set("Content-Disposition", "attachment; filename="+filename) w.Header().Set("Content-Type", "application/octet-stream") // 读取并发送文件 http.ServeFile(w, r, filepath)}
http.HandleFunc("/download", downloadHandler)
客户端下载方式:
可以直接通过浏览器访问:http://localhost:8080/download?file=test.txt
或使用curl命令:curl -O http://localhost:8080/download?file=test.txt
安全与优化建议
实际应用中还需注意以下几点:
校验文件类型和扩展名,防止恶意上传对上传目录做权限控制,避免执行危险文件使用随机文件名或哈希命名,防止覆盖和路径遍历添加身份验证中间件,确保只有授权用户可上传下载大文件传输时考虑分块处理或支持断点续传基本上就这些。Golang标准库已经足够支撑基础的文件上传下载功能,开发效率高且运行稳定。
以上就是Golang如何实现文件上传下载的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1410927.html
微信扫一扫
支付宝扫一扫