上传文件时,nodejs怎么在服务器先占一个同等大小的空间
发布于 6 年前 作者 yuwanlin 4108 次浏览 来自 问答

比如上传文件为1g,服务端可能空间不够。 所以要提前占用一个空间1g,如果不够,就报错。 fs模块有什么相关的方法吗?

8 回复

获取磁盘剩余大小?,

来自酷炫的 CNodeMD

本楼纯属胡扯,找答案请跳至5楼后半部分 fs.writeFile(file, Buffer.allocUnsafe(1024*1024*1024), cb)

@zswnew 这样不太合适。比如服务器还有5g空间,有三个客户上传文件,每个2g。就会出现问题

@dislido 好的,谢谢啊。我看了,Buffer.allocUnsafe最大只能分配2g内存。

  • 那对于大于2g的数据要提前占位应该怎么办呢?
  • 还有如果多个用户(比如10)同时上传的话,每个用户通过Buffer.allocUnfafe分配1g的话,那服务器就要分配10g内存吗? node能调用的内存大小有限制吗?

谢谢啊

@yuwanlin 可以复用同一个buffer,然后appendFile

const file_1g = Buffer.allocUnsafe(1024*1024*1024);
fs.writeFileSync('./tmp', file_1g);
fs.appendFileSync('./tmp', file_1g);
// ...

实际使用时建议根据需要创建适当大小的buffer,然后复用它们 node能使用的内存是有限制的(默认不到2G)

如果能用C++模块的话可以直接申请出指定大小的磁盘空间,node我暂时没找到相同的实现


找到了… 测试了一下,秒创建而且不占用额外内存,上面的方法可以作废了

const fd = fs.openSync('./tmp','w+');
fs.writeSync(fd, '\0', 1024*1024*1024*8); // 8G
fs.closeSync(fd);

@dislido 哇,谢谢老哥,这样果然可以的。因为这样是直接写磁盘是吧,不用经过内存

。。。还真的去分配那么大的Buffer写入,无语,蛋疼。。。

现成 fs.truncate / fs.truncateSync 难道不好使吗?

@myy 这个函数没试过。。这个和fs.writeSync(fd, ‘\0’, fileSize)有什么区别吗 我在官网没看到关于truncate的解释

回到顶部