如何在Node.js中查找文件的大小?

143
我正在使用 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
嗨brk,我不确定那个,但我正在使用回调函数来处理。 - Daniel
7个回答

284

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

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

47
对于在2020年及以后搜索的人们,我们现在有(await fs.promises.stat(file)).size - garrettmills
8
为方便起见,以下是官方文档链接:fs.statfs.promises.stat - Akseli Palén
1
要转换为MB,应该使用fileSizeInBytes / (1024 * 1000)。请参考https://nodejs.dev/learn/nodejs-file-stats上的最后一个示例。 - Raine Revere

25

如果您使用ES6和解构,则仅需两行(如果已声明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');

但是你如何显示它呢?console.log(stats.size()) 失败了。 - webs
@webs 你是不是在评论错误的答案?我的例子中没有使用stats。至于我的第一个例子,你可以用console.log(size)输出结果。 - Nadav

7

文件大小以KB为单位,而不是MB;stats.size提供了字节大小,filesize(stats.size, {round: 0})提供了KB大小。例如,如果stats.size等于218871,则filesize(stats.size, {round: 0})的输出结果为'214 KB'。 // 列出带有大小的文件: 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); }); }); - Sasha Bond
@SashaBond 不是的。我认为filesize是一个用于人类可读取值的模块。根据文件大小,如果它很小或很大,它将使用KB或MB来显示大小,你可以自己试试。 - vdegenne

4

对于任何想要使用本地包获取文件的 MB 大小并且不阻止事件循环的人,下面是如何使用 fs(特别是fsPromises)和 async/await进行操作:

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;

2

对我来说,@gerryamurphy提供的链接无效,所以我会提供一个我自己制作的包。

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

API很简单,易于使用:

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

1
你还可以从npm中检查此软件包:https://www.npmjs.com/package/file-sizeof API非常简单,它可以以“SI”和“IEC”符号表示文件大小。
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;
}

-12

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

使用以下内容:

window.require("fs")

不要只写:

require("fs")

这个解决了我的问题。


在Node.js中没有window - Mike 'Pomax' Kamermans
感谢@Mike'Pomax'Kamermans。我正在一个Electron应用程序中工作,这就是为什么我不得不添加“window”的原因。我已经将这些信息添加到我的答案中。 - Fall Bay
尽管这解决了_你_的问题,但你正在使用电子和原始问题并非如此,因此您的问题与该问题不同,因此此答案不适用于该问题=) - Mike 'Pomax' Kamermans

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接