Maison  >  Article  >  interface Web  >  Comment obtenir la progression du téléchargement de fichiers dans Node.js ?

Comment obtenir la progression du téléchargement de fichiers dans Node.js ?

亚连
亚连original
2018-06-07 16:56:383038parcourir

Cet article présente principalement comment utiliser progress-stream pour obtenir la progression du téléchargement de fichiers, ainsi que les précautions lors de l'utilisation de ce composant

Aperçu du contenu

multer est un middleware de téléchargement de fichiers Express couramment utilisé. La manière dont le serveur obtient la progression du téléchargement des fichiers est un problème très courant lors de l'utilisation. Certains étudiants de SF ont également posé une question similaire : « Existe-t-il un moyen de vérifier la progression du téléchargement du fichier dans nodejs multer ? » 》. Après une brève réponse, je l'ai compilé ici pour référence par les étudiants qui ont les mêmes questions.

Ce qui suit présente principalement comment utiliser progress-stream pour obtenir la progression du téléchargement du fichier, ainsi que les précautions lors de l'utilisation de ce composant.

Utilisez progress-stream pour obtenir la progression du téléchargement du fichier

Si vous souhaitez simplement obtenir la progression du téléchargement côté serveur, vous pouvez essayez le code suivant. Notez que ce module n'est pas fortement lié à Express et multer et peut être utilisé indépendamment.

var fs = require('fs');
var express = require('express');
var multer = require('multer');
var progressStream = require('progress-stream');
var app = express();
var upload = multer({ dest: 'upload/' });
app.post('/upload', function (req, res, next) {
  // 创建progress stream的实例
  var progress = progressStream({length: '0'}); // 注意这里 length 设置为 '0'
  req.pipe(progress);
  progress.headers = req.headers;
  // 获取上传文件的真实长度(针对 multipart)
  progress.on('length', function nowIKnowMyLength (actualLength) {
    console.log('actualLength: %s', actualLength);
    progress.setLength(actualLength);
  });
  // 获取上传进度
  progress.on('progress', function (obj) {    
    console.log('progress: %s', obj.percentage);
  });
  // 实际上传文件
  upload.single('logo')(progress, res, next);
});
app.post('/upload', function (req, res, next) {
  res.send({ret_code: '0'});
});
app.get('/form', function(req, res, next){
  var form = fs.readFileSync('./form.html', {encoding: 'utf8'});
  res.send(form);
});
app.listen(3000);

Comment obtenir la taille réelle du fichier téléchargé

Pour le type en plusieurs parties, vous devez écouter la longueur pour obtenir la taille réelle du fichier. (Le document officiel utilise l'événement de condamnation, ce qui est effectivement problématique)

// 获取上传文件的真实长度(针对 multipart)
progress.on('length', function nowIKnowMyLength (actualLength) {
  console.log('actualLength: %s', actualLength);
  progress.setLength(actualLength);
});

3. Concernant le bug en cours-stream obtenant la taille réelle du fichier ?

Pour le téléchargement de fichiers en plusieurs parties, lorsque l'instance de flux de progression est initialisée, le paramètre length doit transmettre un type non numérique, sinon la progression que vous obtiendrez sera toujours 0, et enfin passer directement à 100 .

Quant à la raison pour laquelle cela se produit, cela devrait être un bug dans le module progress-steram. Lorsque la longueur est de type numéro, le code saute directement, donc votre longueur est toujours considérée comme égale à 0.

tr.on('pipe', function(stream) {
  if (typeof length === 'number') return;
  // Support http module
  if (stream.readable && !stream.writable && stream.headers) {
    return onlength(parseInt(stream.headers['content-length'] || 0));
  }
  // Support streams with a length property
  if (typeof stream.length === 'number') {
    return onlength(stream.length);
  }
  // Support request module
  stream.on('response', function(res) {
    if (!res || !res.headers) return;
    if (res.headers['content-encoding'] === 'gzip') return;
    if (res.headers['content-length']) {
      return onlength(parseInt(res.headers['content-length']));
    }
  });
});

J'ai compilé ce qui précède pour vous, j'espère que cela vous sera utile à l'avenir.

Articles associés :

Comment vux implémente la fonction d'actualisation pull-up

Comment implémenter les appels entre méthodes dans vue

Comment utiliser le composant de téléchargement Upload d'element-ui dans vue

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:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn