请求文件与自定义标题(Request a file with a custom header)

2019-06-24 06:28发布

我有一个不寻常的要求。 基本上我需要一种方法,这样,当用户点击一个链接或按钮上,他们将收到一个PDF。 这里最棘手的部分是,服务器将处理的请求,除非自定义标题与它发送(否则它认为人退出,并将它们发送到登录屏幕)。

目前头作品不能改变,所以请不要纠缠于它的方式; 它会在未来得到改变,是我无法控制的内部应用程序。

我已经探索的选项:

  • 使用iframe或简单地打开一个新的窗口,带有某种路径,将返回的PDF。 这可不行,因为我不能指定为PDF需要的头和到达PDF本身之前将被重定向。
  • 使用表格和提交请求不能工作,因为我不能添加任何自定义标头的形式(只XHR和插件就可以了,据我所知)。
  • 使用XHR不能因为工作,而它可以添加页眉和检索文件,有没有办法将它保存在客户端。

这样看来,我唯一的选择,在这一点上基本上是:

  • 使用某种形式的插件,如Flash或Silverlight的请求文件。
  • 强制的要求远早于预期,使得头部不再需要的变化。

是否有什么我在这里失踪? 我希望有人可以验证我的发现或点我的东西我错过了,因为据我所知,确实没有什么我可以在这里做。

编辑:这似乎是贴切和证实了我的想法: XMLHttpRequest来在浏览器中打开PDF

Answer 1:

经测试,在铬工作:

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

您可以更改应用程序/ PDF应用程序/八位字节流具有下载提示。 但它很容易从镀铬的读者下载为好。

在Firefox中没有任何反应我想这是因为我没有一个插件来处理application/pdf安装。 更改为应用/八位字节流将提示一个DL。

与IE浏览器,我想你需要某种形式的VBScript /的ActiveX两轮牛车的

如果该文件是巨大的,使用数据的URI可能会崩溃的浏览器,在这种情况下,你可以使用BlobBuilder和对象的URL。



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


文章来源: Request a file with a custom header