让用户通过JavaScript下载文件?

时间:2014-06-18 14:35:25

标签: javascript jquery ajax browser

我正在尝试使用一个用户可以单击下载文件的按钮,但该文件可能不存在,因为它是其他文件的压缩文件,必须生成。我正在使用AJAX进行检查,但是一旦我收到正确的URL,我就不知道如何让用户下载它。

window.open(link, '_blank');尝试打开窗口下载文件,但大多数浏览器会阻止此操作并将其视为弹出窗口。让用户下载这样的文件的最佳做法是什么?感谢。

这是我用来参考的JS函数:

function getDownloadedFiles() {
    var INTERVAL_TIME = 3000,
        $projectView  = $('#project-view'),
        id            = $projectView.data("project-id");
    $.ajax({
        type: "GET",
        url: AJAX_URL + id,
        success: function(data) {
            if (data.success) {
                var link =  data.profiler.link;
                window.open(link, '_blank');
            } else {
                setTimeout(getDownloadedFiles, INTERVAL_TIME);
            } 
        }
    }); 
} 

2 个答案:

答案 0 :(得分:-1)

也许你可以使用隐藏的iframe。试试这个:

var downloadURL = function downloadURL(url) {
    var hiddenIFrameID = 'hiddenDownloader',
    iframe = document.getElementById(hiddenIFrameID);
    if (iframe === null) {
        iframe = document.createElement('iframe');
        iframe.id = hiddenIFrameID;
        iframe.style.display = 'none';
        document.body.appendChild(iframe);
    }
    iframe.src = url;
};

只是Download File Using Javascript/jQuery

的无耻撕裂

答案 1 :(得分:-1)

最后,正确的解决方案是Download File Using Javascript/jQuery,我使用了错误的网址。

我将链接设置为data.profiler.link,当它真的是data.data.link并且让自己感到困惑时。

这是我的最终代码:

function getDownloadedFiles() {
    var INTERVAL_TIME = 3000,
        $projectView  = $('#project-view'),
        id            = $projectView.data("project-id");
    $.ajax({
        type: "GET",
        url: AJAX_URL + id,
        success: function(data) {
            if (data.success) {
                var link =  data.data.link,
                    hiddenIFrameID = 'hiddenDownloader',
                    iframe = document.getElementById(hiddenIFrameID);
                if (iframe === null) {
                    iframe = document.createElement('iframe');
                    iframe.id = hiddenIFrameID;
                    iframe.style.display = 'none';
                    document.body.appendChild(iframe);
                }
                iframe.src = link;
            } else {
                setTimeout(getDownloadedFiles, INTERVAL_TIME);
            } 
        }
    }); 
}