我有一个不寻常的要求。基本上我需要一种方法,以便当用户点击链接或按钮时,他们将收到PDF。这里棘手的部分是服务器不会处理请求 at all ,除非随之发送自定义标头(否则它会认为该人已注销并将其发送到登录屏幕)。
目前标题的工作方式无法改变,所以请不要纠缠于此;它将来会改变,是一个我无法控制的内部应用程序。
我探讨的选项:
看来我现在唯一的选择基本上是:
这里有什么我想念的吗?我希望有人可以验证我的发现或指出我错过的东西,因为据我所知,我在这里没有什么可以做的。
编辑:这似乎很贴切并证实了我的想法:XMLHttpRequest to open PDF in browser
答案 0 :(得分:13)
经过测试,可以使用chrome:
function toBinaryString(data) {
var ret = [];
var len = data.length;
var byte;
for (var i = 0; i < len; i++) {
byte=( data.charCodeAt(i) & 0xFF )>>> 0;
ret.push( String.fromCharCode(byte) );
}
return ret.join('');
}
var xhr = new XMLHttpRequest;
xhr.open( "GET", "/test.pdf" ); //I had test.pdf this on my local server
xhr.addEventListener( "load", function(){
var data = toBinaryString(this.responseText);
data = "data:application/pdf;base64,"+btoa(data);
document.location = data;
}, false);
xhr.setRequestHeader("magic", "header" );
xhr.overrideMimeType( "application/octet-stream; charset=x-user-defined;" );
xhr.send(null);
您可以将application / pdf更改为application / octet-stream以获得下载提示。但是从chrome的阅读器上下载也很容易。
在firefox中没有任何反应我想这是因为我没有安装插件来处理application/pdf
。更改为application / octet-stream将提示dl。
使用IE我想你需要某种VBScript / ActiveX hackery
如果文件很大,使用数据uri可能会使浏览器崩溃,在这种情况下,您可以使用BlobBuilder和对象URL。
答案 1 :(得分:2)
而不是链接到.PDF文件,而是执行类似
的操作<a href="pdf_server.php?file=pdffilename">Download my eBook</a>
输出自定义标题,打开PDF(二进制安全)并将数据打印到用户的浏览器,然后他们可以选择保存PDF,尽管他们的浏览器设置。 pdf_server.php应如下所示:
header("Content-Type: application/octet-stream");
$file = $_GET["file"] .".pdf";
header("Content-Disposition: attachment; filename=" . urlencode($file));
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Description: File Transfer");
header("Content-Length: " . filesize($file));
flush(); // this doesn't really matter.
$fp = fopen($file, "r");
while (!feof($fp))
{
echo fread($fp, 65536);
flush(); // this is essential for large downloads
}
fclose($fp);
编辑:在浏览器(客户端)内向请求添加标头的唯一方法是使用XmlHttpRequest setRequestHeader方法。
xhr.setRequestHeader('custom-header', 'value');