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:
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
Vous devez vous connecter pour publier un commentaire.
Long problème, réponse courte: il me manquait le mode binaire pour la lecture de l'image sous Windows.
f = File.new(filename, File::RDWR)
devait être
f = File.new(filename, "rb")
OriginalL'auteur Patrick Glandien
Une autre méthode consiste à utiliser Bash et Curl. J'ai utilisé cette méthode quand j'ai voulu tester plusieurs de téléchargement de fichiers.
OriginalL'auteur jmontross