2016-09-26 12 views
0

私は、アップロードを受け入れ、すぐに別のAPIに転送するgoのapiエンドポイントで作業しています。私はどこにでもファイルを書きたいとは思っていませんが、私が持っている方法でファイルを一時的にメモリに保存するのは間違いです。私が見つけることができるすべての例は、ファイルをディスクに保存することに取り組んでいます。私は以下のことを投稿しました。私が2番目の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

Thanks JimB!それだった!私はそれが何か簡単でなければならないことを知っていた。 :D – Stanley

関連する問題