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 -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服务端读取指定文件并以附件形式返回给客户端。
服务端代码示例:提供文件下载的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如何实现文件上传下载的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号