请求具有自定义标头的文件

Kri*_*ris 17 html javascript forms header http

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

目前标题的工作方式无法改变,所以请不要纠缠于此; 它将来会改变,是一个我无法控制的内部应用程序.

我探讨的选项:

  • 使用iframe或只是打开一个新窗口,其中包含将返回PDF的某种路径.这不起作用,因为我无法为PDF指定所需的标题,并且在到达PDF本身之前会被重定向.
  • 使用表单并提交请求无法正常工作,因为我无法向表单添加任何自定义标题(只有XHR和插件可以,AFAIK).
  • 使用XHR无法正常工作,因为虽然它可以添加标头并检索文件,但无法将其保存在客户端.

看来我此时唯一的选择基本上是:

  • 使用某种插件(如Flash或Silverlight)来请求该文件.
  • 强制要求的更改比预期更早,以便不再需要标头.

这里有什么我想念的吗?我希望有人可以验证我的发现或指出我错过的东西,因为据我所知,我在这里没有什么可以做的.

编辑:这似乎很容易确认我在想什么:XMLHttpRequest在浏览器中打开PDF

Esa*_*ija 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);
Run Code Online (Sandbox Code Playgroud)

您可以将application/pdf更改为application/octet-stream以获得下载提示.但是从chrome的读卡器上下载也很容易.

在Firefox中没有任何反应,我想这是因为我没有插件来处理application/pdf安装.更改为application/octet-stream将提示dl.

使用IE,我想你需要某种VBScript/ActiveX hackery

如果文件很大,使用数据uri可能会使浏览器崩溃,在这种情况下,您可以使用BlobBuilder和Object URL.