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

Go语言实现文件上传下载主要依赖标准库中的net/http包,结合文件操作相关功能即可完成。下面分别介绍如何用Golang实现文件上传和下载功能。
文件上传(客户端到服务器)
实现文件上传需要一个HTTP服务端接收multipart/form-data格式的请求,然后将接收到的文件保存到本地。
服务端代码示例:处理文件上传的Handler:
package main
import (
"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 main
import (
"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服务端读取指定文件并以附件形式返回给客户端。
部分功能简介:商品收藏夹功能热门商品最新商品分级价格功能自选风格打印结算页面内部短信箱商品评论增加上一商品,下一商品功能增强商家提示功能友情链接用户在线统计用户来访统计用户来访信息用户积分功能广告设置用户组分类邮件系统后台实现更新用户数据系统图片设置模板管理CSS风格管理申诉内容过滤功能用户注册过滤特征字符IP库管理及来访限制及管理压缩,恢复,备份数据库功能上传文件管理商品类别管理商品添加/修改/
提供文件下载的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
安全与优化建议
实际应用中还需注意以下几点:
- 校验文件类型和扩展名,防止恶意上传
- 对上传目录做权限控制,避免执行危险文件
- 使用随机文件名或哈希命名,防止覆盖和路径遍历
- 添加身份验证中间件,确保只有授权用户可上传下载
- 大文件传输时考虑分块处理或支持断点续传









