Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何下载然后上传文件?_Javascript_Firefox Addon_Xmlhttprequest - Fatal编程技术网

Javascript 如何下载然后上传文件?

Javascript 如何下载然后上传文件?,javascript,firefox-addon,xmlhttprequest,Javascript,Firefox Addon,Xmlhttprequest,尝试使用以下代码,但无法正常工作: // download the file first var req = new XMLHttpRequest(); req.open('GET', url, false); req.overrideMimeType('text/plain; charset=x-user-defined'); req.send(null); if (req.status != 200) return ''; // upload the file

尝试使用以下代码,但无法正常工作:

  // download the file first
  var req = new XMLHttpRequest();
  req.open('GET', url, false);
  req.overrideMimeType('text/plain; charset=x-user-defined');
  req.send(null);
  if (req.status != 200) return '';

  // upload the file
  req.open("POST", "http://mysite.com/upload", false);
  req.setRequestHeader("Content-Length", req.responseText.length);
  req.sendAsBinary(req.responseText); // What should I pass here?

  if (req.status != 200) return '';
  return req.responseText;
sendAsBinary是firefox

Upd.我也尝试将其作为表单的一部分上传:

var response = req.responseText;
var formData = new FormData();
formData.append("file", response);
req.open("POST", "http://mysite.com/upload", false);
req.send(formData);

但是服务器仍然没有接收到完整的数据。

在重用
req
对象之前,需要将
responseText
存储在中间变量中

// download the file first
var req = new XMLHttpRequest();
req.open('GET', url, false);
req.overrideMimeType('text/plain; charset=x-user-defined');
req.send(null);
if (req.status != 200) return '';
var response = req.responseText;

// upload the file
req.open("POST", "http://mysite.com/upload", false);
req.setRequestHeader("Content-Length", response.length);
req.sendAsBinary(response);
if (req.status != 200) return '';
return req.responseText;

更新

根据MDN页面,上面的代码似乎无法工作。下面是获得二进制响应的正确方法。最后,您将拥有一个无符号整数数组,可以将其发送回服务器并转换为二进制。我想

//req.responseType is only defined for FF6+
req.responseType = "arraybuffer";
req.send(null);

//req.response is for FF6+, req.mozResponseArrayBuffer is for FF < 6
var buffer = req.mozResponseArrayBuffer || req.response;
if (buffer) {
  var byteArray = new Uint8Array(buffer);
}

更新3


是否与您的问题有关?

最后,我对临时文件使用了这种方法:

var downloadCompleted=false;
//先下载文件
var persist=Components.classes[“@mozilla.org/embedded/browser/nsWebBrowserPersist;1”]
.createInstance(Components.interfaces.nsIWebBrowserPersist);
//获取操作系统临时文件夹
var file=Components.classes[“@mozilla.org/file/directory_service;1”]
.getService(组件.接口.属性)
.get(“TmpD”,Components.interfaces.nsi文件);
append(“temp.ext”);
createUnique(Components.interfaces.nsfile.NORMAL\u file\u TYPE,0666);
var fURI=Services.io.newURI(url,null,null);
const nsIWBP=Components.interfaces.nsIWebBrowserPersist;
const flags=nsIWBP.PERSIST\u flags\u REPLACE\u现有文件;
persist.persistFlags=flags | nsIWBP.persist_flags_来自_缓存;
persist.progressListener={
onProgressChange:函数(aWebProgress、aRequest、aCurSelfProgress、aMaxSelfProgress、aCurTotalProgress、aMaxTotalProgress){
},
onStateChange:函数(aWebProgress、aRequest、aStateFlags、aStatus){
if(aStateFlags&Components.interfaces.nsIWebProgressListener.STATE\u STOP){
downloadCompleted=true;//文件已下载
}
}
}
saveURI(fURI,null,null,null,“,file);
var thread=Components.classes[“@mozilla.org/thread manager;1”]
.getService(组件.接口.线程管理器)
.当前线程;
而(!downloadCompleted)//模拟同步请求,不推荐使用这种方法
thread.processNextEvent(true);
//上传文件
var stream=Components.classes[“@mozilla.org/network/file input stream;1”]
.createInstance(Components.interfaces.nsIFileInputStream);
stream.init(文件,0x04 | 0x0806440x04);//文件是一个nsIFile实例
//尝试确定文件的MIME类型
var mimeType=“text/plain”;
试一试{
var mimeService=Components.classes[“@mozilla.org/mime;1”]
.getService(组件.接口.nsIMIMEService);
mimeType=mimeService.getTypeFromFile(文件);//文件是nsIFile实例
}
catch(e){/*只需使用text/plain*/}
var req=Components.classes[“@mozilla.org/xmlextas/xmlhttprequest;1”]
.createInstance(Components.interfaces.nsIXMLHttpRequest);
请求打开(‘POST’,”http://mysite.com/upload“,假);
请求setRequestHeader('Content-Type',mimeType);
请求发送(流);
//删除该文件
文件删除(假);

Define:“…无法正常工作”我正在使用的文件是二进制文件。看起来
responseText
会破坏它。静态服务器部件显示它收到了大小为0的文件。可能是我的服务器代码错了。有没有办法将文件作为表单的一部分传递?(这样我就可以确定如何在服务器端获得它)您可能可以将二进制文件的base64编码字符串表示形式存储在表单的隐藏输入中。当你发布表单时,base64字符串也应该发布。Chris,我该怎么做?我已经尝试更新了这个问题。好的,因为这是firefox插件,我可以使用
window.btoa(unescape(encodeURIComponent(req.responseText))
。这是正确的。但是文件大小增加了3倍!我必须在服务器端解码。还有别的办法吗?克里斯,那我该怎么上传?
req.open("POST", "http://mysite.com/upload", false);
req.setRequestHeader("Content-Length", byteArray.length);
//if this doesn't work, try byteArray.buffer
//if byteArray.buffer works, try skipping 'var byteArray = new Uint8Array(buffer);' altogether and just sending the buffer directly
req.send(byteArray);