我正在尝试编写Safari扩展程序以获取用户已打开的PDF文档,然后通过POST将其提交到另一个站点。
我在Chrome中完成了这项工作,但复制相同的方法不起作用,因为Safari无法与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脚本对话,在其$ _FILES数组中是我的文件。完美。
但我尝试的任何东西似乎都无法使用Safari。我尝试responseType='blob'
开始,但这不起作用。我无法使用任何Safari JS文件对象来处理这些数据。我尝试将其更改为Uint8数组,但这没有提交数据,只是字符串"[object UInt8Array]"
有什么想法吗?
干杯! 贝
答案 0 :(得分:2)
我得到了很好的结果,将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();
我必须承认,在RTFM模式启动之前我尝试了“一两件事”,我发现MDN page on XMLHttpRequest有一节关于读取二进制数据(MDN是一个很好的资源)。
一旦我把它放到位,一切都开始奇迹般地发挥作用。
丹