节点Js FS不写整个文件
问题描述:
我想将文件从客户端上传到服务器,然后将它们存储在与上传该特定文件的用户对应的文件夹中!代码似乎没问题,但问题似乎与fs有关! FS只传输15个字节的文件。实际上,它只传输15个字节的每个文件类型,我已经尝试到目前为止(图像和视频)!这是我的代码,你能帮我吗?谢谢!节点Js FS不写整个文件
var multipart = require('connect-multiparty');
var multipartMiddleware = multipart();
app.post('/upload', multipartMiddleware, function(req, res){
var file = req.files.thumbnail; // that's what I've named the html input element
var stream = fs.createWriteStream(file.path);
fs.writeFile('./users/'+req.user._id+'/'+file.originalFilename, stream);
res.redirect('/');
});
答
的问题是在这些线路:
var stream = fs.createWriteStream(file.path); fs.writeFile('./users/'+req.user._id+'/'+file.originalFilename, stream);
流,是不是 'file.path' 的文件内容。相反,它是一个可以通过它写入'file.path'的流。
例如:
var stream = fs.createWriteStream(file.path); stream.write('some content'); stream.end();
当用它写入到使用fs.writeFile一个文件,它的对象表示被写的是什么,这是“[对象,对象]”(15轮轮空)。
你应该做的是从另一个文件中读取,并保持在字符串或缓冲区的内容,而不是在一个流:
var stream = fs.readFileSync(file.path);
然后写入到目标文件。当然,如果您正在使用文件写入的异步模型,请记住只在完成时重定向。有一个writeFileSync()API,通过它你可以同步写入。
希望这会有所帮助。
答
尝试这样的:
app.post('/upload', multipartMiddleware, function(req, res){
var file = req.files.thumbnail; // that's what I've named the html input element
fs.writeFile('./users/'+req.user._id+'/'+file.originalFilename, file, function(err) {
if(err) {
res.redirect('error_page');
return console.log(err);
}
console.log("The file was saved!");
res.redirect('/');
});
});
我想你应该给'writeFile'调用添加一个回调,并且只有在写入完成后才会重定向到成功或错误页面。 – Cristy
试过了!同样的事情,只有15个字节被传输! – Jim
如果您在控制台中记录'req.files.thumbnail'内容,您是否获得所有数据? – Cristy