Heim  >  Artikel  >  Web-Frontend  >  Wie erhalte ich den Datei-Upload-Fortschritt in Node.js?

Wie erhalte ich den Datei-Upload-Fortschritt in Node.js?

亚连
亚连Original
2018-06-07 16:56:383038Durchsuche

In diesem Artikel wird hauptsächlich die Verwendung von Progress-Stream zum Abrufen des Datei-Upload-Fortschritts sowie Vorsichtsmaßnahmen bei der Verwendung dieser Komponente vorgestellt

Inhaltsübersicht

multer ist eine häufig verwendete Express-Datei-Upload-Middleware. Wie der Server den Fortschritt des Datei-Uploads erhält, ist ein sehr häufiges Problem während der Verwendung. Einige SF-Studenten stellten auch eine ähnliche Frage: „Gibt es eine Möglichkeit, den Datei-Upload-Fortschritt in NodeJS Multer zu überprüfen?“ 》. Nach einer kurzen Antwort habe ich es hier als Referenz für Studierende zusammengestellt, die die gleichen Fragen haben.

Im Folgenden wird hauptsächlich die Verwendung von progress-stream zum Abrufen des Datei-Upload-Fortschritts sowie die Vorsichtsmaßnahmen bei der Verwendung dieser Komponente vorgestellt.

Verwenden Sie Progress-Stream, um den Datei-Upload-Fortschritt abzurufen

Wenn Sie nur den Upload-Fortschritt auf der Serverseite abrufen möchten, können Sie dies tun Probieren Sie den folgenden Code aus. Beachten Sie, dass dieses Modul nicht stark an Express und Multer gebunden ist und unabhängig verwendet werden kann.

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);

So ermitteln Sie die tatsächliche Größe der hochgeladenen Datei

Beim Multipart-Typ müssen Sie auf die Länge achten, um die tatsächliche Größe der Datei zu ermitteln. (Das offizielle Dokument verwendet das Überzeugungsereignis, was tatsächlich problematisch ist)

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

3 Bezüglich des Fehlers im Progress-Stream beim Ermitteln der tatsächlichen Dateigröße?

Beim mehrteiligen Datei-Upload muss bei der Initialisierung der Progress-Stream-Instanz die Parameterlänge einen nicht numerischen Typ übergeben, andernfalls ist der Fortschritt, den Sie erhalten, immer 0 und schließlich Springe direkt auf 100 .

Was den Grund dafür betrifft, dass es sich um einen Fehler im Progress-Steram-Modul handelt, schauen Sie sich den Quellcode des Moduls an. Wenn die Länge vom Typ Zahl ist, wird der Code direkt übersprungen, sodass Ihre Länge immer als 0 betrachtet wird.

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']));
    }
  });
});

Ich habe das Obige für Sie zusammengestellt und hoffe, dass es Ihnen in Zukunft hilfreich sein wird.

Verwandte Artikel:

Wie Vux die Pull-up-Refresh-Funktion implementiert

So implementieren Sie Aufrufe zwischen Methoden in Vue

So verwenden Sie die Upload-Upload-Komponente von element-ui in Vue

Das obige ist der detaillierte Inhalt vonWie erhalte ich den Datei-Upload-Fortschritt in Node.js?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn