Maison  >  Article  >  interface Web  >  Introduction à la méthode de téléchargement par lots de fichiers Node vers le local (avec code)

Introduction à la méthode de téléchargement par lots de fichiers Node vers le local (avec code)

不言
不言avant
2019-03-16 10:51:014493parcourir

Cet article vous présente la méthode de téléchargement par lots de fichiers Node au niveau local (avec code). Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

Traitez plusieurs fichiers séparément

Si le nombre de fichiers est contrôlable et qu'il n'y a aucune exigence concernant le format de fichier téléchargé, vous pouvez utiliser la méthode la plus simple pour parcourir directement le fichiers et donnez-les séparément. Chaque lien de téléchargement crée un lien de téléchargement de fichier unique ou de téléchargement iframe.

Téléchargement par lots du package Zip

Bien qu'il soit possible de parcourir tous les fichiers puis de télécharger des fichiers individuels par lots, cette expérience n'est pas très bonne après tout. L'approche consiste à télécharger et à regrouper les fichiers batch dans un format zip.

La première idée d'implémentation est donc la suivante : dans le service proxy, parcourez d'abord tous les fichiers pour demander les données du fichier, puis compressez-les dans un package zip, puis renvoyez le package zip au client.

C'est OK si le volume de téléchargement est relativement petit, mais si les fichiers batch sont très volumineux, l'utilisateur devra attendre que le backend demande toutes les données et les regroupe dans un package compressé avant le front-end peut donner des commentaires. Cela peut prendre beaucoup de temps et l'expérience utilisateur peut être médiocre.

Au cours des recherches préliminaires de collègues, il a été dit qu'il pouvait y avoir une capacité de compression et de téléchargement en streaming. L'idée générale est de réduire le package et d'ajouter une compression en streaming.

......

let fileCounter = 0;
const zippedFilename = encodeURIComponent(downloadData.name);
const list = downloadData.list || [];
const header = {
  'Content-Type': 'application/x-zip',
  'Pragma': 'public',
  'Expires': '0',
  'Cache-Control': 'private, must-revalidate, post-check=0, pre-check=0',
  'Content-disposition': 'attachment; filename="' + zippedFilename + '"',
  'Transfer-Encoding': 'chunked',
  'Content-Transfer-Encoding': 'binary'
};
res.writeHead(200, header);
archive.store = true;
archive.pipe(res);
list.map(item => {
  fileCounter++;
  let inStream = request.get(item.downLoadUrl);
  let name = item.fileName;
  let length = 0;
  inStream.on('response', function(awsData) {
    archive.append(inStream, {
      name: name
    });
  }).on('data', function(data) {
    length += data.length;
  }).on('error', function(e) {
    console.error(name + '-error', e);
  }).on('end', function(endData) {
    fileCounter--;
    if (fileCounter < 1) {
      archive.finalize();
    }
  });
});
archive.on('error', function(err) {
  throw err;
});
archive.on('finish', function(err) {
  return res.end();
});

......

Bien sûr, il reste encore quelques détails à régler : comme le problème des noms de fichiers chinois, si la taille totale des fichiers téléchargés doit être limitée, si le fichier ne le fait pas. exister, etc.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer