2017-06-18 2 views
0

Ich versuche, Fotos auf Twitter hochzuladen. Ich habe einen mehrteiligen Schreiber erstellt und ein Dateifeld mit diesen benannten Medien erstellt, aber wenn ich meine Anfrage an Twitter sende, reagiert es weiterhin auf fehlende Medienfelder. Fehle ich etwas? Hier ist mein CodeMultipart Dateifeld ist nicht lesbar

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

Was ist der Fehler, den Sie sehen? –

+0

@ CeriseLimón Ich habe eins nach dem anderen gesendet, aber ich habe sie zusammen geschrieben, aber ich versuche, den Schreiber zu schließen, und wenn ich den Inhaltstyp festlege, bekomme ich einen schlechten Anfragefehler, lass mich versuchen, den Schreiber zu schließen – nikoss

+0

@YandryPozo '{" errors ": [{"code": 38, "message": "media parameter fehlt."}]} & {400 Bad Request 400' das ist der fehler, den ich bekomme – nikoss

Antwort

2

Updates: Just Twitter API Upload parameter bezeichnet. Gemäß Ihrem Code-Snippet verwenden Sie beide Felder media und media_data. Sie haben nur eine verwenden -

  • Hochladen mit base64 -> Feldname ist media_data
  • Hochladen mit raw -> Feldname ist media

Und, haben Sie Content-Type Header hinzuzufügen.

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: Während eine Antwort verfassen, in 30 Sekunden Lücke, @ cerise-limón hinzugefügt Kommentar, schließt auch die mehrteiliger Schriftsteller wie @ cerise-limón erwähnt.


im Kommentar die Frage:

Twitter akzeptiert application/octet-stream, können Sie nicht unter Ansatz benötigen.

Hinzufügen mehrteilig mit Benutzer Content-Type anstelle von application/octet-stream. Grundsätzlich müssen Sie die gleiche Implementierung wie Convenience Wrapper mit Ihrem Content-Typ durchführen.

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 

Definition von escapeQuotes aus mehrteiligen Paket.

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

wow das funktioniert wie ein charm ich tippte von hand als multipart/form -Daten vorher ohne Erfolg Ich denke, der Schlüssel vas 'writer.FormContentType()' Vielen Dank. Haben Sie vielleicht eine Ahnung, wie Sie den Dateityp auf image/png anstatt auf application/octet-stream setzen? @jeevatkm – nikoss

+0

Ja, Sie können. Ich werde es der Antwort hinzufügen. – jeevatkm

+0

danke @jeevatkm – nikoss

Verwandte Themen