My problem is related with XMLHttpRequest and multipart/form-data. I know how to send files through XMLHttpRequest (code below), but I have some problems with sending (in multipart/form-data mode) urlencoded parameters through the body of the request.
What I want to achieve is to emulate this html form:
<form method="POST" action="http://someurl.com" enctype="multipart/form-data">
<input type="text" value="param1" name="some text"/>
<input type="text" value="param2" name="here UTF-8 string"/>
<input type="file" name="file1"/>
<button type="submit"/>
</form>
So far I know how to send files using XMLHttpRequest. And what I don't know is how to send files and in the same time param1 and param2 as application/x-www-form-urlencoded strings (which will be automatically urldecoded on server-side). The code below is working fine, but with one exception: string params are not send as application/x-www-form-urlencoded but rather as text/plain.
I have spent many hours without any success, so I will be appreciated for any help.
// create boundary var boundary = "-------------" + new Date().getTime();
// create opening separator var oSep = "\r\n--" + boundary + "\r\n" ;
// create closing separator var cSep = "\r\n--" + boundary + "--" ;
// create string-input-stream object var sStrC = Components.classes["@mozilla.org/io/string-input-stream;1"];
// create multiplex-input-stream object
var mStr = Components.classes["@mozilla.org/io/multiplex-input-stream;1"].createInstance(Components.interfaces.nsIMultiplexInputStream);
// create mime-input-stream object var mStrC = Components.classes["@mozilla.org/network/mime-input-stream;1"];
//----- SENDING FILE -----
// create opening separator
var oSepStr = sStrC.createInstance(Components.interfaces.nsIStringInputStream);
oSepStr.setData(oSep, -1);
mStr.appendStream(oSepStr);
// create mimeStream instance
var mimeStr = mStrC.createInstance(Components.interfaces.nsIMIMEInputStream);
mimeStr.addContentLength = true;
mimeStr.addHeader("Content-Type", "application/octet-stream");
mimeStr.addHeader("Content-Disposition", "form-data; name=\"pfile\"; filename=\"access.txt\";");
var myfile = new File("c:\\access.txt"); // JSLIB FILE
// create file-input-stream object
var f = Components.classes["@mozilla.org/network/file-input-stream;1"].createInstance(Components.interfaces.nsIFileInputStream);
f.init(myfile.nsIFile, 1, 1, f.CLOSE_ON_EOF);
// create buffered-input-stream object
var i = Components.classes["@mozilla.org/network/buffered-input-stream;1"].createInstance(Components.interfaces.nsIBufferedInputStream);
i.init(f, 4096);
mimeStr.setData(i); mStr.appendStream(mimeStr);
// create closingSeparatorStream
var cSepStr = sStrC.createInstance(Components.interfaces.nsIStringInputStream);
cSepStr.setData(cSep, -1);
mStr.appendStream(cSepStr);
//----- NORMAL PARAM - should be urlencoded, but it is not... -----
var oSepStr = sStrC.createInstance(Components.interfaces.nsIStringInputStream);
oSepStr.setData(oSep, -1);
mStr.appendStream(oSepStr);
var mimeStr = mStrC.createInstance(Components.interfaces.nsIMIMEInputStream);
mimeStr.addContentLength = true;
mimeStr.addHeader("Content-Type", "application/x-www-form-urlencoded");
mimeStr.addHeader("Content-Disposition", "form-data; name=\"pparam\";");
var iStr = Components.classes["@mozilla.org/io/string-input-stream;1"].createInstance(Components.interfaces.nsIStringInputStream);
iStr.setData(encodeURIComponent("some to post"), -1);
mimeStr.setData(iStr);
mStr.appendStream(mimeStr);
var cSepStr = sStrC.createInstance(Components.interfaces.nsIStringInputStream);
cSepStr.setData(cSep, -1);
mStr.appendStream(cSepStr);
var xhr = new XMLHttpRequest();
xhr.open("POST", "http://someurl.com/test.html", false);
xhr.setRequestHeader("Content-Length", mStr.available()-2);
xhr.setRequestHeader("Content-Type", "multipart/form-data; boundary=" + boundary);
xhr.send(mStr);
_______________________________________________ Mozilla-xpcom mailing list [EMAIL PROTECTED] http://mail.mozilla.org/listinfo/mozilla-xpcom
