Ich arbeite an einem API-Endpunkt in go, der einen Upload akzeptiert und dann sofort an eine andere API weiterleitet. Ich möchte die Datei nicht irgendwo auf die Festplatte schreiben, aber ich bin mir nicht sicher, ob ich die Datei vorübergehend im Speicher ablegen kann, so wie ich es auch getan habe. Alle Beispiele, die ich finden kann, befassen sich mit dem Speichern der Datei auf der Festplatte. Ich habe gepostet, was ich unten mache. Die Antwort, die ich von der zweiten API zurückbekomme, ist, dass ich keine Datei posten konnte, aber ich kann sehen, dass sie das Feld "userID" erhält. Kann jemand bitte darauf hinweisen, was ich falsch mache, sowie möglicherweise darauf hinweisen, dass dies der beste Weg ist, dies zu tun?Einen Datei-Upload weiterleiten
Strecke Handler
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})
}
Service-Handler
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)
...
}
Danke JimB! Das war's! Ich wusste, dass es etwas Einfaches sein musste. : D – Stanley