Multipart Upload de Fichier en Ruby

Je veux simplement télécharger une image sur un serveur avec la POSTE. Aussi simple que cette tâche sons, il semble y avoir pas de solution simple en Ruby.

Dans mon application j'utilise WWW::Mechanize pour la plupart des choses, donc j'ai voulu l'utiliser pour cela aussi, et avait une source comme ceci:

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

Cette résultats dans une tout des ordures prêt fichier sur le serveur qui ressemble brouillés partout:

le texte d'alt http://imagehub.org/f/1tk8/garbage.png

Ma prochaine étape était de déclasser WWW::Mechanize à la version 0.8.5. Cela a fonctionné jusqu'à ce que j'ai essayé de l'exécuter, qui a échoué avec une erreur du type "Module non trouvé dans hpricot_scan.". À l'aide de l'outil Dependency Walker que j'ai pu trouver que hpricot_scan.il est donc nécessaire de msvcrt-ruby18.dll. Pourtant, après je l'ai mis .dll dans mon Ruby/bin-dossier, il m'a donné une boîte d'erreur vide d'où je ne pouvais pas déboguer beaucoup plus loin. Donc, le problème ici est que Mécaniser la 0.8.5 a une dépendance sur Hpricot au lieu de Nokogiri (qui fonctionne parfaitement).


L'idée suivante a été d'utiliser un autre bijou, j'ai donc essayé à l'aide de Net::HTTP. Après une courte recherche j'ai pu trouver qu'il n'y a pas de support natif pour multipart formes de Net::HTTP et au lieu de cela, vous avez à construire une classe qui code etc. pour vous. Les plus utiles que j'ai pu trouver a été le Multipart-classe par Stanislav Vitvitskiy. Cette classe avait l'air bien, mais il ne fait pas ce dont j'ai besoin, parce que je ne veux pas de poste seulement fichiers, j'ai aussi envie de poster des données normales, et qui n'est pas possible avec sa classe.


De ma dernière tentative a été d'utiliser RestClient. Cela avait l'air prometteur, car il y a eu des exemples sur la façon de télécharger des fichiers. Pourtant, je n'arrive pas à poster le formulaire comme 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

Je suis en utilisant http://rest-test.heroku.com qui envoie la demande de débogage si il est envoyé correctement, et j'ai toujours cette arrière:

POST http://rest-test.heroku.com/101 octets de charge utile, 
type de contenu application/x-www-form-urlencoded 
{ 
"pict" => "#<Fichier:0x30d30c4>", 
"username" => "s1kx", 
"pict_to" => "0", 
"fonction" => "picture2", 
"pict_type" => "0", 
"mot de passe" => "mot de passe" 
}

Ce qui montre clairement qu'il n'utilise pas multipart/form-data comme type de contenu, mais la norme application/x-www-form-urlencoded, bien qu'il voit certainement que pict est un fichier.


Comment puis-je télécharger un fichier à Ruby d'un formulaire multipart sans la mise en œuvre de l'ensemble de l'encodage des données et de l'alignement de moi-même?

OriginalL'auteur Patrick Glandien | 2009-06-06