单击按钮时,如何让用户下载多个文件?

IT技术 javascript html apache extjs download
2021-01-20 16:32:00

所以我有一个 httpd 服务器正在运行,它有一堆文件的链接。假设用户从文件列表中选择三个文件进行下载,它们位于:

mysite.com/file1 
mysite.com/file2
mysite.com/file3

当他们单击下载按钮时,我希望他们从上面的链接下载这三个文件。

我的下载按钮看起来像:

var downloadButton = new Ext.Button({
  text: "Download",
  handler: function(){
    //download the three files here
  }
});
6个回答

最好的方法是将您的文件压缩并链接到该文件:

可以在此处找到其他解决方案:如何使链接在单击时打开多个页面

其中陈述如下:

HTML:

<a href="#" class="yourlink">Download</a>

JS:

$('a.yourlink').click(function(e) {
    e.preventDefault();
    window.open('mysite.com/file1');
    window.open('mysite.com/file2');
    window.open('mysite.com/file3');
});

话虽如此,我仍然会压缩文件,因为这个实现需要 JavaScript,有时也可以作为弹出窗口被阻止。

所以我无权访问 preventDefault() 函数,无论如何我可以等待用户在打开第二个文件之前对第一个文件执行操作吗?发生的事情是它直接进入第三个文件,而我无法下载前两个文件。
2021-03-14 16:32:00
然后最好创建 2 个页面:mysite.com/file1.html 和 mysite.com/file2.html。当每个加载时,您可以开始该页面的文件下载。并且需要用户交互。验证交互后,加载下一页。(我不确定我是否解释正确)
2021-03-14 16:32:00
你说的是什么动作?因为我不确定您是否可以跟踪它。
2021-03-26 16:32:00
我的电话是 window.open('mysite.com/file1', '_parent'); 它覆盖了所有其他窗口(这不起作用,因为我需要等待每个窗口上的用户交互)。我之所以使用_self,是因为我不想切换窗口,我想留在父窗口。
2021-04-13 16:32:00

这是最适合我的方法,没有打开新标签,而是下载了我需要的文件/图像:

var filesForDownload = [];
filesForDownload( { path: "/path/file1.txt", name: "file1.txt" } );
filesForDownload( { path: "/path/file2.jpg", name: "file2.jpg" } );
filesForDownload( { path: "/path/file3.png", name: "file3.png" } );
filesForDownload( { path: "/path/file4.txt", name: "file4.txt" } );

$jq('input.downloadAll').click( function( e )
{
    e.preventDefault();

    var temporaryDownloadLink = document.createElement("a");
    temporaryDownloadLink.style.display = 'none';

    document.body.appendChild( temporaryDownloadLink );

    for( var n = 0; n < filesForDownload.length; n++ )
    {
        var download = filesForDownload[n];
        temporaryDownloadLink.setAttribute( 'href', download.path );
        temporaryDownloadLink.setAttribute( 'download', download.name );

        temporaryDownloadLink.click();
    }

    document.body.removeChild( temporaryDownloadLink );
} );
temporaryDownloadLink.setAttribute('href', 'data:application/octet-stream,' + encodeURIComponent( download.path)); 必须强制浏览器下载图像而不是在新选项卡中打开它。
2021-03-23 16:32:00
我刚刚使用了这个代码@Dan,我在 chrome 中遇到了问题,它忽略了快速点击,所以不得不设置超时。
2021-03-24 16:32:00
仅供阅读本文的其他人参考:下载属性不适用于跨域请求(至少对于最新版本的 Chrome)。我认为它曾经但被修补了
2021-04-04 16:32:00
@IainMNorman 有趣的问题,超时似乎是一个足够好的解决方案,不知道还能如何解决
2021-04-09 16:32:00

我喜欢click()多个文件下载中的a元素上执行事件for loop仅适用于有限数量的文件(在我的情况下为 10 个文件)。可以解释这种对我有意义的行为的唯一原因是click()事件执行的下载速度/间隔

我发现,如果我减慢click()事件的执行速度,那么我将能够下载所有文件。

这是对我有用的解决方案。

var urls = [
  'http://example.com/file1',
  'http://example.com/file2',
  'http://example.com/file3'
]

var interval = setInterval(download, 300, urls);

function download(urls) {
  var url = urls.pop();

  var a = document.createElement("a");
  a.setAttribute('href', url);
  a.setAttribute('download', '');
  a.setAttribute('target', '_blank');
  a.click();

  if (urls.length == 0) {
    clearInterval(interval);
  }
}

click()每 300 毫秒执行一次下载事件当没有更多的要下载的文件urls.length == 0,然后,我执行clearIntervalinterval功能停止下载。

我认为 10 是浏览器中配置的最大连接数。
2021-03-15 16:32:00
我知道按时间间隔执行代码应该是可以避免的,但有时你必须做你必须做的事情。
2021-04-04 16:32:00
Lukasz:不受程序控制。我的最佳答案是 Chrome 有硬编码限制,而 Firefox 则位于network.http.max-persistent-connections-per-server下的 about:config
2021-04-05 16:32:00
@CodeWriter23 可能是这样。你能提供任何可以max number of connections在 Chrome 和 Firefox 中设置的链接吗?
2021-04-12 16:32:00

您可以:

  1. 压缩所选文件并返回一个压缩文件。
  2. 打开多个弹出窗口,每个提示下载。

注意 - 选项一客观上更好。

编辑 找到一个选项三:https : //stackoverflow.com/a/9425731/1803682

选项3是!
2021-03-20 16:32:00

我通过使用 window.location 以不同的方式解决了这个问题。它适用于 Chrome,幸运的是它是我必须支持的唯一浏览器。可能对某人有用。我最初使用了 Dan 的答案,这也需要我在这里使用的超时时间,否则它只下载了一个文件。

var linkArray = [];
linkArray.push("http://example.com/downloadablefile1");
linkArray.push("http://example.com/downloadablefile2");
linkArray.push("http://example.com/downloadablefile3");    

function (linkArray) {
  for (var i = 0; i < linkArray.length; i++) { 
    setTimeout(function (path) { window.location = path; }, 200 + i * 200, linkArray[i]);
  }        
};
这也适用于 Firefox,据报道也适用于 Edge,但我对自己测试没有兴趣(无论如何,Edge 正在迁移到 Blink - 很好的摆脱)。
2021-03-23 16:32:00