Hello,
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

Reply via email to