2016-04-26 68 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