I want to use XMLHttpRequest in JavaScript to POST a form that includes a file type input element so that I can avoid page refresh and get useful XML back.
I can submit the form without page refresh, using JavaScript to set the target attribute on the form to an iframe for MSIE or an object for Mozilla, but this has two problems. The minor problem is that target is not W3C compliant (which is why I set it in JavaScript, not in XHTML). The major problem is that the onload event doesn't fire, at least not on Mozilla on OS X Leopard. Besides, XMLHttpRequest would make for prettier response code because the returned data could be XML, not confined to XHTML as is the case with iframe.
Submitting the form results in HTTP that looks like:
Content-Type: multipart/form-data;boundary=<boundary string>
Content-Length: <length>
--<boundary string>
Content-Disposition: form-data, name="<input element name>"
<input element value>
--<boundary string>
Content-Disposition: form-data, name=<input element name>"; filename="<input element value>"
Content-Type: application/octet-stream
<element body>
How do I get the XMLHttpRequest object's send method to duplicate the above HTTP stream?
You can construct the 'multipart/form-data' request yourself (read more about it at http://www.faqs.org/rfcs/rfc2388.html) and then use the send
method (ie. xhr.send(your-multipart-form-data)). Similarly, but easier, in Firefox 4+ (also in Chrome 5+ and Safari 5+) you can use the FormData interface that helps to construct such requests. The send
method is good for text content but if you want to send binary data such as images, you can do it with the help of the sendAsBinary
method that has been around starting with Firefox 3.0. For details on how to send files via XMLHttpRequest
, please refer to http://blog.igstan.ro/2009/01/pure-javascript-file-upload.html.
There isn't any way to access a file input field inside javascript so there isn't a javascript only solution for ajax file uploads.
There are workaround like using an iframe.
The other option would be to use something like SWFUpload or Google Gears
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With