2017-06-18 12 views
0

Twitterに写真をアップロードしようとしています。私はマルチパートライターを作成し、その名前のメディアを使用してファイルフィールドを作成しますが、私がTwitterにリクエストを送信すると、メディアフィールドの不足に応答しています。 何か不足していますか?ただ、Twitter API Upload parameterを呼ば:ここに は私のコードはマルチパートファイルフィールドが読み取れません

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私は一度に1つずつ送信しましたが、一緒に書きましたが、作者を閉じようとしました。コンテンツタイプを設定すると、悪いリクエストエラーが発生しました。私はライターを閉じてみます。 – nikoss

+0

@YandryPozo '{" errors " }}}&{400 Bad Request 400}これは私が受け取るエラーです – nikoss

答えて

2

アップデートです。コードスニペットごとに、フィールドmediamedia_dataの両方を使用しています。 BASE64を使用して

  • アップロード - - >フィールド名が生を使用してmedia_data
  • アップロードです - >フィールド名は、Content-Typeヘッダを追加する必要がmedia

そして、ある1つだけを使用する必要があります。

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のアプリケーション/オクテットストリームを受け入れ、あなたはアプローチを下回る必要はありません。

application/octet-streamの代わりにContent-Typeを入力したユーザーで複数の部分を追加すると、基本的には、コンプリートラッパーと同じコンテンツタイプの実装を行う必要があります。

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

wowは魅力的な仕事をしています。私はマルチパート/フォームとして手書きで入力しました。以前は成功していませんでした。私はキーを推測します。 'writer.FormContentType()' ありがとうございます。 application/octet-streamの代わりに、ファイルのタイプをimage/pngに設定する手掛かりがありますか? @jeevatkm – nikoss

+0

はい、できます。私はそれを答えに加えます。 – jeevatkm

+0

ありがとうございます@jeevatkm – nikoss

関連する問題