【问题标题】:How to find the size of the file in Node.js?如何在 Node.js 中查找文件的大小?
【发布时间】:2017-07-10 19:53:42
【问题描述】:

我正在使用 multer 上传我的图像和文档,但这次我想限制上传,如果图像的大小大于 2mb。如何找到文档文件的大小?到目前为止,我尝试如下但没有工作。

var storage = multer.diskStorage({
      destination: function (req, file, callback) {
        callback(null, common.upload.student);
      },
      filename: function (req, file, callback) {  
        console.log(file.size+'!!!!!!!!!!!!!!')======>'Undefined'
        var ext = '';
        var name = '';
        if (file.originalname) {
          var p = file.originalname.lastIndexOf('.');
          ext = file.originalname.substring(p + 1);
          var firstName = file.originalname.substring(0, p + 1);
          name = Date.now() + '_' + firstName;
          name += ext;
        }
        var filename = file.originalname;
        uploadImage.push({ 'name': name });
        callback(null, name);
  }
});

谁能帮帮我?

【问题讨论】:

  • 你怎么调用filename函数
  • 嗨,brk,我不确定,但我正在为此使用回调。

标签: javascript node.js express multer


【解决方案1】:

注意:以下内容是在 Electron 应用程序的上下文中。

使用以下内容:

window.require("fs")

不仅仅是:

require("fs")

为我解决了这个问题。

【讨论】:

  • Node.js 中没有window
  • 谢谢@Mike'Pomax'Kamermans。我在一个 Electron 应用程序中工作,这就是为什么我必须添加“窗口”。我将此信息添加到我的答案中。
  • 尽管这解决了 your 问题,但您使用的是 electron 而原始问题没有,所以您的问题与问题所在的问题不同,所以这个答案不属于这个问题=)
【解决方案2】:

如果您使用 ES6 并解构,则以字节为单位查找文件大小只需 2 行(如果 fs 模块已声明,则为一行!):

const fs = require('fs');
const {size} = fs.statSync('path/to/file');

请注意,如果已经声明了 size 变量,这将失败。这可以通过在使用冒号解构时重命名变量来避免:

const fs = require('fs');
const {size: file1Size} = fs.statSync('path/to/file1');
const {size: file2Size} = fs.statSync('path/to/file2');

【讨论】:

    【解决方案3】:

    以兆字节为单位获取文件大小:

    var fs = require("fs"); // Load the filesystem module
    var stats = fs.statSync("myfile.txt")
    var fileSizeInBytes = stats.size;
    // Convert the file size to megabytes (optional)
    var fileSizeInMegabytes = fileSizeInBytes / (1024*1024);
    

    或以字节为单位:

    function getFilesizeInBytes(filename) {
        var stats = fs.statSync(filename);
        var fileSizeInBytes = stats.size;
        return fileSizeInBytes;
    }
    

    【讨论】:

    • 您转换为 mb 的值不应该除以 1024^2 吗? - 请参阅this answer 了解转化的深入分析
    • 对于 2020 年以上的搜索者,我们现在有 (await fs.promises.stat(file)).size
    • 为方便起见,链接到官方文档:fs.statfs.promises.stat
    【解决方案4】:

    您可以找到以字节为单位的大小。

    const libFS       = require('fs');
    let yourFilesize  = fs.statSync("File path").size
    console.log(yourFilesize)
    

    【讨论】:

      【解决方案5】:

      对于使用本机包寻找当前答案的任何人,以下是如何使用 fs(特别是 fsPromises)和 async/await 在不阻塞事件循环的情况下获取文件的 mb 大小:

      const fs = require('fs').promises;
      const BYTES_PER_MB = 1024 ** 2;
      
      // paste following snippet inside of respective `async` function
      const fileStats = await fs.stat('/path/to/file');
      const fileSizeInMb = fileStats.size / BYTES_PER_MB;
      

      【讨论】:

        【解决方案6】:

        @geryamurphy 的链接对我来说已损坏,所以我将链接到我为此制作的包。

        https://github.com/dawsbot/file-bytes

        API 很简单,应该很容易使用:

        fileBytes('README.md').then(size => {
            console.log(`README.md is ${size} bytes`);
        });
        

        【讨论】:

          【解决方案7】:

          你也可以从 npm 查看这个包:https://www.npmjs.com/package/file-sizeof

          API 非常简单,它以SIIEC 表示法为您提供文件大小。

          const { sizeof } = require("file-sizeof");
          
          const si = sizeof.SI("./testfile_large.mp4");
          const iec = sizeof.IEC("./testfile_large.mp4");
          

          生成的对象表示从B(字节)到PB(拍字节)的大小。

          interface ISizeOf {
            B: number;
            KB: number;
            MB: number;
            GB: number;
            TB: number;
            PB: number;
          }
          

          【讨论】:

            【解决方案8】:

            另外,可以使用 NPM 文件大小包:https://www.npmjs.com/package/filesize

            这个包让事情变得更加可配置。

            var fs = require("fs"); //Load the filesystem module
            
            var filesize = require("filesize"); 
            
            var stats = fs.statSync("myfile.txt")
            
            var fileSizeInMb = filesize(stats.size, {round: 0});
            

            更多示例:
            https://www.npmjs.com/package/filesize#examples

            【讨论】:

            • 大小以 KB 为单位,而不是 MB; stats.size 给出字节, filesize(stats.size, {round: 0}) 给出 KB,输出 - 如果你有 stats.size 218871 它使 filesize(stats.size, {round: 0}) = '214 KB' // list files with sizes: fs.readdir('.', (err, files) => { files.forEach(file => { var stats = fs.statSync(file); var fileSizeInKb = filesize(stats.size, {round: 0}); console.log('%s --- %s ', file, fileSizeInKb); }); });
            • @SashaBond 不。我认为文件大小是人类可读值的模块。根据文件大小,它会以 KB 或 MB 显示大小,请自行尝试。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-05-20
            • 2011-08-10
            • 2017-06-09
            • 1970-01-01
            • 2018-09-20
            相关资源
            最近更新 更多