Multipart-Datei-Upload in Ruby

Ich möchte einfach ein Bild hochladen auf einen server mit der POST. So einfach diese Aufgabe klingt, scheint es keine einfache Lösung in Ruby.

In meine Anwendung bin ich mit WWW::Mechanize für die meisten Dinge, also wollte ich es verwenden, für diese zu, und hatte eine Quelle wie diese:

f = File.new(filename, File::RDWR)
reply = agent.post(
    'http://rest-test.heroku.com',
    {
         :pict       =>  f,
         :function   =>  'picture2',
         :username   =>  @username,
         :password   =>  @password,
         :pict_to    =>  0,
         :pict_type  =>  0
    }
)
f.close

Diese Ergebnisse in einer völlig Müll-ready-Datei auf dem server, sieht verschlüsselt alle über:

alt-text http://imagehub.org/f/1tk8/garbage.png

Mein Nächster Schritt war ein downgrade WWW::Mechanize auf version 0.8.5. Dies funktionierte, bis ich versuchte, es zu starten, die nicht mit einem Fehler wie "Modul nicht gefunden in hpricot_scan.so". Mit dem Dependency Walker tool, mit dem ich feststellen konnte, dass hpricot_scan.so benötigt msvcrt-ruby18.dll. Doch nachdem ich das Ausdrücken soll .dll in mein Ruby/bin-Ordner, es gab mir eine leere error-box, von wo, konnte ich nicht Debuggen sehr viel weiter. Also das problem hier ist, dass Mechanisieren 0.8.5 eine Abhängigkeit von Hpricot statt Nokogiri (das funktioniert einwandfrei).


Die nächste Idee war die Verwendung eines anderen Edelsteins, also versuchte ich mit Net::HTTP. Nach kurzer recherche konnte ich herausfinden, dass es keine native Unterstützung für mehrteilige Formulare in Net::HTTP-und stattdessen bauen Sie eine Klasse, die codiert etc. für Sie. Die hilfreichsten, die ich finden konnte, war die Multipart-Klasse von Stanislav Vitvitskiy. Diese Klasse sah gut aus so weit, aber es nicht tut, was ich brauche, weil ich nicht wollen, post - nur - Dateien, ich will auch post-normale Daten -, und dass es nicht möglich ist mit seiner Klasse.


Mein letzten Versuch war der Einsatz von RestClient. Das sah vielversprechend aus, als es Beispiele auf, wie zum hochladen von Dateien. Aber ich kann nicht ankommen es zu veröffentlichen das Formular als multipart.

f = File.new(filename, File::RDWR)
reply = RestClient.post(
    'http://rest-test.heroku.com',
    :pict       =>  f,
    :function   =>  'picture2',
    :username   =>  @username,
    :password   =>  @password,
    :pict_to    =>  0,
    :pict_type  =>  0
)
f.close

Ich bin mit http://rest-test.heroku.com die sendet die Anfrage zu Debuggen, wenn es richtig geschickt, und ich bekomme immer das zurück:

POST http://rest-test.heroku.com/mit einem 101 byte-Nutzlast, 
content-type application/x-www-form-urlencoded 
{ 
"pict" => "# "< " Datei:0x30d30c4>", 
"Benutzername" => "s1kx", 
"pict_to" => "0", 
"Funktion" => "Bild2", 
"pict_type" => "0", 
"Passwort" => "Passwort" 
}

Dies zeigt deutlich, dass es nicht multipart/form-data als content-type, aber die standard -application/x-www-form-urlencoded, obwohl es definitiv sieht, dass pict ist eine Datei.


Wie kann ich eine Datei hochladen in Ruby eine mehrteilige form ohne Umsetzung des gesamten encoding-und Daten ausrichten von mir?

Schreibe einen Kommentar