2012-05-29 23 views
0

在此循環中,「req.files.upload.length」返回文件計數當0或上傳多個文件時,上傳一個文件時,「req.files.upload.length」返回文件大小。爲什麼?req.files.upload.length返回文件計數爲零或上傳多個文件時,上傳一個文件時,返回文件大小

上傳處理程序:

app.post('/upload', function(req, res){ 
    console.log('file count: ' + req.files.upload.length); 
    var file; 
    var i = 0; 
    for(var x = 0; x < req.files.upload.length; x++){ 
     file = req.files.upload[x]; 
     console.log(file.name + ' (' + (file.size * 0.0009765625).toFixed(0) + ' kB, ' + file.type + ')'); 
    }; 
    console.log(req.files.upload.length + ' files uploaded to server'); 
    res.redirect('/forms'); 
}); 

當我上傳一個文件,我得到這個錯誤:

TypeError: Cannot read property 'name' of undefined 
    at /Users/frode/Dropbox/Nettsider/expressmal/app.js:296:20 
    at callbacks (/Users/frode/Dropbox/Nettsider/expressmal/node_modules/express/lib/router/index.js:272:11) 
    at param (/Users/frode/Dropbox/Nettsider/expressmal/node_modules/express/lib/router/index.js:246:11) 
    at pass (/Users/frode/Dropbox/Nettsider/expressmal/node_modules/express/lib/router/index.js:253:5) 
    at Router._dispatch (/Users/frode/Dropbox/Nettsider/expressmal/node_modules/express/lib/router/index.js:280:4) 
    at Object.handle (/Users/frode/Dropbox/Nettsider/expressmal/node_modules/express/lib/router/index.js:45:10) 
    at Context.next (/Users/frode/Dropbox/Nettsider/expressmal/node_modules/express/node_modules/connect/lib/http.js:204:15) 
    at Context.<anonymous> (/Users/frode/Dropbox/Nettsider/expressmal/node_modules/passport/lib/passport/context/http/actions.js:64:8) 
    at SessionStrategy.pass (native) 
    at /Users/frode/Dropbox/Nettsider/expressmal/node_modules/passport/lib/passport/strategies/session.js:48:12 
URIError: URI malformed 
    at /Users/frode/Dropbox/Nettsider/expressmal/node_modules/express/node_modules/connect/lib/middleware/static.js:119:14 
    at Object.static [as handle] (/Users/frode/Dropbox/Nettsider/expressmal/node_modules/express/node_modules/connect/lib/middleware/static.js:60:5) 
    at next (/Users/frode/Dropbox/Nettsider/expressmal/node_modules/express/node_modules/connect/lib/http.js:204:15) 
    at pass (/Users/frode/Dropbox/Nettsider/expressmal/node_modules/express/lib/router/index.js:219:24) 
    at Router._dispatch (/Users/frode/Dropbox/Nettsider/expressmal/node_modules/express/lib/router/index.js:280:4) 
    at Object.handle (/Users/frode/Dropbox/Nettsider/expressmal/node_modules/express/lib/router/index.js:45:10) 
    at Context.next (/Users/frode/Dropbox/Nettsider/expressmal/node_modules/express/node_modules/connect/lib/http.js:204:15) 
    at Context.<anonymous> (/Users/frode/Dropbox/Nettsider/expressmal/node_modules/passport/lib/passport/context/http/actions.js:64:8) 
    at SessionStrategy.pass (native) 
    at /Users/frode/Dropbox/Nettsider/expressmal/node_modules/passport/lib/passport/strategies/session.js:48:12  
+0

我不認爲這個錯誤與你粘貼的代碼有關。這裏是什麼:TypeError:無法在/Users/frode/Dropbox/Nettsider/expressmal/app.js:296:20 處讀取undefined 的屬性'name'? – alessioalex

+0

這是第296行:console.log(file.name +'('+(file.size * 0.0009765625).toFixed(0)+'kB,'+ file.type +')'); – Frode

+0

你可以粘貼你用來上傳文件的窗體以及你在「處理」它們的位置嗎? (在什麼路線..) – alessioalex

回答

3

在快遞/連接,req.files將與input[type=file]name屬性作爲重點對象,並內容作爲價值。如果有多個input[type=file]name相同,則它將是一個數組。如果您控制視圖,即使用form的網頁,則應該可以爲每個文件輸入指定唯一名稱,或者知道您有多個名稱爲「上傳」。

更新:我沒有想到最明顯的情況,其中用戶選擇了多個文件。

更新:這裏是req.files將是什麼樣子了兩種不同的情況:

  1. 一個文件:

    req.files = { 
        upload: { 
        name: 'foo.txt' 
        length: 1024 
        } 
    } 
    
  2. 兩個文件:

    req.files = { 
        upload: [ 
        { 
         name: 'foo.txt' 
         length: 1024 
        }, 
        { 
         name: 'bar.txt' 
         length: 2048 
        } 
        ] 
    } 
    

從這個例子中應該清楚,req.files.upload將在任何情況下都具有length屬性,但正如您發現它們意味着不同的事情。

您可能想在任何情況下遍歷數組,以簡化您自己的代碼。這很容易實現與[].concat

// Make sure that files is always an array 
var files = [].concat(req.files.upload); 
for(var x = 0; x < files.length; x++){ 
    file = files[x]; 
    // ... 
} 
+0

我確實擁有對視圖的控制權。但是,如何在使用相同文件輸入的同時上傳單個文件時給予獨特名稱? – Frode

+0

@Frode:好點。我真的沒有想到這一點。 ;)在這種情況下,您似乎必須檢查它是一個文件還是很多(.i.e。'req.files.upload'是一個對象或數組)。 –

+0

我也更改爲更強大的數組強制('[] .concat')。 –