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)
...
}
Thanks JimB!それだった!私はそれが何か簡単でなければならないことを知っていた。 :D – Stanley