2016-04-26 69 views
0

我想将文件从客户端上传到服务器,然后将它们存储在与上传该特定文件的用户对应的文件夹中!代码似乎没问题,但问题似乎与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('/'); 
}); 
+0

我想你应该给'writeFile'调用添加一个回调,并且只有在写入完成后才会重定向到成功或错误页面。 – Cristy

+0

试过了!同样的事情,只有15个字节被传输! – Jim

+0

如果您在控制台中记录'req.files.thumbnail'内容,您是否获得所有数据? – Cristy

回答

1

的问题是在这些线路:

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,通过它你可以同步写入。

希望这会有所帮助。

0

尝试这样的:

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('/'); 
    }); 
}); 
+0

文件被保存,但仍然是15个字节! – Jim

+0

如果用'var file =“1234567891011121314151617181920”'取代'var file = thumbnail'部分,会怎么写? – Cristy

+0

一个文件被创建到所需的目录,但它被命名为undefined,它不是一个照片/视频文件! – Jim