Go 语言上传文件需用 net/http 和 mime/multipart 构造 multipart/form-data 请求:先创建表单、写文本字段、用 CreateFormFile 添加文件(传原始文件名)、设置 Content-Type 为 FormDataContentType(),再发送请求并处理响应。

Go 语言上传文件到 HTTP 服务器,核心是使用 net/http 和 mime/multipart 包构造 multipart/form-data 请求。关键在于正确创建表单、写入文件字段、设置 Content-Type,并处理响应。
构建 multipart 表单并写入文件
先用 multipart.Writer 创建表单,调用 WriteField 写普通字段(如 token),再用 CreateFormFile 创建文件字段——它会自动写入 Content-Disposition 头和文件名。注意:文件名必须是原始文件名(非路径),否则服务端可能解析失败。
- 打开本地文件:
f, err := os.Open("report.pdf") - 创建表单:
w := multipart.NewWriter(buf) - 写文本字段:
w.WriteField("user_id", "123") - 创建文件字段:
fw, _ := w.CreateFormFile("file", "report.pdf") - 拷贝内容:
io.Copy(fw, f)
发起 POST 请求并设置 Header
将表单数据(buf.Bytes())作为请求体,用 http.Post 或 http.Client.Do 发送。务必设置 Content-Type 为 w.FormDataContentType(),这是 multipart 的边界字符串(boundary)所在,不能手写或硬编码。
- 获取正确的类型:
contentType := w.FormDataContentType() - 构造请求:
req, _ := http.NewRequest("POST", "https://api.example.com/upload", buf) - 设置头:
req.Header.Set("Content-Type", contentType) - 发送:
client := &http.Client{}; resp, err := client.Do(req)
处理服务端响应与错误
检查 resp.StatusCode 是否为 200/201;读取响应体前确保 resp.Body 被关闭;若服务端返回 JSON,可用 json.Decode 解析。常见错误包括:400(表单字段名不匹配)、413(文件超限)、500(服务端异常)。
支付宝账户登录ecshop插件简介: 先向支付宝申请支付接口,拿到合作身份者ID和安全检验码这两个东西。 把login整个文件夹传到服务器上ecshop安装所在的目录,如果路径不对可以会导致使用失败。 需要修改的文件:alipay_config.php return_url.php可以修改第30行的邮箱域名为你的网站域名。 别的不用改,否则会导致无法使用。
立即学习“go语言免费学习笔记(深入)”;
- 延迟关闭:
defer resp.Body.Close() - 读取结果:
body, _ := io.ReadAll(resp.Body) - 判断状态:
if resp.StatusCode != http.StatusOK { log.Fatal("upload failed:", resp.Status) }
上传多个文件或混合字段的技巧
同一个表单可多次调用 CreateFormFile 添加多个文件,字段名可相同(如 "files")以支持数组式接收;也可混用 WriteField 和 CreateFormField 传结构化数据(如 JSON 字符串)。
- 多文件同名:
w.CreateFormFile("files", "a.jpg"); w.CreateFormFile("files", "b.png") - 传 JSON 元数据:
w.WriteField("meta", `{"desc":"test","tags":["go"]}`) - 避免内存爆炸:大文件建议用
io.Pipe流式上传,而非全部加载进bytes.Buffer
基本上就这些。Golang 文件上传不复杂但容易忽略 boundary 和字段名一致性,只要表单构造正确、Content-Type 匹配、服务端接口文档对得上,成功率很高。









