欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Node.js上傳文件功能之服務(wù)端如何獲取文件上傳進度

 更新時間:2018年02月05日 08:52:59   作者:程序猿小卡  
這篇文章主要介紹如何利用progress-stream獲取文件上傳進度,以及該組件使用過程中的注意事項

內(nèi)容概述

multer是常用的Express文件上傳中間件。服務(wù)端如何獲取文件上傳的進度,是使用的過程中,很常見的一個問題。在SF上也有同學問了類似問題《nodejs multer有沒有查看文件上傳進度的方法?》。稍微回答了下,這里順便整理出來,有同樣疑問的同學可以參考。

下文主要介紹如何利用progress-stream獲取文件上傳進度,以及該組件使用過程中的注意事項。

利用progress-stream獲取文件上傳進度

如果只是想在服務(wù)端獲取上傳進度,可以試下如下代碼。注意,這個模塊跟Express、multer并不是強綁定關(guān)系,可以獨立使用。

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) {
  // 創(chuàng)建progress stream的實例
  var progress = progressStream({length: '0'}); // 注意這里 length 設(shè)置為 '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);

如何獲取上傳文件的真實大小

multipart類型,需要監(jiān)聽length來獲取文件真實大小。(官方文檔里是通過conviction事件,其實是有問題的)

// 獲取上傳文件的真實長度(針對 multipart)
progress.on('length', function nowIKnowMyLength (actualLength) {
  console.log('actualLength: %s', actualLength);
  progress.setLength(actualLength);
});

3、關(guān)于progress-stream獲取真實文件大小的bug?

針對multipart文件上傳,progress-stream 實例子初始化時,參數(shù)length需要傳遞非數(shù)值類型,不然你獲取到的進度要一直是0,最后就直接跳到100。

至于為什么會這樣,應(yīng)該是 progress-steram 模塊的bug,看下模塊的源碼。當length是number類型時,代碼直接跳過,因此你length一直被認為是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']));
    }
  });
});

總結(jié)

以上所述是小編給大家介紹的Node.js上傳文件功能之服務(wù)端如何獲取文件上傳進度,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • Node工程的依賴包管理方式

    Node工程的依賴包管理方式

    在前端工程化中,JavaScript 依賴包管理是非常重要的一環(huán)。依賴包通常是項目所依賴的第三方庫、工具和框架等資源,它們能夠幫助我們減少重復開發(fā)、提高效率并且確保項目可以正確的運行。本文詳細介紹了Node工程的依賴包管理方式,感興趣的同學可以參考一下
    2023-04-04
  • NodeJS仿WebApi路由示例

    NodeJS仿WebApi路由示例

    本篇文章主要介紹了NodeJS仿WebApi路由示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • Node.js中path.resolve與path.join的區(qū)別與作用詳解

    Node.js中path.resolve與path.join的區(qū)別與作用詳解

    path.resolve和path.join都是屬于path核心模塊下的方法,用來拼接路徑,下面這篇文章主要給大家介紹了關(guān)于Node.js中path.resolve與path.join的區(qū)別與作用的相關(guān)資料,需要的朋友可以參考下
    2023-03-03
  • Node?ORM項目中使用Sequelize實例詳解

    Node?ORM項目中使用Sequelize實例詳解

    這篇文章主要為大家介紹了Node?ORM項目中使用Sequelize實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • node如何實現(xiàn)cmd彈窗交互之inquirer

    node如何實現(xiàn)cmd彈窗交互之inquirer

    這篇文章主要介紹了node如何實現(xiàn)cmd彈窗交互之inquirer問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • node.js與C語言 實現(xiàn)遍歷文件夾下最大的文件,并輸出路徑,大小

    node.js與C語言 實現(xiàn)遍歷文件夾下最大的文件,并輸出路徑,大小

    這篇文章主要介紹了node.js與C語言 實現(xiàn)遍歷文件夾下最大的文件,并輸出路徑,大小的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • Node.js zlib模塊之屬性、方法及使用示例詳解

    Node.js zlib模塊之屬性、方法及使用示例詳解

    zlib模塊是Node.js中用于數(shù)據(jù)壓縮和解壓縮的強大工具,它提供了多種壓縮算法和靈活的使用方式,包括Deflate、Gzip等,廣泛用于網(wǎng)絡(luò)傳輸和文件存儲中以減少數(shù)據(jù)大小,提高性能,本文給大家介紹Node.js zlib模塊屬性、方法及使用示例,感興趣的朋友跟隨小編一起看看吧
    2024-08-08
  • 解決npm?install版本不匹配問題:?npm?ERR!?code?ETARGET?npm?ERR!?notarget?No?matching?version?found?for

    解決npm?install版本不匹配問題:?npm?ERR!?code?ETARGET?npm?ERR!?

    這篇文章主要介紹了如何解決npm?install版本不匹配問題:?npm?ERR!?code?ETARGET?npm?ERR!?notarget?No?matching?version?found?for,文中給出了詳細的解決方法,需要的朋友可以參考下
    2024-02-02
  • 簡單聊一聊Node.js參數(shù)max-old-space-size

    簡單聊一聊Node.js參數(shù)max-old-space-size

    簡單的說Node.js就是運行在服務(wù)端的JavaScript,下面這篇文章主要給大家介紹了關(guān)于Node.js參數(shù)max-old-space-size的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-01-01
  • node.js在Linux下執(zhí)行shell命令、.sh腳本的問題

    node.js在Linux下執(zhí)行shell命令、.sh腳本的問題

    很多時候需要多個命令來完成一項工作,而這個工作又常常是重復的,這個時候我們自然會想到將這些命令寫成sh腳本,下次執(zhí)行下這個腳本一切就都搞定了,下面就是發(fā)布代碼的一個腳本示例
    2022-01-01

最新評論