Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
让用户通过JavaScript下载文件?_Javascript_Jquery_Ajax_Browser - Fatal编程技术网

让用户通过JavaScript下载文件?

让用户通过JavaScript下载文件?,javascript,jquery,ajax,browser,Javascript,Jquery,Ajax,Browser,我试图有一个按钮,用户可以点击下载文件,但该文件可能不存在,因为它是其他文件的压缩文件,必须生成。我正在用AJAX检查这一点,但一旦我收到一个正确的URL,我不知道如何让用户下载它 window.open(链接“u blank”)尝试打开窗口下载文件,但大多数浏览器会阻止此操作,并将其视为弹出窗口。让用户下载这样的文件的最佳实践是什么?谢谢 下面是我用来参考的JS函数: function getDownloadedFiles() { var INTERVAL_TIME = 3000,

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

window.open(链接“u 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);
            } 
        }
    }); 
} 

也许你可以用一个隐藏的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;
};

最后,正确的解决方案是,我使用了错误的URL

我将链接设置为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);
            } 
        }
    }); 
} 

把窗户打开。如果浏览器无法自动处理该文件,它将自行打开“另存为”对话框。除非用户已经有了首选项集,在这种情况下,它只会将文件下载到他们的驱动器,并在下载完成时通知他们。可能是重复的。我研究了这个问题,解决方案对我不起作用。我发现我没有调用正确的URL,因此代码确实起作用。我要删除这个问题,因为它是一个重复的问题。也许你可以展示更多的代码,说明你是如何使用上面提到的线程来处理你的线程的。我发现我没有调用正确的URL,所以代码确实有效。我要删除这个问题,因为它是重复的。