我创建了一个文件共享应用程序以在我的家庭网络上使用。它有点类似于 Google Drive 或 Dropbox 的网络界面,但没有任何文件大小上限,也没有安全性。
当从通过 LAN 连接的其他计算机即时传输小文件时,它工作得很好,但在 2GB 文件上测试时发生了一些奇怪的事情。
进度条花了大约四个小时才达到 50%,然后我就把它切断了。另外,看看 Node 使用了多少内存。
它将从低容量开始,逐渐增加到 13GB,然后转储并重新启动,每分钟几次。
该文件是使用 XMLHttpRequest 从浏览器界面上传的。这是前端代码的核心部分。
var formData = new FormData();
var file = document.getElementById("fileinput").files[0];
formData.append("file", file);
var xhr = new XMLHttpRequest();
xhr.open("post", "/fileupload", true);
xhr.send(formData);
在服务器端有一个非常简单的处理程序,使用express,它接受req.files.file并将其直接传递到fs.writeFile以将其保存到磁盘。 (根据 console.log,'req.files.file' 似乎是 Buffer 类型,显然可以是 piped right onto disk )。
var express = require("express");
var fileUpload = require("express-fileupload");
var app = express();
app.use(express.static("public"));
app.use(fileUpload());
var fs = require("fs");
app.post('/fileupload', function(req, res) {
if(req.files && req.files.file){
var file = req.files.file;
fs.writeFile("./public/shared/" + file.name, file.data, "binary", function(err) {
if(err) {
res.send(err);
return;
}
res.send("File uploaded successfully.");
});
}
else{
res.send("No file was uploaded.");
return;
}
});
我正在使用express-fileupload处理上传。
两台计算机都运行 Windows。发送计算机使用的是 Chrome。 Node 版本是7.5.0。
我哪里出错了?我该如何解决这个问题?
最佳答案
看看express-fileupload source 。当文件到达时,它会获取传入流并开始将其放入缓冲区,即放入内存中。 完成后,您可以通过 writeFile 将内存缓冲区写入磁盘。
express-fileupload
没有选项可以避免将文件存储在内存中。考虑使用 multer
及其提供的 DiskStorage
选项:docs
关于javascript - 简单的 Node.js 程序占用所有系统内存并永远将 XMLHttpRequest 文件缓冲区写入磁盘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41998559/