http - 转发文件上传

标签 http file-upload go multipartform-data

我正在使用 go 开发一个 api 端点,它将接受上传,然后立即转发到另一个 API。我不想将文件写入任何地方的磁盘,但我不确定将文件临时存储在内存中的方式是否正确。我能找到的所有示例都涉及将文件保存到磁盘。我已经在下面发布了我正在做的事情。我从第二个 API 得到的响应是我未能发布文件,但我可以看到它正在接收“userID”字段。有人可以指出我做错了什么,并可能建议这是否是解决此问题的最佳方法吗?

路由处理器

func (r *Routes) forwardFile(w http.ResponseWriter, req *http.Request){ 
    parameters := mux.Vars(req)
    userID := parameters["userID"]

    const maxFileSize = 1 * 1024 * 1024 // 1MB

    // pull in the uploaded file into memory
    req.ParseMultipartForm(maxFileSize)


    file, fileHeader, err := req.FormFile("fileUpload")
    if err != nil {
        encodeResponse(w, req, response{obj: nil, err: err})
        return
    }
    defer file.Close()

    success, err := service.DoForwardFile(userID, file, fileHeader)
    encodeResponse(w, req, response{obj: success, err: err})
}

服务处理器

func (b *base) DoForwardFile(userID int, file multipart.File, fileHeader *multipart.FileHeader) (FileForwardedResponse, error) {
    // start building our request to forward the file
    var resp *http.Response
    defer func() {
        if resp != nil {
            resp.Body.Close()
        }
        reportStat.Complete(0)
    }()

    // build a form body
    body := &bytes.Buffer{}
    bodyWriter := multipart.NewWriter(body)

    // add form fields
    bodyWriter.WriteField("userID", userID)

    // add a form file to the body
    fileWriter, err := bodyWriter.CreateFormFile("fileUpload", fileHeader.Filename)
    if err != nil {
        return FileForwardedResponse{}, err
    }
    // copy the file into the fileWriter
    _, err = io.Copy(fileWriter, file)
    if err != nil {
        return FileForwardedResponse{}, err
    }

    // Close the body writer
    bodyWriter.Close()

    // build request url
    apiURL := fmt.Sprintf("%s/v2/users/%d/files", config.APIURL, userID)

    // send request
    client := &http.Client{Timeout: time.Second * 10}
    req, err := http.NewRequest("POST", apiURL, body)
    resp, err = client.Do(req)

    ... 


  }

最佳答案

您没有为请求设置 Content-Type。即使 header 自动设置为 multipart/form-data,它也缺少数据边界。

req, err := http.NewRequest("POST", uri, body)
if err != nil {
    return FileForwardedResponse{}, err
}
req.Header.Set("Content-Type", bodyWriter.FormDataContentType())
...

关于http - 转发文件上传,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39713441/

相关文章:

javascript - JQuery Fileupload 带有表单数据并且只有单个文件

go - Golearn模型对自变量(预测变量)和目标(预测变量)是隐式的

ajax - HTTP 请求在 Chrome 版本 48 中无响应

http - 托管在不同 Web 服务器上的 HTTP 请求对象的 TCP 连接

php - 发出请求并处理可​​续传上传的响应 : Google Drive api [php]

go - 有没有办法从 https ://www. 重定向。到 https ://. 。在围棋?

google-app-engine - 如何验证 JWT 签名?

c - libcurl http get json 格式的请求

json - Dart 中的通用约束

php - 通过AJAX上传文件