请求具有自定义标头的文件
Request a file with a custom header
我有一个不寻常的要求。从本质上讲,我需要一种方法,以便当用户单击链接或按钮时,他们将收到PDF。这里棘手的部分是,除非随它一起发送自定义标头,否则服务器根本不会处理请求(否则它会认为该人已注销并将其发送到登录屏幕(。
目前,标题的工作方式无法更改,因此请不要纠缠于它;它将来会更改,并且是我无法控制的内部应用程序。
我探索过的选项:
- 使用 iframe 或简单地打开一个新窗口,其中包含某种路径,将返回 PDF。这不起作用,因为我无法为 PDF 指定所需的标题,并且在到达 PDF 本身之前会被重定向。
- 使用表单并提交请求不起作用,因为我不能将任何自定义标头添加到表单(只有 XHR 和插件可以,AFAIK(。
- 使用 XHR 不起作用,因为虽然它可以添加标头和检索文件,无法将其保存在客户端。
在这一点上,我唯一的选择似乎是:
- 使用某种插件(如 Flash 或 Silverlight(来请求文件。
- 强制更改要求的时间比预期早得多,以便不再需要标头。
我在这里缺少什么吗?我希望有人可以验证我的发现或指出我错过的东西,因为据我所知,我在这里真的无能为力。
编辑:这似乎很合适,并证实了我在想什么:XMLHttp请求在浏览器中打开PDF
经测试可在 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);
您可以将应用程序/pdf更改为应用程序/八位字节流以显示下载提示。但是从chrome的阅读器下载也很容易。
在Firefox中什么也没发生,我想这是因为我没有插件来处理application/pdf
安装。更改为应用程序/八位字节流将提示 dl。
使用IE,我想你需要某种VBScript/ActiveX黑客。
如果文件很大,使用数据 uri 可能会使浏览器崩溃,在这种情况下,可以使用 BlobBuilder 和对象 URL。
不要链接到.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');
相关文章:
- SuiteScript2.0-包括一个自定义文件
- Rails资产管道-自定义js文件
- 如何在ExtJs4应用程序上为视图、存储和模型设置自定义文件夹名称
- 扩展 ACE 编辑器,如何导入自定义文件
- 使用drupal中自定义javascript文件中的一个函数
- Javascript/webpack:如何用自定义的文件循环连接目录中的所有json文件
- Alfresco JavaScript,当文件上传到网站时,设置自定义类型属性
- 如何使用ngModel将自定义控件的提供程序扩展器分离到Angular 2中的单独文件中
- 在每次文件上传时发送带有放置区的自定义数据.js
- 为什么自定义 JavaScript 文件放在客户端文件夹中时不在我的 Meteor 模板上呈现
- 带有自定义进度条的 JQuery 文件上传 (blueimp)
- 为什么PHP文件不用于(自定义)CSS和JS
- 使用 gruntjs 自定义初始化任务重命名模板文件夹
- 如何在单独的文件中使用自定义Vtype,以便在EXT.JS中全局使用它们
- 如何通过环境自定义Node.js中的公共js文件
- Wordpress:添加自定义HTML文件
- 如何调用另一个js文件中的函数或触发一个自定义事件,该事件将参数作为Jquery中的数据对象传递
- DOJO自定义对话框-不解析模板文件
- 正在新文件中创建自定义任务
- 用户配置文件自定义 css