Несколько ссылок для загрузки в один zip-файл перед загрузкой javascript

Возможно ли в javascript отправить несколько URL-адресов загрузки в один zip-файл, и этот zip-файл можно загрузить. Итак, на моей веб-странице есть одна кнопка, которая при нажатии загружает zip-файл со всеми файлами из URL-адресов загрузки, сжатых в zip?

Я считаю, что мне нужно использовать jszip или какой-то подобный инструмент. Возможно ли это вообще и есть ли какой-нибудь совет, с чего начать?


person Dude1310    schedule 12.05.2016    source источник
comment
заархивируйте целевые файлы на на стороне сервера и верните URL-адрес после щелчка, а затем выполните загрузку по этому URL-адресу   -  person Yin Gang    schedule 12.05.2016
comment
Что вы подразумеваете под несколькими URL-адресами загрузки?   -  person guest271314    schedule 12.05.2016
comment
@YinGang, но допустим, у меня уже есть ссылки для загрузки файлов, хранящихся в массиве. Как мне заархивировать их, чтобы пользователь мог загрузить только заархивированный файл?   -  person Dude1310    schedule 12.05.2016
comment
Ajax хранящийся массив на стороне сервера --› серверные zip файлы --› возврат URL-адреса в формате zip --› URL-адрес запроса для загрузки.   -  person Yin Gang    schedule 12.05.2016
comment
Все файлы находятся в одном домене на сервере?   -  person guest271314    schedule 12.05.2016
comment
@Gang, как бы я сделал эти первые два шага?   -  person Dude1310    schedule 12.05.2016


