# Envoi de donnÃ©es Ã  partir de JavaScript: err eur "EOFError

**URL:** <https://www.ruby-forum.com/t/envoi-de-donna-es-a-partir-de-javascript-err-eur-eoferror/86322>\
**Category:** FR\
**Created:** [February 21, 2007, 1:52pm UTC](https://www.ruby-forum.com/t/envoi-de-donna-es-a-partir-de-javascript-err-eur-eoferror/86322 "2007-02-21T13:52:34Z")\
**Posts on this page:** 10\
**Page:** 1

<div class="post-metadata">

**Author:** ![teddio](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/b3f665/32.png) [@teddio](https://www.ruby-forum.com/u/teddio)\
**Post date:** [February 21, 2007, 1:52pm UTC](https://www.ruby-forum.com/t/envoi-de-donna-es-a-partir-de-javascript-err-eur-eoferror/86322/1 "2007-02-21T13:52:34Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![teddio](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/b3f665/32.png) [@teddio](https://www.ruby-forum.com/u/teddio)\
**Post date:** [February 21, 2007, 2:18pm UTC](https://www.ruby-forum.com/t/envoi-de-donna-es-a-partir-de-javascript-err-eur-eoferror/86322/2 "2007-02-21T14:18:37Z")

</div>

Michael H. a écrit :

> const nsIStringInputStream =  
> var sheader = new String();  
> sheader += "Content-disposition:  
> “"\r\n”;  
> var buf =  
> xmlr.onreadystatechange=function() { /\* ici du code vérifiant le
> 
> `process_client' /usr/lib/ruby/gems/1.8/gems/mongrel-0.3.13.4/lib/mongrel.rb:673:in `each’  
> /usr/lib/ruby/gems/1.8/gems/mongrel-0.3.13.4/bin/mongrel\_rails:231  
> Bonne après-midi à tous,
> 
> Michael
> 
> * * *
> 
> Railsfrance mailing list  
> removed\_email\_address@domain.invalid  
> [http://lists.rubyonrails.fr/mailman/listinfo/railsfrance](http://lists.rubyonrails.fr/mailman/listinfo/railsfrance)

Salut,  
Tu pourait nous joindre le dump exacte de ce que XMLHttpRequest  
envoie ?

merci

---

<div class="post-metadata">

**Author:** ![teddio](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/b3f665/32.png) [@teddio](https://www.ruby-forum.com/u/teddio)\
**Post date:** [February 21, 2007, 3:10pm UTC](https://www.ruby-forum.com/t/envoi-de-donna-es-a-partir-de-javascript-err-eur-eoferror/86322/3 "2007-02-21T15:10:03Z")

</div>

loiseau gaetan wrote:

> Salut,  
> Tu pourait nous joindre le dump exacte de ce que XMLHttpRequest  
> envoie ?

J’imagine qu’il s’agit de ceci (exactement entourÃ© par les ++++  
ci-dessous):

++++

–111222111

Content-disposition: form-data;name=“page\_url”

http%3A%2F%[2Fdmoz.org](http://2Fdmoz.org)%2F

–111222111

Content-disposition: form-data;name=“img\_url”

undefined

–111222111

Content-disposition: form-data;name=“commentaires”

–111222111

Content-disposition: form-data;name=“page\_title”

ODP%20-%20Open%20Directory%20Project

–111222111

Content-disposition:  
form-data;name=“filename”;filename=“1172066678008\_0”

Content-Type: application/octet-stream

Content-Length: 1095

++++

---

<div class="post-metadata">

**Author:** ![teddio](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/b3f665/32.png) [@teddio](https://www.ruby-forum.com/u/teddio)\
**Post date:** [February 21, 2007, 10:33pm UTC](https://www.ruby-forum.com/t/envoi-de-donna-es-a-partir-de-javascript-err-eur-eoferror/86322/4 "2007-02-21T22:33:41Z")

</div>

Je ne suis pas certain qu’il soit possible de passer de donner  
multipart/form-data via AJAX ??

Je me trompe peut-Ãªtre.

---

<div class="post-metadata">

**Author:** ![teddio](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/b3f665/32.png) [@teddio](https://www.ruby-forum.com/u/teddio)\
**Post date:** [February 22, 2007, 10:26am UTC](https://www.ruby-forum.com/t/envoi-de-donna-es-a-partir-de-javascript-err-eur-eoferror/86322/5 "2007-02-22T10:26:27Z")

</div>

Vincenzo Ruggiero wrote:

> Je ne suis pas certain qu’il soit possible de passer de donner  
> multipart/form-data via AJAX ??

Le script PHP rÃ©cupÃ¨re parfaitement les donnÃ©es, donc c’est possible,  
non?

---

<div class="post-metadata">

**Author:** ![teddio](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/b3f665/32.png) [@teddio](https://www.ruby-forum.com/u/teddio)\
**Post date:** [February 22, 2007, 10:35am UTC](https://www.ruby-forum.com/t/envoi-de-donna-es-a-partir-de-javascript-err-eur-eoferror/86322/6 "2007-02-22T10:35:09Z")

</div>

Michael H. wrote:

> Vincenzo Ruggiero wrote:
> 
> > Je ne suis pas certain qu’il soit possible de passer de donner  
> > multipart/form-data via AJAX ??
> 
> Le script PHP rÃ©cupÃ¨re parfaitement les donnÃ©es, donc c’est possible,  
> non?

J’utilisais des form\_remote\_tag avec des input type=“file”, il m’Ã©tait  
impossible de rÃ©cupÃ©rer les data en utilisant le form\_remote\_tag.

En passant en form\_tag pas de problÃ¨me.

Je me trompe peut-Ãªtre, Ã voir.

---

<div class="post-metadata">

**Author:** ![teddio](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/b3f665/32.png) [@teddio](https://www.ruby-forum.com/u/teddio)\
**Post date:** [February 22, 2007, 11:43am UTC](https://www.ruby-forum.com/t/envoi-de-donna-es-a-partir-de-javascript-err-eur-eoferror/86322/7 "2007-02-22T11:43:12Z")

</div>

Le 22 févr. 07 à 10:35, Vincenzo Ruggiero a écrit :

> En passant en form\_tag pas de problème.
> 
> Je me trompe peut-être, à voir.

Sans avoir investigué des heures j’avais abouti à la même conclusion  
que Vincenzo à savoir pas d’upload possible via XHR.

Le workaround pour faire du remote upload c’est la sousmission d’un  
formulaire dans une iframe ce qui dans les fait à le même effet mais  
est particulièrement pénible dans rails car pas vraiment compatible  
avec response\_to et RJS.

Renaud\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_  
Railsfrance mailing list  
removed\_email\_address@domain.invalid  
[http://lists.rubyonrails.fr/mailman/listinfo/railsfrance](http://lists.rubyonrails.fr/mailman/listinfo/railsfrance)

---

<div class="post-metadata">

**Author:** ![teddio](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/b3f665/32.png) [@teddio](https://www.ruby-forum.com/u/teddio)\
**Post date:** [February 22, 2007, 11:50am UTC](https://www.ruby-forum.com/t/envoi-de-donna-es-a-partir-de-javascript-err-eur-eoferror/86322/8 "2007-02-22T11:50:13Z")

</div>

Renaud Morvan a écrit :

> Le workaround pour faire du remote upload c’est la sousmission d’un  
> formulaire dans une iframe ce qui dans les fait à le même effet mais  
> est particulièrement pénible dans rails car pas vraiment compatible  
> avec response\_to et RJS.  
> Plus précisément, ce n’est pas vraiment compatible avec RJS et  
> Prototype/Scriptaculous. J’utilise de plus en plus jQuery parce qu’avec  
> Prototype/Scriptaculous je bute un peu trop souvent sur ce genre de  
> problèmes. Et justement, il existe un plugin pour jQuery (ajaxUpload)  
> avec lequel l’upload via la soumission d’un formulaire via une iframe  
> fonctionne très bien et de manière plutôt propre.

++

yk

---

<div class="post-metadata">

**Author:** ![teddio](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/b3f665/32.png) [@teddio](https://www.ruby-forum.com/u/teddio)\
**Post date:** [February 22, 2007, 12:53pm UTC](https://www.ruby-forum.com/t/envoi-de-donna-es-a-partir-de-javascript-err-eur-eoferror/86322/9 "2007-02-22T12:53:52Z")

</div>

Mon problÃ¨me est rÃ©glÃ©. Tout d’abord, j’ai du modifiÃ© le code  
JavaScript:

var sheader = new String();

// sheader += “\r\n” + “–” + BOUNDARY + “\r\n”; // ANCIENNE LIGNE

sheader += “–” + BOUNDARY + “\r\n”; // NOUVELLE LIGNE

sheader += “Content-disposition:  
form-data;name=“page\_url”\r\n\r\n”+encodeURIComponent(pageUrl);

J’ai donc enlevÃ© le “\r\n” du dÃ©but.

Ensuite Ã§a n’allait toujours pas, parce que dans cgi.rb, il y a un test  
que voici:

/Content-Disposition:.\* name="?([^";]\*)"?/ni.match(head)

J’ai donc modifiÃ© les lignes incriminÃ©es:

// sheader += “Content-disposition:  
form-data;name=“page\_url”\r\n\r\n”+encodeURIComponent(pageUrl);  
sheader += “Content-disposition:form-data;  
name=“page\_url”\r\n\r\n”+encodeURIComponent(pageUrl);

C’Ã©tait subtil (une histoire de whitespaces mal placÃ©s)… Maintenant  
les donnÃ©es sont bien rÃ©cupÃ©rÃ©es par le contrÃ´leur.

---

<div class="post-metadata">

**Author:** ![teddio](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/b3f665/32.png) [@teddio](https://www.ruby-forum.com/u/teddio)\
**Post date:** [February 22, 2007, 5:16pm UTC](https://www.ruby-forum.com/t/envoi-de-donna-es-a-partir-de-javascript-err-eur-eoferror/86322/10 "2007-02-22T17:16:11Z")

</div>

Ola everybody,

Bon, je vais peut-etre rendre la vie plus facile a certains. J’ai dans  
mes  
cartons un petit plugin qui fait fonctionner le rendu rjs sur l’upload  
de  
fichier par iFrame. C’est un plugin qui derive de responds\_to\_parent: (  
[http://sean.treadway.info/svn/plugins/responds\_to\_parent/](http://sean.treadway.info/svn/plugins/responds_to_parent/)) (Note: j’ai  
maille son auteur mais il ne m’a jamais repondu).

Attention, je ne garantis rien, il marche chez moi car j’ai des besoins  
assez simple. Mais bon vous avez les sources donc, a vous de jouer !

* * *

Utilisation:

1/ Vue:

\<%= form\_tag\_with\_fake\_ajax\_upload({ :action =\> ‘save’, :id =\> @my\_model  
},  
{ :target =\> ‘uploadIframe’, :begin =\> “alert(‘Hello world !’” }) %\>  
…  
\<%= file\_field ‘foo’, ‘file’ %\>  
…  
\<%= submit\_tag “Save” -%\>

\<%= end\_form\_tag %\>

Remarque: :target (qui est le nom d’une iFrame) n’est pas obligatoire.  
En  
fait, cela l’est dans le cas ou l’utilisateur utilise Safari ET que  
l’application essaye par exemple d’effacer le form pour le remplacer par  
une  
nouvelle version.

2/ Controlleur:

def save  
…

# 2 possibilites (c’est une ou l’autre pas les deux en meme temps 🙂

render\_rjs\_after\_upload :update do |page|  
page.alert ‘Youpi ca marche !’  
end

# Ou

# render\_rjs\_after\_upload :action =\> ‘save’

# execute save.rjs pour le rendu

end

* * *

Ou le trouver ? [lafforgue.fr](http://www.lafforgue.fr/fake_ajax_upload.tar.gz)

Il y aurait pas mal de choses a ameliorer mais ce plugin remplira sa  
tache  
parfaitement dans 90% des cas. J’oubliais, les tests unitaires ne  
marchent  
pas, desole.

Did

Le 22/02/07, Yann K. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) a Ã©crit :
