2016-03-30 18 views
0

Ich versuche, eine Datei als Anhang von einem Client hochgeladen in Go geschrieben. Ich verwende http Multipart CreateFormFile. Wenn ich dies tue, sendet es die Daten im Körper an den Server, den der Server ablehnt.Go: http-Datei-Upload

file, err := os.Open(*img.Filepath) 
if err != nil { 
    return err 
} 

defer file.Close() 

body := &bytes.Buffer{} 
writer := multipart.NewWriter(body) 
part, err := writer.CreateFormFile("asset", filepath.Base(*img.Filepath)) 
if err != nil { 
    return err 
} 
_, err = io.Copy(part, file) 
if err != nil { 
    return err 
} 

contentType := writer.FormDataContentType() 
err = writer.Close() 
if err != nil { 
    return err 
} 

request, err := http.NewRequest("POST", API_URL, body) 
if err != nil { 
    return err 
} 

request.Header.Set("Content-Type", contentType) 

values := request.URL.Query() 
values.Add("filename", util.GetFileNameWithoutExtension(*img.FileName)) 
request.URL.RawQuery = values.Encode() 
client := &http.Client{} 
resp, err := client.Do(request) 
if err != nil { 
    return err 
} else { 
    respBody := &bytes.Buffer{} 
    _, err = respBody.ReadFrom(resp.Body) 
    if err != nil { 
     return err 
    } 
    resp.Body.Close() 
} 

Wenn ich versuche, das gleiche mit curl es funktioniert curl -X POST -F "Asset = @ Filepath" "http://localhost/api/v1/xyz?filename=filename"

Wie kann ich key = @ val Funktionalität mit Go implementieren?

+0

Code, der zeigt, was Sie im Kunden tun? –

+0

Ich sehe nichts im Code offensichtlich; Haben Sie die tatsächliche POST-Anfrage/-Antwort mit einem Interzeptor wie Charles oder mit tcpdump erfasst und mit der von curl erzeugten Anfrage/Antwort verglichen? –

+0

Danke für Ihre Hilfe. Ich habe den Header überprüft und Content-Type wird als application/octet-stream gesetzt. – Puneet

Antwort

0

Endlich habe ich den Code für CreateFormFile überprüft und der Content-Type ist fest in Application/Octet-Stream mit dem Mime-Header codiert. Ich habe dieselbe Methode selbst implementiert und es funktioniert.

func CreateFormFile(w *multipart.Writer, fieldname string, filename string)  (io.Writer, error) { 
    h := make(textproto.MIMEHeader) 
    h.Set("Content-Disposition", fmt.Sprintf(`form-data; name="%s"; filename="%s"`, escapeQuotes(fieldname), escapeQuotes(filename))) 
    h.Set("Content-Type", "image/jpeg") 
    return w.CreatePart(h) 
}