Ответы (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

person guest271314    schedule 12.05.2016
comment
Это не работает для URL-адресов, которые необходимо загрузить. Это работает, только если у вас есть файлы html в одной папке. Предположим, у меня есть эта ссылка для скачивания: https://\/\/www.youtubeinmp3.com\/download\/get\/?i=trShzDCP0ESQ5bFdcMpe8y6H6WJvxYLXMa7OtmJMeO%2BfxY1E1Rx5FQwsWk%2BDS9fEoIXCo8QboB0dX6%2FP0e2rJw%3D%3D загружается в одну заархивированную папку. Когда я меняю a.html на предоставленную ссылку, она больше не работает. - person Dude1310; 12.05.2016
comment
@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. - person guest271314; 12.05.2016
comment
Да, но есть способы обойти это, например, загрузив это расширение для Chrome: chrome.google.com/webstore/detail/allow-control-allow-origi/ и даже после того, как я загрузил это, заменив a.html ссылкой для скачивания mp3-файла, который я предоставил не будет работать, потому что выдает ошибку о том, что они не могут найти местоположение mp3-файла, потому что ваш код загружает только те файлы, которые вы уже сохранили, я пытаюсь поместить загруженный файл из Интернета в zip-папку. - person Dude1310; 12.05.2016
comment
@Dude1310 Ссылка для скачивания mp3-файла, которую я предоставил, не будет работать, потому что выдает ошибку о том, что им не удалось найти местоположение mp3-файла Не знаете, где .mp3 фактическое местоположение? Окно загрузки выглядит как <iframe>, при нажатии на которое открывается реклама? Я пытаюсь поместить загруженный из Интернета файл в ZIP-архив Да, какой URL-адрес фактического ресурса, .mp3 файла, который вы хотите загрузить? - person guest271314; 12.05.2016
comment
Если вы нажмете на эту ссылку: https://\/\/www.youtubeinmp3.com\/download\/get\/?i=trShzDCP0ESQ5bFdcMpe8y6H6WJvxYLXMa7OtmJMeO%2FqhE5HNe6etvXNYLqsXm5HkScdBuZ%2BJgrHtb%2FWohCaWg%3D%3D, загрузка mp3-файла начнется сразу. Вместо того, чтобы загружать этот mp3-файл, я хочу поместить его в почтовый индекс с другими mp3-файлами для загрузки. Я использую API для получения файлов mp3 с YouTube. Попробуйте перейти по этой ссылке^ - person Dude1310; 12.05.2016
comment
@Dude1310 Видео не найдено Возможно, вы могли бы отменить экранирование URL? Как щелкнуть ссылку на другой странице с помощью XMLHttpRequest()? Какая прямая ссылка на ресурс? я использую API для получения mp3-файлов с YouTube Ссылка на документацию по API? Или доступен только подход, нажав ссылку для скачивания на странице? - person guest271314; 12.05.2016
comment
О, извините, я думаю, URL-адрес является относительным. Я использую API с этого веб-сайта: youtubeinmp3.com/api попробуйте использовать ссылку json, если вы прокручиваете вниз: www.youtubeinmp3.com/fetch/?format=JSON&video=youtube.com/watch ?v=i62Zjga8JOM возвращает ссылку для скачивания на mp3-файл, который я хочу поместить в заархивированную папку. - person Dude1310; 12.05.2016
comment
@Dude1310 XMLHttpRequest cannot load http://www.youtubeinmp3.com/download/get/?i=Hes1wwZTx03diwb8wuslSc9mm49DGyGQYnbaQZoJuNdlQ6Ago%2BN4LvUUQA5qBs43gzh1APL5HkzCAquh%2Fzceaw%3D%3D. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://stackoverflow.com' is therefore not allowed access. - person guest271314; 12.05.2016
comment
Так это невозможно? или вы можете загрузить это расширение для Chrome, чтобы заставить его работать: chrome.google.com/webstore/detail/allow-control-allow-origi/ - person Dude1310; 12.05.2016
comment
Это действительно сбивает с толку. Но, например, попробуйте другую ссылку для загрузки с вашим кодом, например, замените a.html на pixabay.com/static/uploads/photo/2016/05/05/02/15/, код по-прежнему не работает. - person Dude1310; 12.05.2016
comment
Тот же результат XMLHttpRequest cannot load https://pixabay.com/static/uploads/photo/2016/05/05/02/15/gecko-1373144_640.jpg?attachment%22. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://stackoverflow.com' is therefore not allowed access. - person guest271314; 12.05.2016
comment
Есть ли какие-либо ссылки для загрузки чего-либо, что вы можете найти, что действительно работает? - person Dude1310; 12.05.2016
comment
Ссылку выше пробовали? См. также stackoverflow.com/questions/10143093/ - person guest271314; 12.05.2016
comment
@Dude1310 stackoverflow.com/questions/37176397/; см. также связанную страницу в предыдущем комментарии - person guest271314; 12.05.2016
comment
Спасибо за всю помощь, ха-ха, но все еще немного запутался. Почему я не могу использовать расширение Chrome, чтобы переопределить ошибку? - person Dude1310; 12.05.2016
comment
@ Dude1310 Dude1310 Возможно, выделите время, чтобы прочитать все возможные решения на связанной странице stackoverflow? И ссылки с этой страницы stackoverflow.com/questions /3102819/ - person guest271314; 12.05.2016

Недавно мне пришлось решать ту же проблему, и я нашел решение, используя 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);

})
person M.C.    schedule 22.08.2016
comment
когда я загружаю ваш пример в виде zip-файла и запускаю индексный файл с моего компьютера, ничего не происходит, знаете ли вы причину этого? dropbox.com/s/ 0k4e3s79xp6fsap/ - person Nick Garver; 16.01.2017
comment
Я бы сказал, отладьте метод zipFiles Javascript и посмотрите, что не так. - person M.C.; 16.01.2017
comment
Проблема заключается в том, что вы обращаетесь к ссылке с файлом://: .. Вместо этого вам следует установить локальный сервер (например, XAMPP) и открыть локально с помощью localhost/..../index.html, и тогда ошибка перекрестного происхождения исчезнет - person M.C.; 17.01.2017