Hello,

I've written some Javascript code that uses XPCOM to allow a user to download a file to there local disk. The problem is that this code only works for ASCII files (maybe just 7-bit?), not binary. Binary files come out corrupt. Does anyone know what I might be doing wrong?

---

var oURL = createInstance('@mozilla.org/network/standard-url;1',
'nsIURL');
oURL.spec = "http://www.example.com/somebinaryfile.doc";;


var ioServiceForDownload = getService('@mozilla.org/network/io-service;1',
'nsIIOService');

var downloadChann = ioServiceForDownload.newChannelFromURI(oURL).QueryInterface( Components.interfaces.nsIHttpChannel);


var fp = downloadDocumentToDisk(title);


var fileOutputStream = createInstance("@mozilla.org/network/file-out
put-stream;1", "nsIFileOutputStream");

if(!fp) { return; }
fp.create(fp.NORMAL_FILE_TYPE, 0600);

fileOutputStream.init(fp, 2, 0600, false);

downloadChann.asyncOpen(saveFileListener, fileOutputStream);


var saveFileListener = {
onDataAvailable: function (channel, ctxt, inStr, sourceOffset,
count) {

var scriptableStream = toScriptableStream(inStr);
var theData = scriptableStream.read(count);
ctxt.write(theData, count);
return;
},
onStartRequest: function (channel, ctxt) {
consolePrint("onStartRequest, status: " + channel.status, true);
return;
},
onStopRequest: function (channel, ctxt, status) {
consolePrint("onStopRequest, status: " + status, true);
ctxt.close();
return;
}

};


function downloadDocumentToDisk(fileName)
{
var nsIFilePicker = Components.interfaces.nsIFilePicker;
var fp = Components.classes["@mozilla.org/filepicker;1"]
.createInstance(nsIFilePicker);
fp.init(top, "Save As", nsIFilePicker.modeSave);
fp.defaultString = fileName;
var rv = fp.show();
if(rv == nsIFilePicker.returnCancel) { return null; }

return fp.file;
}


function toScriptableStream(input) {
var SIStream = Components.Constructor(
'@mozilla.org/scriptableinputstream;1',
'nsIScriptableInputStream', 'init');
return new SIStream(input);
}




Reply via email to