Existe-t-il un moyen de compresser des fichiers en utilisant JavaScript ?? Par exemple, comme dans Yahoo mail, lorsque vous avez choisi de télécharger toutes les pièces jointes d'un e-mail, il est compressé et téléchargé dans un seul fichier Zip. JavaScript est-il capable de faire cela? Si oui, veuillez fournir un exemple de codage.
J'ai trouvé cette bibliothèque appelée jszip pour faire la tâche mais elle a des problèmes connus et non résolus.
Comment puis-je résoudre le problème?
JSZip a été mis à jour au fil des ans. Maintenant, vous pouvez le trouver sur son dépôt GitHub
Il peut être utilisé avec FileSaver.js
Vous pouvez les installer en utilisant npm:
npm install jszip --save
npm install file-saver --save
Et puis importez-les et utilisez-les:
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");
});
Ensuite, vous téléchargerez un fichier Zip appelé download.Zip, une fois que vous l'avez extrait, et vous pouvez trouver à l'intérieur d'un fichier appelé idlist.txt, qui a deux lignes:
PMID:29651880
PMID:29303721
Et pour votre référence, j'ai testé avec les navigateurs suivants, et tous ont réussi:
Je recommanderais d'utiliser directement Node's bibliothèque intégrée Zlib pour cela, qui comprend des images; encoder en base 64 en utilisant des "tampons". Plutôt que d'utiliser npm packages. Les raisons étant:
Le fait que vous utilisiez jszip me permettrait de deviner que vous utilisez aussi bien npm que node; suppose que vous avez correctement configuré votre environnement, c'est-à-dire que le nœud est installé à l'échelle mondiale.
Exemple: input.txt compressé pour devenir 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);
Étape 1: Donc, vous require
chacun des modules natifs du nœud - vous avez besoin fait partie d'ES5. Zlib comme mentionné précédemment, et le module fs
, le module File System.
const zlib = require('zlib');
const fs = require('fs');
Étape 2: Le module fs, qui vous permet de créer un readstream, est spécifiquement appelé pour lire des blocs de données. Cela renverra un objet readstream; flux lisible
const input = fs.createReadStream(FILE PATH HERE);
__Note: Cet objet de flux de lecture est ensuite redirigé; ce chaînage de tuyaux sur des objets lisibles peut se produire à l'infini, ce qui rend les tuyaux très flexibles.
ReadStream.pipe(DoesSomething).pipe(SomethingElse).pipe(ConvertToWriteStream)
Étape 3: L'objet du flux de lecture, qui a été canalisé et compressé, est ensuite converti en objet writestream.
const output = fs.createWriteStream('input.txt.gz');
input.pipe(gzip).pipe(output); // returned filename input.txt.gz, within local directory
Cette bibliothèque vous permet donc de saisir facilement un chemin de fichier et de décider où vous voulez que votre fichier compressé soit. Vous pouvez également choisir de faire l'inverse, si besoin est.
Avec les nouvelles API de fichiers HTML5 et les tableaux typés, vous pouvez à peu près faire tout ce que vous voulez en JavaScript. Cependant, le support du navigateur ne sera pas génial. Je suppose que c'est ce que vous vouliez dire par "problèmes non résolus". Je recommanderais, pour le moment, de le faire sur le serveur. Par exemple, en PHP, vous pouvez utiliser cette extension.
En utilisant JSZIP, nous pouvons générer et télécharger un fichier Zip en JavaScript. Pour cela, vous devez suivre les étapes ci-dessous
Importez le fichier jszip.js dans votre fichier html comme ci-dessous
<script type="text/javascript" src="jszip.js"></script>
Ajoutez la fonction ci-dessous dans votre code et appelez-la
onClickDownload: function () {
var Zip = new JSZip();
for (var i = 0; i < 5; i++) {
var txt = 'hello';
Zip.file("file" + i + ".txt", txt);
}
Zip.generateAsync({
type: "base64"
}).then(function(content) {
window.location.href = "data:application/Zip;base64," + content;
});
}
Vous pouvez télécharger un exemple de code depuis mon référentiel git ici ( lien GIT )
JavaScript est capable de le faire, mais pas d'une manière multi-navigateur sur laquelle vous pouvez compter.
Cela peut cependant être fait facilement avec un langage côté serveur. Si vous avez l'habitude de PHP voici la documentation des fonctions Zip de PHP: http://php.net/manual/en/book.Zip.php