2016-03-30 4 views
0

Goで書かれたクライアントから添付ファイルとしてファイルをアップロードしようとしています。 http multipart CreateFormFileを使用しています。私がこれを行うとき、それはサーバーの拒否するサーバーに本体のデータを送信します。Go:httpファイルアップロード

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

私はそれを用いたカールそれが動作 カール-X POST -F "資産= @ファイルパスを" "しようとするとhttp://localhost/api/v1/xyz?filename=filename" 私が行くと、キー= @ valの機能を実装するにはどうすればよい

+0

お客様がクライアントで行っていることを示すコードですか? –

+0

私はコードに何も明白ではありません。あなたはcharlesやtcpdumpのようなインターセプタを使って実際のPOSTリクエスト/レスポンスを取得し、curlによって生成されたリクエスト/レスポンスと比較しましたか? –

+0

ご協力ありがとうございます。私はヘッダーをチェックし、Content-Typeはapplication/octet-streamとして設定されています。 – Puneet

答えて

0

最後に、CreateFormFileのコードをチェックし、Content-Typeはmimeヘッダーを使用してapplication/octet-streamにハードコードされています。私は自分自身で同じメソッドを再実装しています。

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) 
} 
関連する問題