Как поменять файлы с помощью JavaScript

Есть ли способ zip файлов с помощью JavaScript? Например, как и в почте Yahoo, когда вы выбрали загрузку всех вложений из электронной почты, она становится зашифрованной и загружается в один ZIP файл. Является ли JavaScript этим? Если да, укажите пример кодирования.

Я нашел эту библиотеку под названием jszip для выполнения этой задачи, но она имеет известные и нерешенные проблемы.

Спасибо.

Ответ 1

С новыми API-интерфейсами HTML5 и типизированными массивами вы можете в значительной степени делать все, что захотите, в JavaScript. Однако поддержка браузера не будет большой. Я предполагаю, что вы имели в виду "нерешенные проблемы". Я бы порекомендовал на данный момент сделать это на сервере. Например, в PHP вы можете использовать это расширение.

Ответ 2

На протяжении многих лет JSZip обновлялся. Теперь вы можете найти его на своем репозитории GitHub

Он может использоваться вместе с FileSaver.js

Вы можете установить их с помощью npm:

npm install jszip --save
npm install file-saver --save

И затем импортируйте и используйте их:

import JSZip from 'jszip';
import FileSaver from 'file-saver';

let zip = new JSZip();
zip.file("idlist.txt", 'PMID:29651880\r\nPMID:29303721');
zip.generateAsync({type: "blob"}).then(function(content) {
  FileSaver.saveAs(content, "download.zip");
});

Затем вы загрузите zip файл с именем download.zip, как только вы его извлечете, и вы можете найти внутри файла с именем idlist.txt, который имеет две строки:

PMID:29651880
PMID:29303721

И для вашей справки я протестировал со следующими браузерами, и все прошло:

  • Firefox 59.0.2 (Windows 10)
  • Chrome 65.0.3325.181 (Windows 10)
  • Microsoft Edge 41.16299.371.0 (Windows 10)
  • Internet Explorer 11.0.60 (Windows 10)
  • Opera 52 (Mac OSX 10.13)
  • Safari 11 (Mac OSX 10.13)

Ответ 3

JavaScript способен делать это, но не в кросс-браузере, на который вы можете рассчитывать.

Однако это можно сделать легко с помощью серверного языка. Если вы используете PHP, здесь есть документация для функций PHP ZIP: http://php.net/manual/en/book.zip.php

Ответ 4

Я рекомендовал бы идти прямо к использованию узла встроенной в библиотеке Zlib для этого, который включает в себя изображения; кодировать в базе 64, используя "буферы". Вместо использования пакетов npm. Причины:

  • Zlib является родной библиотекой Node - постоянно обновляется уже почти 10 лет - так что доказательства там для долгосрочной поддержки
  • Узел позволяет работать с буферами - т. Е. Вы можете конвертировать текстовую строку/изображения в исходные двоичные данные и сжимать их с помощью Zlib
  • Легко сжимать и распаковывать большие файлы - использовать потоки узлов для сжатия файлов в МБ или ГБ

Тот факт, что вы используете jszip, позволит мне предположить, что вы используете npm, а также узел; Предполагается, что вы настроили среду правильно, т.е. узел установлен глобально.

Пример: input.txt сжат, чтобы стать input.txt.gz

const zlib = require('zlib');
const fs = require('fs');
const gzip = zlib.createGzip();
const input = fs.createReadStream('input.txt');
const output = fs.createWriteStream('input.txt.gz');

input.pipe(gzip).pipe(output);

Шаг 1: Таким образом, вы require каждый из собственных модулей был из узла - require является частью ES5. Zlib, как ранее упоминалось, и модуль fs модуль файловой системы.

const zlib = require('zlib');
const fs = require('fs');

Шаг 2: Модуль fs, который позволяет вам создать поток чтения, специально предназначен для чтения фрагментов данных. Это вернет объект readstream; читаемый поток

const input = fs.createReadStream(FILE PATH HERE);

__Примечание: этот объект обратного потока снова получает канал; эта цепочка труб на объектах readsteam может возникать бесконечно, делая трубы очень гибкими.

ReadStream.pipe(DoesSomething).pipe(SomethingElse).pipe(ConvertToWriteStream)

Шаг 3: Объект readstream, который был передан по каналам и сжат, затем преобразуется в объект writestream.

const output = fs.createWriteStream('input.txt.gz');

input.pipe(gzip).pipe(output); // returned filename input.txt.gz, within local directory

Таким образом, эта библиотека позволяет легко ввести путь к файлу и решить, где вы хотите, чтобы ваш сжатый файл был. Вы также можете выбрать обратное, если нужно.