2015-03-10 4 views
4

J'utilise NodeJs Multer pour télécharger des fichiers. J'ai besoin d'envoyer une réponse à un client lorsque l'utilisateur du fichier essaie de télécharger est trop grand. Le problème est que onFileSizeLimit a seulement le fichier comme argument et je ne sais pas comment envoyer une réponse au client. Ce que je dois faire est essentiellement soomething comme ci-dessous:Comment envoyer une réponse au client lorsque les fichiers sont trop volumineux avec Multer

app.use('/users/gyms/upload-logo', multer({ 
    // other settings here then: 
    onFileSizeLimit: function (file) { 
     // but res (response) object is not existing here 
     res.json({ 
      message: "Upload failed", 
      status: MARankings.Enums.Status.FILE_TOO_LARGE 
      // status: -6 
     }); 
    } 
}); 

objet res dosent existe là-bas, cependant, et je me demande quelle est la meilleure façon d'envoyer une sorte de réponse au client.

Répondre

1

Dans ce cas, il est bon de se rappeler que Multer lui-même n'est qu'une fonction (middleware) qu'Express appelle pour obtenir sa réponse.

Vous pourriez peut-être essayer avec ceci:

app.use('/users/gyms/upload-logo', function(req, res, next) { 

    var handler = multer({ 

     // other settings here then: 
     onFileSizeLimit: function (file) { 

      // res does exist here now :) 
      res.json({ 
       message: "Upload failed", 
       status: MARankings.Enums.Status.FILE_TOO_LARGE 
       // status: -6 
      }); 

     } 

    }); 

    handler(req, res, next); 

}); 

Cet alias d'multer au gestionnaire, passe req, res, next du rappel Express, et signifie que vous avez accès aux req, res, next des variables à partir de la configuration de Multer.

Je n'ai pas testé cela mais je pense que la théorie est solide!

+0

vous êtes un génie! BTW auriez-vous de bonnes urls qui couvrent les middleware et les trucs que vous montrez dans votre exemple? Impossible de trouver quelque chose d'intéressant en dehors de l'utilisation de base express – spirytus

+1

mais il semble que multer télécharge toujours la première partie du fichier jusqu'à la limite de taille de fichier, en remplaçant ce qui est là avec un fichier partiel? – PixMach

+0

@PixMach, j'ai eu le même problème. Je viens de supprimer ce fichier partiel. Je ne sais pas s'il y a un meilleur moyen. –

4

essayez ceci:

app.use('/users/gyms/upload-logo', multer({ 
    // other settings here then: 
    onFileSizeLimit: function (file) { 
     // but res (response) object is not existing here 
     file.error = { 
      message: "Upload failed", 
      status: MARankings.Enums.Status.FILE_TOO_LARGE 
      // status: -6 
     }; 
    }, onFileUploadComplete: function (file, req, res) { 
     if (file.error){ 
      res.send(file.error); 
     } 
    } 
}); 
+1

Ceci est une meilleure réponse que celle marquée comme réponse ci-dessus. Si vous utilisez onFileUploadComplete pour renvoyer un json et onFileSizeLimit pour renvoyer un json en même temps, vous obtiendrez une erreur de la part du noeud: Impossible de définir les en-têtes après leur envoi. –

0

L'objet fichier multer contient en fait une propriété indiquant si le fichier a dépassé la limite de taille. Voir https://www.npmjs.com/package/multer#multer-file-object

Pour accepter qu'un seul fichier avec une taille maximale de 2 Mo et le nom de « données » Je l'ai fait quelque chose comme ceci:

app.use(multer({ 
    dest: "./uploads/", 
    putSingleFilesInArray: true, // see https://www.npmjs.com/package/multer#putsinglefilesinarray 
    limits: { 
     files: 1, 
     fileSize: 2097152 // 2 MB 
    } 
})); 
app.post("/foo", function(request, response) { 
    if (!request.files.hasOwnProperty("data")) { 
     // 400 Bad Request 
     return response.status(400).end(); 
    } 
    var file = request.files.data[0]; 
    if (file.truncated) { 
     // 413 Request Entity Too Large 
     console.log("Request aborted."); 
     return response.status(413).end(); 
    } 
    // do stuff with file 
}); 
1

C'est une question qui n'a pas été résolu par l'auteur de encore plus. Cette github issue a beaucoup de discussions à ce sujet:

1

Il y a un travail autour que je l'ai utilisé dans mon projet actuel

fichier: make-middleware.js changement « fonction DONE (err) » à fin de cette fonction

Remplacer ligne 52: onFinished(req, function() { next(err) })

Avec: ligne 52: onFinished(req, function() { if(err.code == 'LIMIT_FILE_SIZE') { req.fileSizeError = 1; next() } else next(err) })

Et dans le fichier de l'application, vous pouvez changer le code à

app.post('/upload', upload.single('upload'), function (req, res, next) { 
    if(typeof req.fileSizeError != "undefined") { 
     res.send({"error":"File too large"});// to display filesize error 
    } else { 
     res.send({"file":req.file}); // when file uploaded successfully 
    } 
});