Javascript 使用$http.get从服务器下载文件

Javascript 使用$http.get从服务器下载文件,javascript,php,angularjs,http,http-headers,Javascript,Php,Angularjs,Http,Http Headers,当用户点击“下载PDF”按钮时,我试图触发文件下载。调用API进行一些检查,然后返回文件。我不希望该文件在浏览器中打开。我已经读了很多关于如何做到这一点的stackoverflow问题,但无法让它发挥作用。我将文件内容作为文本返回,但浏览器不会保存文件,也不会让我选择将其保存为文件 这就是我所拥有的 HTML <button ng-click="apiDownload()">Download PDF</button> PHP API(主要来自) 函数apildownlo

当用户点击“下载PDF”按钮时,我试图触发文件下载。调用API进行一些检查,然后返回文件。我不希望该文件在浏览器中打开。我已经读了很多关于如何做到这一点的stackoverflow问题,但无法让它发挥作用。我将文件内容作为文本返回,但浏览器不会保存文件,也不会让我选择将其保存为文件

这就是我所拥有的

HTML

<button ng-click="apiDownload()">Download PDF</button>
PHP API(主要来自)

函数apildownloadfile(){
$file_name=“下载/test.pdf”;
$abs_file_name=realpath(dirname(_file__))./。$file_name;
如果(is_file($abs_file_name)和&file_存在($abs_file_name)){
//IE所需
if(ini_get('zlib.output_compression')){ini_set('zlib.output_compression','Off');}
//使用文件扩展名获取文件mime类型
开关(strtolower(substr(strrchr($file_name,“.”),1))){
案例'pdf':$mime='application/pdf';中断;
案例'zip':$mime='application/zip';break;
案例“jpeg”:
案例'jpg':$mime='image/jpg';break;
默认值:$mime='application/forcedownload';
}
标题('Pragma:public');//必需
标头('Expires:0');//没有缓存
标头('Cache-Control:必须重新验证,后检查=0,前检查=0');
标题('Last-Modified:'.gmdate('D,dmy H:i:s',filemtime($abs_file_name))。'GMT');
标头('Cache-Control:private',false);
标题('Content-Type:'。$mime);
标题('Content-Disposition:attachment;filename='.basename($abs_file_name));
标题(“内容传输编码:二进制”);
header('Content-Length:'.filesize($abs_file_name));//提供文件大小
标题(“连接:关闭”);
readfile($abs_file_name);//将其推出
退出();
}
}
我在chrome开发者工具中看到以下标题:

请求标题

GET /api/download HTTP/1.1
Host: sa.dev
Connection: keep-alive
Cache-Control: no-cache
Pragma: no-cache
Accept: application/pdf
If-Modified-Since: 0
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.89 Safari/537.36
Referer: https://sa.dev/insights
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8,da;q=0.6,sv;q=0.4,no;q=0.2,nb;q=0.2
Cookie: ...
HTTP/1.1 200 OK
Date: Mon, 16 Mar 2015 14:27:08 GMT
Server: Apache/2.4.9 (Unix) PHP/5.6.5 OpenSSL/0.9.8zc
X-Powered-By: PHP/5.6.5
Pragma: public
Expires: 0
Cache-Control: must-revalidate, post-check=0, pre-check=0
Last-Modified: Mon, 16 Mar 2015 09:04:06 GMT
Cache-Control: private
Content-Disposition: attachment; filename=test.pdf
Content-Transfer-Encoding: binary
Content-Length: 5501633
Connection: close
Content-Type: application/pdf
响应标题

GET /api/download HTTP/1.1
Host: sa.dev
Connection: keep-alive
Cache-Control: no-cache
Pragma: no-cache
Accept: application/pdf
If-Modified-Since: 0
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.89 Safari/537.36
Referer: https://sa.dev/insights
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8,da;q=0.6,sv;q=0.4,no;q=0.2,nb;q=0.2
Cookie: ...
HTTP/1.1 200 OK
Date: Mon, 16 Mar 2015 14:27:08 GMT
Server: Apache/2.4.9 (Unix) PHP/5.6.5 OpenSSL/0.9.8zc
X-Powered-By: PHP/5.6.5
Pragma: public
Expires: 0
Cache-Control: must-revalidate, post-check=0, pre-check=0
Last-Modified: Mon, 16 Mar 2015 09:04:06 GMT
Cache-Control: private
Content-Disposition: attachment; filename=test.pdf
Content-Transfer-Encoding: binary
Content-Length: 5501633
Connection: close
Content-Type: application/pdf
我通过使用的库解决了这个问题(参见此)

使用jQuery.fileDownload时,我必须做两件事来添加到

  • 放一块饼干

    • 在PHP中:
      setcookie('fileDownload','true',NULL',/')
    • Set Cookie头如下所示:
      Set Cookie:fileDownload=true;路径=/
  • 调用
    $.fileDownload('/api/download')来自js。并删除$http的使用

  • 有关如何使用jQuery.fileDownload的更多信息,请参阅

    如果有人不使用jQuery库就可以解决这个问题,可以将其作为答案发布

    $scope.apiDownload = function(){
        window.open('api/download');
    };
    

    很好用

    你试过用javascript指定位置吗?( ). 注意:这只适用于较新的浏览器(基于:),但对于许多浏览器来说,这些浏览器已经足够旧了,所以不应该成为问题)。您可能可以在此处找到一些有用的信息,这不允许用户设置请求的额外信息,例如设置头,如
    授权
    等。