2017-06-18 48 views
0

我正嘗試將照片上傳到Twitter。我創建了一個多部分作家並使用該名爲媒體創建了一個文件字段,但是當我向Twitter發送我的請求時,它一直在響應缺少的媒體字段。 我錯過了什麼嗎? 這裏是我的代碼多部分文件字段不可讀

f, err := os.Open("/Users/nikos/Desktop/test.png") 
errored: 
    if nil != err { 
     fmt.Println(err) 
     return 
    } 
    var img = new(bytes.Buffer) 
    enc := base64.NewEncoder(base64.StdEncoding, img) 
    _, err = io.Copy(enc, f) 
    if nil != err { 
     goto errored 
    } 
    body := new(bytes.Buffer)//Multipart body 
    writer := multipart.NewWriter(body) 
    cl, err := twitter.OauthClient.MakeHttpClient(&oauth.AccessToken{ 
     Token: "xxx", 
     Secret: "yyy", 
    }) 
    err = writer.WriteField("media_data", img.String())//base64 version of the image (i tried both binary and base64 versions neither will work) 
    if nil != err { 
     goto errored 
    } 
    part, err := writer.CreateFormFile("media", "test.png")//actual binary file multiparted and it is named media. 
    if nil != err { 
     goto errored 
    } 
    _, err = io.Copy(part, f) 
    if nil != err { 
     goto errored 
    } 
    req, err := http.NewRequest("POST", 
     "https://upload.twitter.com/1.1/media/upload.json", 
     body) 
    if nil != err { 
     goto errored 
    } 
    res, err := cl.Do(req) 
    if nil != err { 
     goto errored 
    } 
//and twitter responds that there is no field attached named media 
    _, err = io.Copy(os.Stdout, res.Body) 
    fmt.Println(res) 
    if nil != err { 
     goto errored 
    } 
+0

你看到了什麼錯誤? –

+0

@CeriseLimón我一次發送一個,只是在這裏我寫在一起,但生病嘗試關閉作家,如果我設置內容類型我得到一個錯誤的請求錯誤,讓我試試關閉作家 – nikoss

+0

@YandryPozo'{「errors」: [{「code」:38,「message」:「media parameter is missing。」}]}&{400 Bad Request 400'這是我得到的錯誤 – nikoss

回答

2

更新:剛纔提到Twitter API Upload parameter。根據您的代碼段,您使用的字段爲mediamedia_data。你必須使用只有一個 -

  • 上傳使用Base64 - >字段名是media_data
  • 上傳使用原始 - >字段名是media

而且,你必須添加Content-Type頭。

req, err := http.NewRequest("POST", 
    "https://upload.twitter.com/1.1/media/upload.json", 
    body) 
req.Header.Set("Content-Type", writer.FormDataContentType()) 
if err := writer.Close(); err != nil { 
    log.Println(err) 
} 
// Now fire the http request 

PS:在撰寫的答案,在30秒的差距,@櫻桃色 - 利蒙添加評論,也關閉多作家由@櫻桃色 - 利蒙提及。


當被問及在註釋:

的Twitter應用程序接受/八位字節流,你可能不需要下面的方法。

添加用戶提供的多部件Content-Type而不是application/octet-stream。基本上你必須和你的內容類型一樣實現與便捷包裝相同的實現。

writer := multipart.NewWriter(body) 
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/png") 
part, err := writer.CreatePart(h) 
// use part same as before 

定義escapeQuotes從多部分包裝。

var quoteEscaper = strings.NewReplacer("\\", "\\\\", `"`, "\\\"") 
func escapeQuotes(s string) string { 
    return quoteEscaper.Replace(s) 
} 
+0

哇,它像手工輸入的多部分/形式-data之前沒有成功,我猜測關鍵輸出'writer.FormContentType()' 謝謝。 任何機會,你可能有任何線索設置文件的類型爲image/png而不是application/octet-stream? @jeevatkm – nikoss

+0

是的,你可以。我會將其添加到答案中。 – jeevatkm

+0

謝謝@jeevatkm – nikoss