2014-06-24 92 views
2

我正在使用expressjs 4.0和multer一起處理文件上傳。Multer |停止文件上傳

問題是,當文件大小超過maxSize變量時,我想停止文件上載。但是 無論如何,multer上傳文件。

有沒有辦法阻止這種行爲。

一些示例代碼:

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

    var maxSize = 32 * 1000 * 1000 // 32mb max 

    if(req.files.file.length > maxSize) { 
     // stop upload 
    } else { 
     // continue 
     res.send(201); 
    } 
}); 

回答

1

根據Multer文件:(https://www.npmjs.org/package/multer),你可以使用onFileUploadStart(文件),並返回false如果尺寸超過你的極限。

例如:

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

var maxSize = 32 * 1000 * 1000; 

var app = express(); 
app.use(multer({ 
    dest: './uploads/', 
    onFileUploadStart: function(file, req, res){ 
    if(req.files.file.length > maxSize) { 
     return false; 
    } 
    }) 
})); 
+0

爲什麼你沒有檢查就onFileUploadStart事件「文件」 ARG? – felipekm

+1

文檔中沒有'onFileUploadStart'。 –

2

嘗試multer限度─

app.use('/userimage', multer({ 
    limits: { fileSize: 1* 1024 * 1024}, //1mb 
    onFileUploadStart: function (file, req, res) { 
    console.log(file.fieldname + ' fileupload is starting ...'); 
    }})); 

文檔在這裏https://www.npmjs.org/package/multer

+0

這對任何人都有效嗎?我查看了文檔,但即使onFileSizeLimit回調觸發器,該文件仍然上傳。我試着做他們做的,調用'fs.unlink('./'+ file.path);'但是這似乎也沒有做任何事情。 – ErnestoP

+0

對於我們丟失圖片的信息是他們的任何替代方案,是他們的 – santhosh

+0

@ErnestoP這個作品。 Multer拋出「錯誤:文件太大」。我知道你現在可能已經明白了這一點,但只是想我會回答。 –

1

That's我如何處理在我的項目這一問題。這似乎是目前最好的解決方案。

api.js

var multer = require('./config/multer')(); 
var utils = require('./utils'); 

module.exports = function(app, dao) { 
    app.post('/docs/:system', multer, function(req, res) { 
    var file = req.files.documento; 
    if (file.truncated) { 
     utils.removeFile(file.path); // remove the truncated file 
     return res.status(413).end(); // 413 ("Request Entity Too Large") 
    } 
    ... 
    res.status(200).send({_id : document._id}); 
    }); ... 

配置/ multer.js

var multer = require('multer'); 
var config = require('./config')(); 

module.exports = function() { 

    return multer({ dest: config.BASE_UPLOAD_FOLDER, limits: {fileSize: config.MAX_FILE_SIZE_FOR_UPLOAD}, 
     ... 
     onFileSizeLimit: function (file) { 
     console.log('> The file size exceeds the maximum size allowed (' + config.MAX_FILE_SIZE_FOR_UPLOAD/(1024*1024) + 'MB)'); 
     }, 
     onFileUploadComplete: function(file) { 
     console.log('> File \'' + file.fieldname + '\' stored in \'' + file.path + '\'' + (file.truncated ? ' (TRUNCATED).' : '.')); 
     } 
    }); 

}; 

utils.js

var fs = require('fs'); 

var removeFile = function (filePath) { 
    try { 
    fs.unlink(filePath); 
    console.log('File"' + filePath + '" removed!');  
    } catch (err) { 
    ... 
    } 
}; 
... 

exports.removeFile = removeFile; 
0

我覺得做這個文件的大小檢查的最好的地方是前端而不是後端。當用戶選擇要上傳的文件時,我們可以立即獲取文件大小,並在大小超過允許的限制時提醒用戶。

這裏是我如何做到這一點:

$('#upload input').change(function(click) { 
    var file = this.files[0]; 
    if (file.size > MAX_FILE_SIZE_MB * 1024 * 1024) { 
    alert('Sorry, selected file exceeds allowed size limit (' + MAX_FILE_SIZE_MB + 'MB).'); 
    return false; 
    } 

    // Post file upload request via AJAX 
    // ... 
} 
+0

當然,我們應該做一個客戶端檢查,但這不夠可靠。服務器檢查是必須的。看來nodejs解決方案還不成熟。我不得不做一些Linux技巧。因爲我可以發送任何具有特殊應用程序和方法的文件。我想知道是否有可能絕對防止發送一個PHP或SH文件。 –