2012-12-16 41 views
1

在我的Firefox扩展中,我下载了该文件,然后该扩展应该上传它。我做了以下 -如何使用Firefox扩展上传二进制内容?

// downloading file 
var persist = Components.classes["@mozilla.org/embedding/browser/nsWebBrowserPersist;1"] 
       .createInstance(Components.interfaces.nsIWebBrowserPersist); 
var file = Components.classes["@mozilla.org/file/directory_service;1"] 
       .getService(Components.interfaces.nsIProperties) 
       .get("TmpD", Components.interfaces.nsIFile); 
file.append("temp.torrent"); 
file.createUnique(Components.interfaces.nsIFile.NORMAL_FILE_TYPE, 0666); 

var fURI = synoext.srv.io.newURI(url,null,null); 
    const nsIWBP = Components.interfaces.nsIWebBrowserPersist; 
    const flags = nsIWBP.PERSIST_FLAGS_REPLACE_EXISTING_FILES; 
    persist.persistFlags = flags | nsIWBP.PERSIST_FLAGS_FROM_CACHE; 
persist.progressListener = { 
    onProgressChange: function(aWebProgress, aRequest, aCurSelfProgress, aMaxSelfProgress, aCurTotalProgress, aMaxTotalProgress) { 
    }, 
    onStateChange: function(aWebProgress, aRequest, aStateFlags, aStatus) { 
    if (aStateFlags & Components.interfaces.nsIWebProgressListener.STATE_STOP) { 
     // file has been downloaded, upload it 
     Components.utils.import("resource://gre/modules/NetUtil.jsm"); 
     NetUtil.asyncFetch(file, function(inputStream, status) { 
     if (!Components.isSuccessCode(status)) { 
      return; 
     } 

     var filedata = NetUtil.readInputStreamToString(inputStream, inputStream.available()); 
     var boundary = "-----------------------ZzzZzzZzz"; 

     var postdata = "--"+boundary+"\r\n"; 
     postdata += "Content-Disposition: form-data; name=\"api\""+"\r\n"; 
     postdata += "\r\n"; 
     postdata += "SYNO.DownloadStation.Task"+"\r\n"; 

     postdata += "--"+boundary+"\r\n"; 
     postdata += "Content-Disposition: form-data; name=\"version\""+"\r\n"; 
     postdata += "\r\n"; 
     postdata += "1"+"\r\n"; 

     postdata += "--"+boundary+"\r\n"; 
     postdata += "Content-Disposition: form-data; name=\"method\""+"\r\n"; 
     postdata += "\r\n"; 
     postdata += "create"+"\r\n"; 

     postdata += "--"+boundary+"\r\n"; 
     postdata += "Content-Disposition: form-data; name=\"file\"; filename=\""+file.leafName+"\""+"\r\n"; 
     postdata += "Content-Type: application/x-bittorrent"+"\r\n"; 
     postdata += "\r\n"; 
     postdata += filedata; 
     postdata += "--"+boundary; 
     postdata += "\r\n"; 

     var req = Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"] 
          .createInstance(Components.interfaces.nsIXMLHttpRequest); 
     req.open('POST', "http://192.168.1.5:5000/webapi/DownloadStation/task.cgi", true); // asynch 
     req.onload = function() { 
      // file uploaded 
     }; 

     req.setRequestHeader('Content-Type', 'multipart/form-data; boundary='+boundary); 
     // req.setRequestHeader('Content-Length', postdata.length); 
     req.send(postdata); 
     }); 

但文件上传不正确。我的测试用例中的原始文件是31Kb,但上传的文件是46Kb。如果我检查filedata.length,那么它是正确的 - 31Kb。

回答

4

不要自己创建POST正文,而是使用FormData对象。

var formData = Components.classes["@mozilla.org/files/formdata;1"].createInstance(Components.interfaces.nsIDOMFormData); 
formData.append(key, value); 

formData.append("file", File(file)); 
+0

好的,但原来的问题仍然存在 - 如何通过nsiFile在那里? [文档](https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest/FormData/Using_FormData_Objects)对此没有提及。 –

+0

我更新了这个例子。 – paa

+0

谢谢,这正是我昨天做的。但它是跨平台的方法吗?用户开始抱怨说我的扩展与此代码在Mac上无法使用。 –

相关问题