2016-03-30 21 views
0

Bir dosyayı Go yazılan bir istemciden ek olarak yüklemeye çalışıyorum. http multipart CreateFormFile kullanıyorum. Bunu yaptığımda, verileri vücudun hangi sunucunun reddettiği sunucuya gönderir.Git: http dosya yükleme

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() 
} 

Aynı kullanarak bukle çalıştığını bukle -X SONRASI -F "varlık = @ filepath" "çalıştığımda http://localhost/api/v1/xyz?filename=filename" Ben git ile anahtar = @ val işlevleri uygulayabilirsiniz nasıl

?

+0

İstemcide ne yaptığınızı gösteren kod nedir? –

+0

Kodda belirgin bir şey görmüyorum; gerçek POST isteğini/yanıtını charles gibi bir önleyici ile veya tcpdump ile yakaladınız ve curl tarafından oluşturulan istek/yanıtla karşılaştırdınız mı? –

+0

Yardımlarınız için teşekkürler. Başlığı kontrol ettim ve Content-Type uygulama/octet-stream olarak ayarlandı. – Puneet

cevap

0

Son olarak, CreateFormFile kodunu kontrol ettim ve Content-Type, mime başlığı ile uygulama/sekizli akışına kodlanmış. Aynı yöntemi kendi başıma yeniden geliştirdim ve işe yarıyor.

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) 
}