Как заархивировать файлы с помощью библиотеки jszip

Я работаю над автономным приложением, используя HTML5 и jquery для мобильных устройств. я хочу сделать резервную копию файлов из локального хранилища с помощью jszip. ниже приведен фрагмент кода того, что я сделал...

  if (localStorageKeys.length > 0) {
            for (var i = 0; i < localStorageKeys.length; i++) {
                var key = localStorageKeys[i];
                if (key.search(_instrumentId) != -1) {                  
                        var data = localStorage.getItem(localStorageKeys[i])
                        var zip = new JSZip();
                        zip.file(localStorageKeys[i] + ".txt", data);
                        var datafile = document.getElementById('backupData');
                        datafile.download = "DataFiles.zip";
                        datafile.href = window.URL.createObjectURL(zip.generate({ type: "blob" }));                        
                }
                else {

                }


            }

        }

в приведенном выше коде я перебираю содержимое локального хранилища и сохраняю файл ezch в текстовом формате. проблема, с которой я столкнулся, заключается в том, как создать несколько текстовых файлов внутри DataFiles.zip, так как в настоящее время я могу создать только один текстовый файл внутри заархивированной папки. Я новичок в javascript, поэтому в моем вопросе нет никакой двусмысленности. заранее спасибо.


person JoseLuke    schedule 01.08.2013    source источник


Ответы (4)


Просто продолжайте звонить zip.file().

Посмотрите на пример с их страницы документации (комментарии мои):

var zip = new JSZip();

// Add a text file with the contents "Hello World\n"
zip.file("Hello.txt", "Hello World\n");

// Add a another text file with the contents "Goodbye, cruel world\n"
zip.file("Goodbye.txt", "Goodbye, cruel world\n");

// Add a folder named "images"
var img = zip.folder("images");

// Add a file named "smile.gif" to that folder, from some Base64 data
img.file("smile.gif", imgData, {base64: true});

zip.generateAsync({type:"base64"}).then(function (content) {
     location.href="data:application/zip;base64," + content;
});

Важно понимать код, который вы написали — узнавать, что делает каждая строка. Если вы сделаете это, вы поймете, что вам просто нужно снова вызвать zip.file(), чтобы добавить еще один файл.

person Jonathon Reinhart    schedule 01.08.2013
comment
@Jonathon... Большое спасибо... это сработало отлично. вы объяснили мне это, как будто я был двухлетним ребенком, и я доволен. еще раз спасибо - person JoseLuke; 01.08.2013
comment
Что вы храните в переменной imgData? Потому что я пытаюсь добиться того же результата, но записываю в него mp3. - person Eduardo La Hoz Miranda; 29.09.2014
comment
@EduardoLaHozMiranda В этом случае это будет необработанное изображение GIF, закодированное в Base64. Вы хотите использовать первую форму, которая представляет собой просто необработанные строковые данные. - person Jonathon Reinhart; 30.09.2014

Если вы получаете список файлов (из пользовательского интерфейса или массива или чего-то еще), вы можете сначала сделать сжатие, а затем заархивировать. Код примерно такой:

function upload(files){

    var zip = new JSZip();                       
    let archive = zip.folder("test");

    files.map(function(file){
        files.file(file.name, file.raw, {base64: true});
    }.bind(this));

    return archive.generateAsync({
        type: "blob",
        compression: "DEFLATE",
        compressionOptions: {
           level: 6
        }
    }).then(function(content){ 
        // send to server or whatever operation
    });
}

это сработало для меня в нескольких файлах json. Может быть, это помогает.

person Mara Black    schedule 14.02.2018

Добавляя к ответу @Jonathon Reinhart,
Вы также можете указать имя файла и путь одновременно

// create a file and a folder
zip.file("nested/hello.txt", "Hello World\n");
// same as
zip.folder("nested").file("hello.txt", "Hello World\n");
person Gal Margalit    schedule 15.08.2017

Если вы хотите заархивировать файлы и вам нужен вывод base64, вы можете использовать приведенный ниже код:

import * as JSZip from 'jszip'


var zip = new JSZip();
    zip.file("Hello.json", this.fileContent);
    zip.generateAsync({ type: "base64" }).then(function (content) {
      const base64Data = content

person Sandesh Tayde    schedule 24.09.2020