2014-06-24 5 views
2

J'utilise expressjs 4.0 avec multer pour gérer les téléchargements de fichiers.Multer | Arrêter le téléchargement de fichier

Le problème est, je veux arrêter le téléchargement de fichier lorsque la taille du fichier dépasse une variable maxSize. Mais multer télécharge le fichier de toute façon.

Y at-il un moyen d'arrêter ce comportement.

Quelques exemples de code:

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); 
    } 
}); 

Répondre

1

Selon la documentation Multer: (https://www.npmjs.org/package/multer), vous pouvez utiliser onFileUploadStart (fichier) et return false si la taille est au-dessus de votre limite.

Par exemple:

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

Pourquoi vous n'avez pas vérifié pour arg « fichier » sur l'événement onFileUploadStart? – felipekm

+1

Il n'y a pas de 'onFileUploadStart' dans la documentation. –

2

Essayez multer limits-

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

Documentation ici https://www.npmjs.org/package/multer

+0

Est-ce que cela a fonctionné pour n'importe qui? J'ai regardé les documents, mais même si le rappel onFileSizeLimit se déclenche, le fichier est toujours téléchargé. J'ai essayé de faire ce qu'ils font, en appelant 'fs.unlink ('./' + file.path);' mais cela ne semblait pas non plus faire quoi que ce soit. – ErnestoP

+0

pour les images, nous sommes perdus l'information est leur toute alternative est leur – santhosh

+0

@ ErrnestoP cela fonctionne. Multer lance "Erreur: Fichier trop grand". Je sais que vous avez probablement compris cela maintenant, mais je pensais juste que je répondrais. –

1

Thats comment je fais face à ce problème dans mon projet. Cela semble la meilleure solution pour l'instant.

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}); 
    }); ... 

config/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

Je pense le meilleur endroit pour faire la taille du fichier est sur la vérification frontend au lieu de backend. Lorsque l'utilisateur sélectionne un fichier à télécharger, nous pouvons obtenir la taille du fichier immédiatement et alerter l'utilisateur si la taille dépasse la limite autorisée.

Voilà comment je le fais:

$('#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

Bien sûr, nous devrions faire une vérification côté client, mais ce n'est pas assez fiable. Le contrôle Serverside est un must. Et il semble que les solutions de nodejs ne sont pas encore mûres. Je devais faire quelques tours de Linux. Parce que je pourrais envoyer n'importe quel fichier avec des applications et des méthodes spéciales. Je me demande s'il est possible d'empêcher absolument l'envoi d'un fichier php ou sh. –

Questions connexes