2016-09-26 48 views
0

我正在研究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) 

    ... 


    } 

回答

0

你不設置Content-Type的請求。即使標題自動設置爲multipart/form-data,它仍然缺少數據邊界。

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

謝謝JimB!就是這樣!我知道這一定很簡單。 :d – Stanley