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);