2016-09-26 2 views
0

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) 

    ... 


    } 

Antwort

0

Sie sind nicht die Content-Type für die Anforderung einstellen. Selbst wenn der Header automatisch auf multipart/form-data gesetzt wird, fehlt die Datengrenze.

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

Danke JimB! Das war's! Ich wusste, dass es etwas Einfaches sein musste. : D – Stanley