正确的方式来触发文件下载?

时间:2015-08-25 15:00:57

标签: javascript html download downloading

在public / templates / calendar.html中我有

<a href="" id="secret_download_button" style="display:none" download="">

在同一个文件中,我有一个按钮(下载qr),我从javascript进行ajax调用,qr在/ public / uploads / thumbs / qrcodes /&#39; filename&#39;中创建。 完成ajax调用并调用以下函数,该函数位于

公共/ JavaScript的/ some.js

function (data) {
        $('#secret_download_button').attr('href',data.content);
        $('#secret_download_button').attr('download','somename');
        $('#secret_download_button').click();
    });

data.content = public / upload / thumbs / qrcodes / someqr.png(example)

我需要使用相对路径,而不是绝对路径。我究竟做错了什么 ?我猜我正在设置错误路径错误。 另外,从我在线阅读的内容来看,IE不支持此解决方案。是否有另一种更简单,更优雅的方法(我需要能够指定将要下载的文件的名称)

修改

最终解决了服务器端问题。谢谢。对于其他有同样问题的人我用过这个:

            header('Content-Description: File Transfer');
            header('Content-Type: application/octet-stream');
            header('Content-Disposition: attachment; filename="'.basename($activity_name . '.png').'"');
            header('Expires: 0');
            header('Cache-Control: must-revalidate');
            header('Pragma: public');
            header('Content-Length: ' . filesize($root . $path . $file_name));
            readfile($root . $path . $file_name);
            exit;

1 个答案:

答案 0 :(得分:10)

你是对的,IE 和Edge 不支持下载属性(Edge 13+支持):http://caniuse.com/#feat=download

要拥有跨浏览器解决方案,您必须在当前窗口中打开网址:

function (data) {
    window.location.href = data.content;
});

或新窗口:

function (data) {
    window.open(data.content);
});

两个限制:

  • 您无法设置文件名客户端,您必须将其设置为服务器端
  • 如果文件可以读取,浏览器将无法下载该文件(如图片,pdf ...),您将不得不使用“另存为”