J'ai une fonction qui télécharge actuellement plusieurs images et les enregistre dans le dossier de téléchargement des utilisateurs (ne fonctionne que dans Chrome)
Je veux prendre cette fonction à l'étape suivante et mettre ces images dans un seul fichier Zip.
Voici un exemple de mon code actuel. Je veux fusionner mon code avec l'API JSZip que j'ai trouvée en ligne ici .
J'ai déjà fait l'installation de Bower pour cette API JSZip et inclus le script dans mon html.
Voici mon code qui fonctionne parfaitement en téléchargeant plusieurs images SINGLE à la fois:
$scope.downloadPhotos = function() {
var photoUrls = [];
for (var x = 0; x < $scope.$parent.photos.length; x++) {
var p = $scope.$parent.photos[x];
if (p.isChecked) {
photoUrls.Push($scope.bucketUrl() + p.photoUrl);
}
}
saveImage(photoUrls);
};
/*----this function saveImage works great (only Chrome)-----*/
function saveImage(urls) {
var link = document.createElement('a');
link.setAttribute('download', null);
link.style.display = 'none';
document.body.appendChild(link);
for (var i = 0; i < urls.length; i++) {
link.setAttribute('href', urls[i]);
link.click();
}
document.body.removeChild(link);
}
Et voici l'exemple de code API JSZip pour créer un fichier Zip avec du contenu:
function create_Zip() {
var Zip = new JSZip();
Zip.add("hello1.txt", "Hello First World\n");
Zip.add("hello2.txt", "Hello Second World\n");
content = Zip.generate();
location.href = "data:application/Zip;base64," + content;
}
Maintenant, je me demande simplement comment combiner les deux pour mettre mes images dans un fichier zip. Merci de votre aide!
Pour télécharger plusieurs fichiers au format Zip, nous pouvons utiliser jsZip et FileSaver.js ou si nous utilisons Web API et Angularjs, nous pouvons créer une méthode API pour créer un fichier d'archive Zip sur le serveur, puis dans angularjs, nous pouvons utiliser $ http post ou obtenir appel api pour télécharger le fichier en tant que fichier Zip (Nous devons utiliser filesaver pour enregistrer le fichier au format Zip). par exemple -
appel api dans angularjs -
function downloadFiles(files) {
return $http.post(baseUrl + 'api/download/files', files, { responseType: 'arraybuffer' });
}
appeler la fonction ci-dessus et sur la réponse utiliser la méthode fileSaver.js saveAs pour enregistrer le fichier au format Zip par exemple -
//files - array input of files like http://www.example.com/file1.png', 'http://www.example.com/file2.jpeg', 'http://www.example.com/file3.jpg'];
downloadFiles(files).then(function (response) {
//on success
var file = new Blob([response.data], { type: 'application/Zip' });
saveAs(file, 'example.Zip');
}, function (error) {
//on error
//write your code to handle error
});
J'ai mis cela ensemble qui vous permettra de compresser un tableau d'URL d'image.
https://jsfiddle.net/jaitsujin/zrdgsjht/
Vous pouvez gérer la structure du dossier Zip en modifiant cette ligne
filename = filename.replace(/[\/\*\|\:\<\>\?\"\\]/gi, '').replace("httpsi.imgur.com","");
function downloadImageAsZip(imageUrl){
var Zip = new JSZip();
var img = new Image();
img.crossOrigin = 'Anonymous';
img.src = imageUrl;
img.onload = function() {
$scope.count2++;
var canvas = document.createElement('CANVAS');
var ctx = canvas.getContext('2d');
var dataURL;
canvas.height = img.height;
canvas.width = img.width;
ctx.drawImage(this, 0, 0);
ctx.enabled = false;
dataURL = canvas.toDataURL("Canvas");
canvas = null;
//var base64String = dataURL.replace("/^data:image\/(png|jpg);base64,/", "");
var base64String = dataURL.replace("data:image/png;base64,", "");
Zip.file("ImageName", base64String, {base64: true});
Zip.generateAsync({type:"blob"}).then(function(content) {
saveAs(content, "ZipFileName.Zip");
});
}
}
Vous devriez voir cet exemple . Actuellement, il vous suffit de demander au navigateur de déclencher le téléchargement d'un fichier. Si vous souhaitez créer un côté client de fichier Zip, votre code js doit accéder au contenu des fichiers avec des appels ajax (vous obtiendrez des problèmes CORS s'ils ne sont pas stockés sur le même serveur).
Sans copier/coller tout le code, l'exemple:
responseType = "arraybuffer"
si vous ne supportez que les navigateurs récents)