Salut tout l’monde,
J’ai un problème que je ne parviens pas à résoudre. Je vous explique…
Pour le projet en cours, une extension Firefox a été développée. Son job
c’est de récupérer les images trouvées sur une page et de les envoyer
sur le serveur. Pour ce faire, le développeur utilise un objet
XMLHttpRequest et il poste les données sous forme de
multipart/form-data. Voici le code JavaScript pour l’envoi d’une des
images:
const BOUNDARY = "111222111"; //ce qui va nous servir de délimiteur
const MULTI = "@mozilla.org/io/multiplex-input-stream;1";
const FINPUT = "@mozilla.org/network/file-input-stream;1";
const STRINGIS = "@mozilla.org/io/string-input-stream;1";
const BUFFERED = "@mozilla.org/network/buffered-input-stream;1";
const nsIMultiplexInputStream =
Components.interfaces.nsIMultiplexInputStream;
const nsIFileInputStream =
Components.interfaces.nsIFileInputStream;
const nsIStringInputStream =
Components.interfaces.nsIStringInputStream;
const nsIBufferedInputStream =
Components.interfaces.nsIBufferedInputStream;
var mis =
Components.classes[MULTI].createInstance(nsIMultiplexInputStream);
var fin =
Components.classes[FINPUT].createInstance(nsIFileInputStream);
fin.init(fileTmp, 0x01, 0444, 4);
var sheader = new String();
sheader += "\r\n" + "--" + BOUNDARY + "\r\n";
sheader += "Content-disposition:
form-data;name=\"page_url\"\r\n\r\n"+encodeURIComponent(pageUrl);
sheader += "\r\n" + "--" + BOUNDARY + "\r\n";
sheader += "Content-disposition:
form-data;name=\"img_url\"\r\n\r\n"+encodeURIComponent(imagesListArray[indiceArray[i]][5]);
sheader += "\r\n" + "--" + BOUNDARY + "\r\n";
sheader += "Content-disposition:
form-data;name=\"commentaires\"\r\n\r\n"+encodeURIComponent(commentArray[i]);
sheader += "\r\n" + "--" + BOUNDARY + "\r\n";
sheader += "Content-disposition:
form-data;name=\"page_title\"\r\n\r\n"+encodeURIComponent(pageTitle);
sheader += "\r\n" + "--" + BOUNDARY + "\r\n";
sheader += "Content-disposition:
form-data;name=\"filename\";filename=\"" + fileTmp.leafName +
“”\r\n";
sheader += “Content-Type: application/octet-stream\r\n”;
sheader += “Content-Length: " + fileTmp.fileSize+”\r\n\r\n";
var hsis =
Components.classes[STRINGIS].createInstance(nsIStringInputStream);
hsis.setData(sheader, sheader.length);
var endsis =
Components.classes[STRINGIS].createInstance(nsIStringInputStream);
var bs = new String("\r\n--" + BOUNDARY + "--\r\n");
endsis.setData(bs, bs.length);
var buf =
Components.classes[BUFFERED].createInstance(nsIBufferedInputStream);
buf.init(fin, 4096);
mis.appendStream(hsis);
mis.appendStream(buf);
mis.appendStream(endsis);
var xmlr = new XMLHttpRequest();
xmlr.open("POST", urlServeur, true);
xmlr.setRequestHeader("Content-Type", "multipart/form-data;
boundary=" + BOUNDARY);
xmlr.onreadystatechange=function() { /* ici du code vérifiant le
statut pour voir si c'est bien passé */ }
xmlr.send(mis);
Pour ses tests, le développeur a écrit un script PHP qui récupère les
données envoyées et renvoie un code erreur. Ca fonctionne parfaitement.
Mais je souhaite l’intégrer complètement au projet et donc j’ai réécrit
son code en Ruby. J’appelle la méthode et là , l’extension me sort une
erreur 404 (xmlr.status = 404), comme quoi elle ne parvient pas Ã
joindre le serveur.
J’ai un peu fouiné dans les logs et j’ai trouvé ceci dans mongrel.log:
Wed Feb 21 13:30:15 +0100 2007: Error calling Dispatcher.dispatch
#<EOFError: bad content body>
/usr/lib/ruby/1.8/cgi.rb:983:in `read_multipart'
/home/web/projet.com/ftp/dev/config/../vendor/rails/actionpack/lib/action_controller/cgi_ext/raw_post_data_fix.rb:38:in
`initialize_query'
/usr/lib/ruby/1.8/cgi.rb:2274:in `initialize'
/usr/lib/ruby/gems/1.8/gems/mongrel-0.3.13.4/lib/mongrel/cgi.rb:50:in
`initialize'
/usr/lib/ruby/gems/1.8/gems/mongrel-0.3.13.4/lib/mongrel/rails.rb:76:in
`new'
/usr/lib/ruby/gems/1.8/gems/mongrel-0.3.13.4/lib/mongrel/rails.rb:76:in
`process'
/usr/lib/ruby/gems/1.8/gems/mongrel-0.3.13.4/lib/mongrel.rb:580:in
`process_client'
/usr/lib/ruby/gems/1.8/gems/mongrel-0.3.13.4/lib/mongrel.rb:579:in
`each'
/usr/lib/ruby/gems/1.8/gems/mongrel-0.3.13.4/lib/mongrel.rb:579:in
`process_client'
/usr/lib/ruby/gems/1.8/gems/mongrel-0.3.13.4/lib/mongrel.rb:686:in
run' /usr/lib/ruby/gems/1.8/gems/mongrel-0.3.13.4/lib/mongrel.rb:686:in
initialize’
/usr/lib/ruby/gems/1.8/gems/mongrel-0.3.13.4/lib/mongrel.rb:686:in
new' /usr/lib/ruby/gems/1.8/gems/mongrel-0.3.13.4/lib/mongrel.rb:686:in
run’
/usr/lib/ruby/gems/1.8/gems/mongrel-0.3.13.4/lib/mongrel.rb:673:in
initialize' /usr/lib/ruby/gems/1.8/gems/mongrel-0.3.13.4/lib/mongrel.rb:673:in
new’
/usr/lib/ruby/gems/1.8/gems/mongrel-0.3.13.4/lib/mongrel.rb:673:in
run' /usr/lib/ruby/gems/1.8/gems/mongrel-0.3.13.4/lib/mongrel/configurator.rb:267:in
run’
/usr/lib/ruby/gems/1.8/gems/mongrel-0.3.13.4/lib/mongrel/configurator.rb:266:in
each' /usr/lib/ruby/gems/1.8/gems/mongrel-0.3.13.4/lib/mongrel/configurator.rb:266:in
run’
/usr/lib/ruby/gems/1.8/gems/mongrel-0.3.13.4/bin/mongrel_rails:127:in
run' /usr/lib/ruby/gems/1.8/gems/mongrel-0.3.13.4/lib/mongrel/command.rb:211:in
run’
/usr/lib/ruby/gems/1.8/gems/mongrel-0.3.13.4/bin/mongrel_rails:231
L’erreur qui m’emphe de traiter les données est donc: #<EOFError: bad
content body>. J’ai fouiné sur Google, pas moyen de trouver pourquoi ça
passe mal. J’ai modifié le code JavaScript pour qu’il n’envoie plus
l’image et n’envoie rien que des données basiques (l’url de la page,
l’url de l’image, etc), mais ça n’a rien changé. Bref, je suis un peu
coincé…
Avez-vous une idée? Que pourrais-je faire pour résoudre ce problème?
Bonne après-midi à tous,
Michael