You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Go中通过POST请求的form-data发送Zip文件?

Go语言中通过form-data发送压缩文件的实现方案

问题描述

我需要在Go语言中通过POST请求的请求体以form-data键值对形式发送Zip文件,目前已经实现了发送未压缩文件的功能,代码片段如下:

buf := new(bytes.Buffer)
multiPartWriter := multipart.NewWriter(buf)
part, err := multiPartWriter.CreateFormFile("File", fileName)

但处理压缩文件时,找到的zip.Writer相关代码是这样的:

zipWriter := zip.NewWriter(buf)
zipFile, err := zipWriter.Create(fileName)

zip.Writer不像multipart.Writer那样提供键值对形式创建表单文件的选项,请问该如何实现Zip文件的发送?

原更新代码的问题

你提供的更新代码存在几处明显问题:

  • 完全忽略错误处理,生产环境中会导致问题难以排查
  • multiPartWriter.Close()仅在非压缩分支调用,压缩分支未执行会导致multipart表单不完整
  • 重复调用client.Do(request),会触发两次POST请求
  • 压缩后表单文件名未做区分,容易让服务端混淆文件类型

修正后的实现代码

import (
    "bytes"
    "compress/zip"
    "net/http"
)

func SendPostRequest(url string, content []byte, fileName string, doZip bool) (*http.Response, error) {
    buf := new(bytes.Buffer)
    multiPartWriter := multipart.NewWriter(buf)
    defer multiPartWriter.Close() // 确保multipart表单最终补全边界标识

    // 根据是否压缩调整表单中的文件名
    formFileName := fileName
    if doZip {
        formFileName += ".zip"
    }

    part, err := multiPartWriter.CreateFormFile("File", formFileName)
    if err != nil {
        return nil, err
    }

    if doZip {
        zipWriter := zip.NewWriter(part)
        defer zipWriter.Close() // 确保压缩文件写入结束标识

        zipFile, err := zipWriter.Create(fileName)
        if err != nil {
            return nil, err
        }
        _, err = zipFile.Write(content)
        if err != nil {
            return nil, err
        }
    } else {
        _, err = part.Write(content)
        if err != nil {
            return nil, err
        }
    }

    request, err := http.NewRequest(http.MethodPost, url, buf)
    if err != nil {
        return nil, err
    }

    // 设置正确的Content-Type,包含multipart边界信息
    request.Header.Set("Content-Type", multiPartWriter.FormDataContentType())

    client := &http.Client{}
    return client.Do(request)
}

关键逻辑说明

  • 嵌套Writer设计:将multipart.Writer创建的表单字段part作为zip.Writer的输出目标,压缩后的内容会直接写入form-data的对应键值对中,完美适配form-data格式要求
  • 资源自动释放:用defer确保所有Writer都被正确关闭,避免数据截断或表单格式错误
  • 文件名优化:压缩时自动给表单文件名添加.zip后缀,让服务端能直接识别文件类型
  • 完善错误处理:捕获所有可能的错误并返回,便于调试和问题定位

内容的提问来源于stack exchange,提问作者Pramit Pakhira

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 07:55:20