在下载 javascript 之前,多个下载链接指向一个 zip 文件

IT技术 javascript url download jszip
2021-02-15 01:42:54

是否可以在 javascript 中将多个下载 url 发送到一个 zip 文件中,并且可以下载该 zip 文件。非常多,在我的网页上,有一个按钮,单击该按钮时会从下载 url 中下载所有文件的 zip 文件,并将其压缩为 zip 文件?

我相信我需要使用 jszip 或类似的工具。这完全可能吗?有什么关于从哪里开始的建议吗?

2个回答

您可以使用JSZip.js, XMLHttpRequest(), Array.prototype.map(),在所有文件请求完成后Promise.all()创建.zip文件;使用<a>带有元素download属性设置为objectURL.zip在文件JSZip .generateAsync()功能,点击a元素应该显示Save File对话框,创建.zip可下载的文件。

<head>
  <script src="jszip.js"></script>
  <script>
    window.onload = function() {
      var zip = new JSZip();
      var a = document.querySelector("a");
      var urls = ["a.html", "b.html"];

      function request(url) {
        return new Promise(function(resolve) {
          var httpRequest = new XMLHttpRequest();
          httpRequest.open("GET", url);
          httpRequest.onload = function() {
            zip.file(url, this.responseText);
            resolve()
          }
          httpRequest.send()
        })
      }

      Promise.all(urls.map(function(url) {
          return request(url)
        }))
        .then(function() {
          console.log(zip);
          zip.generateAsync({
              type: "blob"
          })
          .then(function(content) {
            a.download = "folder" + new Date().getTime();
            a.href = URL.createObjectURL(content);
            a.innerHTML = "download " + a.download;
          });
        })
    }
  </script>
</head>

<body>
  <a href="" download>download</a>
</body>

plnkr http://plnkr.co/edit/baPtkILg927DtJfh4b5Y?p=preview

是的,但有一些方法可以解决这个问题,例如下载这个 chrome 扩展:chrome.google.com/webstore/detail/allow-control-allow-origi /... 甚至在我下载之后,用下载替换 a.html我提供的 mp3 文件的链接不起作用,因为它给出了一个错误,指出他们找不到 mp3 文件的位置,因为您的代码只下载您已经保存的文件,我正在尝试将下载的文件从互联网到一个 zip 文件夹。
2021-04-22 01:42:54
如果你按下这个链接:https:\/\/www.youtubeinmp3.com\/download\/get\/?i=trShzDCP0ESQ5bFdcMpe8y6H6WJvxYLXMa7OtmJMeO%2FqhE5HNe6etvXNYLqsXm5HkScdBuZ%2BJ2F3D3D 开始下载 %2BJG3D3D 开始下载文件。我不想下载那个 mp3 文件,而是想将它与其他 mp3 文件一起放入一个 zip 文件中以供下载。我正在使用 api 从 youtube 获取 mp3 文件。尝试去那个链接^
2021-04-25 01:42:54
@Dude1310 “我提供的 mp3 文件的下载链接不起作用,因为它给出了一个错误,指出他们找不到 mp3 文件的位置”不确定.mp3实际位置在哪里?“下载”窗口似乎是<iframe>点击后会打开广告?“我正在尝试将从 Internet 下载的文件放入 zip 文件夹”是的,.mp3您要下载的实际资源文件的 URL 是什么
2021-04-28 01:42:54
这不适用于需要下载的网址。仅当您在同一文件夹中有 html 文件时才有效。假设我有这个下载链接:https:\/\/www.youtubeinmp3.com\/download\/get\/?i=trShzDCP0ESQ5bFdcMpe8y6H6WJvxYLXMa7OtmJMeO%2BfxY1E1Rx5FQwsWk%2BDS9fEoIXdX0%2DwsWk%2BDS9fEoIXdX0%2DwsWk下载到一个压缩文件夹中。当我将 a.html 更改为我提供的链接时,它不再有效。
2021-05-01 01:42:54
@Dude1310 “当我将 a.html 更改为我提供的链接时,它不再有效。” 该 URL 没有Access-Control-Allow-Origin设置标题XMLHttpRequest cannot load https://www.youtubeinmp3.com/download/?video=https://www.youtube.com/watch?v=i62Zjga8JOM. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://stackoverflow.com' is therefore not allowed access.
2021-05-09 01:42:54

我最近不得不解决同样的问题,并找到了使用JSZipUtils的解决方案

可以在此处找到解决方案http://plnkr.co/edit/vWARo0dXbkgzmjyoRNi0?p=preview

我有两个文件,我想通过用户浏览器压缩和下载它们,我getBinaryContent(path, callback)在这两个文件上调用了该函数这里的路径是文件的存储位置。

这两个文件是 .wav 文件和 .json 文件。它们中的每一个都应该被区别对待,因此您应该{base64:true,binary:true}将 .wav 文件和{binary:true}json 文件用作JSZip函数文件的参数

代码也可以在这里找到

var file_confirmation=[false,false];
var file_name=["test1.wav","test.json"];
var urlList =["test.wav","test.json"];

var filenameSave ="myZip";


function zipFiles(id,urls)
{
    zip = new JSZip();

JSZipUtils.getBinaryContent(urls[0],function (err, data) 
{
    if(!err)
    {
        var dic={base64:true,binary:true}; //WAV File Encoding
        zip.file(file_name[0], data, dic);
        file_confirmation[0]=true;
        downloadZipIfAllReady(id);
    }
});

JSZipUtils.getBinaryContent(urls[1],function (err, data) 
    {
        if(!err)
        {
            var dic={binary:true}; //JSON File Encoding
            zip.file(file_name[1], data, dic);
            file_confirmation[1]=true;
            downloadZipIfAllReady(id);
        }
    });
}    

function downloadZipIfAllReady(id)
    {
        if(file_confirmation.every(function(element, index, array) {return element;}))
        {
             zip.generateAsync({type:"blob"})
                .then(function(content)
                {
                  var a = document.querySelector("#"+id);
                  a.download = filenameSave;
                  a.href = URL.createObjectURL(content);
                  a.click();
            });
    }
}


$(document).ready(function()
{

 zipFiles("a_id",urlList);

})
当我将您的示例下载为 zip 文件并从我的计算机上运行索引文件时,没有任何反应,您知道有什么原因吗?dropbox.com/s/0k4e3s79xp6fsap/...
2021-04-19 01:42:54
问题是您使用 file://: .. 访问链接
2021-05-06 01:42:54
我会说调试 Javascript zipFiles 方法,看看有什么问题。
2021-05-13 01:42:54