我想使用Javascript下载二进制文件.
我有一个REST服务,它返回二进制数据,我想知道它是否可以显示二进制文件,无论文件扩展名如何.
这是我目前的代码:
var xhr = new XMLHttpRequest;
xhr.open("GET", requestUrl);
xhr.addEventListener("load", function () {
var ret = [];
var len = this.responseText.length;
var byte;
for (var i = 0; i < len; i++) {
byte = (this.responseText.charCodeAt(i) & 0xFF) >>> 0;
ret.push(String.fromCharCode(byte));
}
var data = ret.join('');
data = "data:application/pdf;base64," + btoa(data);
window.open(data, '_blank', 'resizable, width=1020,height=600');
}, false);
xhr.setRequestHeader("Authorization", "Bearer " + client.accessToken);
xhr.overrideMimeType("octet-stream; charset=x-user-defined;");
xhr.send(null);
Run Code Online (Sandbox Code Playgroud)
谢谢!
我有一个不寻常的要求.基本上我需要一种方法,以便当用户点击链接或按钮时,他们将收到PDF.这里棘手的部分是服务器根本不处理请求,除非与它一起发送自定义标头(否则它认为该人注销并将其发送到登录屏幕).
目前标题的工作方式无法改变,所以请不要纠缠于此; 它将来会改变,是一个我无法控制的内部应用程序.
我探讨的选项:
看来我此时唯一的选择基本上是:
这里有什么我想念的吗?我希望有人可以验证我的发现或指出我错过的东西,因为据我所知,我在这里没有什么可以做的.
编辑:这似乎很容易确认我在想什么:XMLHttpRequest在浏览器中打开PDF
我正在尝试使用这里saveAs解释的接口
目前,我只担心谷歌Chrome,我使用最新的金丝雀(版本27.0.1429.0金丝雀)
Qn1:文章说.
W3C File API包含一个FileSaver接口,它可以将生成的数据保存为saveAs(数据,文件名),但不幸的是它最终会从规范中删除.
为什么会被删除?
Qn2:代码下方.
if (window.saveAs) {
window.saveAs(blob, name);
}else{
console.log("saveAs not supported")
}
Run Code Online (Sandbox Code Playgroud)
版画
saveAs not supported
Run Code Online (Sandbox Code Playgroud)
所以chrome不支持saveAs.这不是我在网上阅读过很多文章的印象.
这是我的问题.我正在尝试调用页面:foo.php?docID = bar并将PDF返回到屏幕,该屏幕在数据库中存储为BLOB.
以下是我的代码中实际返回PDF的部分:
$docID = isset($_REQUEST['docID']) ? $_REQUEST['docID'] : null;
if ($docID == null){
die("Document ID was not given.");
}
$results = getDocumentResults($docID);
if (verifyUser($user, $results['ProductId'])){
header('Content-type: application/pdf');
// this is the BLOB data from the results.
print $results[1];
}
else{
die('You are not allowed to view this document.');
}
Run Code Online (Sandbox Code Playgroud)
这在Firefox中运行得非常好.
但是,在IE中,它根本没有显示任何内容.如果我在另一个页面(即google.com),并输入网址转到此页面,它会说已经完成,但我仍然会在屏幕上显示google.com.
我检查了来自firefox和IE的响应的标题.它们完全相同.
有没有人有什么建议?需要更多信息?
编辑:如果它有帮助,这里是响应标题和内容的第一行:
HTTP/1.1 200 OK
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Length: 349930
Content-Type: application/pdf
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Server: …Run Code Online (Sandbox Code Playgroud)