Safari插件中的Javascript-从XHR下载二进制文件数据,然后重新提交
我正试图编写一个Safari扩展来获取用户打开的PDF文档,然后通过POST将其提交到另一个站点 我已经在Chrome中实现了这一点,但是复制相同的方法不起作用,因为Safari不适用于Safari插件中的Javascript-从XHR下载二进制文件数据,然后重新提交,javascript,safari,xmlhttprequest,Javascript,Safari,Xmlhttprequest,我正试图编写一个Safari扩展来获取用户打开的PDF文档,然后通过POST将其提交到另一个站点 我已经在Chrome中实现了这一点,但是复制相同的方法不起作用,因为Safari不适用于BlobBuilder 这就是Chrome的工作原理: var xhr = new XMLHttpRequest(); xhr.open("GET", tab.url, true); xhr.responseType = "arraybuffer"; xhr.onreadyst
BlobBuilder
这就是Chrome的工作原理:
var xhr = new XMLHttpRequest();
xhr.open("GET", tab.url, true);
xhr.responseType = "arraybuffer";
xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && xhr.status == 200) {
var bb = new BlobBuilder();
bb.append(this.response);
var blob = bb.getBlob('application/pdf');
var http = new XMLHttpRequest();
http.open("POST", send_url, true);
var formData = new FormData();
formData.append("src", blob);
http.send(formData);
}
生成的POST与我的PHP脚本对话,在其$\u FILES数组中是我的文件。太好了
但使用Safari时,我尝试的方法似乎完全无效。我试着从responseType='blob'
开始,但没有成功。我无法让任何Safari JS文件对象处理此数据。我尝试将其更改为Uint8数组,但这没有提交数据,只是字符串说“[object UInt8Array]”
有什么想法吗
干杯!
Tony我将responseType保留为“arraybuffer”,然后将xhr.response传递到新Uint8Array的构造函数中,这在Mac上的Safari 5.1.1中非常有效:
xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState == 4) {
buffer = new Uint8Array(xhr.response);
for (var loop=0; loop<buffer.length; loop++) {
// Do something with buffer[loop]
}
}
}
xhr.open('GET', 'yourfilename.here', true);
xhr.responseType = 'arraybuffer';
xhr.send();
xhr=newXMLHttpRequest();
xhr.onreadystatechange=函数(){
if(xhr.readyState==4){
buffer=新的Uint8Array(xhr.response);
对于(var loop=0;loop您真的让Safari上传二进制数据了吗?向FormData
对象添加ArrayBuffer
会导致它提交格式不正确的多部分表单,因此服务器会将整个文件内容报告为----WebKitFormBoundaryaiKF2ZGx25JiZdKY-->/code>。但这比任何其他尝试都要多,在那里狩猎队什么也没送。