2015-07-18 66 views
32

我剛剛開始學習NodeJS,並且遇到問題。我想將文件上傳到我的服務器。爲此,我搜索並找到了這個模塊multer。這樣做是在GitHub上的示例工作:不能app.use(multer)。 「需要中間件功能」錯誤

var express = require('express'); 
var multer = require('multer'); 
var upload = multer({ dest: 'uploads/' }); 

var app = express() 

app.post('/uploadImage', upload.single('image'), function(req, res) { 
    console.log(req.file); 
}); 

在有FORMDATA圖像發佈到/uploadImage圖像保存在uploads/目錄。事情是圖像保存了一個奇怪的名字,我想用它的原名保存它。 要做到這一點,我明白,我得打個電話app.use(multer({ dest: 'uploads/' }))',然後我將能夠訪問req.file我之類的函數:

app.post('/uploadImage', function(req, res) { 
    console.log(req.file); 
}); 

但我得到試圖app.use()的錯誤:

TypeError: app.use() requires middleware functions 
    at EventEmitter.use (project\node_modules\express\lib\application 
.js:209:11) 

即時通訊使用NodeJS 0.12.7和Express 4.13.1

我該如何實現上傳?謝謝。

+0

http://stackoverflow.com/a/31495796/4989460 –

+0

哦,我...我swer我已經在這裏搜索...謝謝... stdob很好但是,奇怪的是(對我來說)它上傳劇照該文件自動的方式...我雖然我可以控制和寫入'FS'...我找到了一種方法,thx –

回答

47

您需要使用app.use(multer({dest:'./uploads/'}))在其中的一個形式:

app.use(multer({dest:'./uploads/'}).single(...)); 
app.use(multer({dest:'./uploads/'}).array(...)); 
app.use(multer({dest:'./uploads/'}).fields(...)); 

即:

app.use(multer({dest:'./uploads/'}).single('photo')); 

而且一定要有這樣的:

<form action="/postPhotos" enctype="multipart/form-data" method="post"> 
    <input type="file" name="photo"> 
    <input type="submit" value="Upload photo"> 
</form> 

在你HTML。

6

自版本1.0.0

var upload = multer({ dest: 'tmp/' }); 
app.post('/file_upload', upload.single('photo'), function (req, res) { 
14
var app = require('express'); 

var multer = require('multer'); 

app=express(); 

app.use(multer({dest:__dirname+'/file/uploads/'}).any()); 

app.post('/upload',function(req,res){ 

    console.log(req.files); 

    res.redirect('/'); 

}); 
+3

如果這個答案包含一些解釋它如何回答問題,將得到改善和解決了這個問題。 –

+0

StackOverflow請求您僅以英文發佈問題,意見和答案。 (Eninglés,por favor。)另外,使用[編輯]鏈接直接更新您的答案。 –

+2

...任何()這麼簡單:)爲我做了魔術感謝Homar – FRECIA

4

從@ 127.0.0.1的答案是正確的,但如果你正在使用快速路由器,代碼改變一點點:

var express = require('express'); 
var multer = require('multer'); 

var router = express.Router(); 

var uploads = multer({ 
    dest: 'public/uploads/' 
}); 

router.post('/upload', uploads.single('avatar'), function(req, res, next) { 
    console.log(req.file); 

    //... 
}); 

而且最重要的一點,在形式編碼enctype="multipart/form-data"前面已經說了,這樣的:

<form action="/upload" enctype="multipart/form-data" method="post"> 
    <input type="file" name="avatar"> 
    <input type="submit" value="Go avatar go!"> 
</form> 
+0

嗨,我正在使用'multer,表達式,ng2-file-upload'堆棧,並且您的完全代碼不適用於我。該req.file是未定義的,我的文件的信息是在req.files(在我的HTML我沒有多重選擇器)。當我點擊上傳我的按鈕時,服務器返回的文件上傳bt文件不存在於服務器上。什麼會做錯? – Hanzo

+0

我建議先測試它沒有角度。我的意思是直接用Postman或CURL或您最喜歡的工具將請求發送到後端。如果可行,問題就在於前端。如果沒有,問題是後端。它不會解決問題,但它會幫助您更快地解決問題。 – TheBronx

+0

如果我添加這個'app.use(multer({storage:storage})。single('file'));'可以正常工作,但不像預期的那樣有回調。你能檢查這個問題嗎? https://stackoverflow.com/questions/44165037/files-not-uploading-with-ng2-file-upload – Hanzo

3

更改爲app.use(multer({dest:'./ uploads /'})。single('photo'));在app.js爲我啓動服務器

+1

你能多解釋一下嗎? –

0

我遇到了同樣的問題。我解決了它。 對於第一個問題,如何獲取原始文件名? 我打印整個請求,發現我們可以通過使用路徑 「req.file.originalname」

和其它問題,如何使用「app.use()」獲得原來的名字?
是指:here

1

可以使用multer不能更改文件名,但你可以使用的Node.js流和FS模塊已經上傳的文件到新的文件中的內容複製在相同的(設置爲原始文件名)文件夾並刪除舊的。

首先在您的節點腳本中導入fs,path和multer。

var express = require('express'); 
var multer = require('multer'); 
var fs = require('fs'); 
var pathModule = require('path'); 

現在,使用multer設置任何類型文件的目標目錄如下。

var app = express(); 
app.use(multer({dest:__dirname+'/resoucres/'}).any()); 

現在使用流和FS來解決您的問題。

app.post('/uploadImage', function(request, response) { 
    var readerStream = fs.createReadStream(request.files[0].path); 
    var dest_file = pathModule.join(request.files[0].destination, request.files[0].originalname); 
    var writerStream = fs.createWriteStream(dest_file); 

    var stream = readerStream.pipe(writerStream); 
    stream.on('finish', function(){ 
     fs.unlink(request.files[0].path); 
    }); 
}); 
+0

本地正常工作。謝謝!! – joseAndresGomezTovar