2016-11-21 5 views
2

Je suis en train de mettre en service mon application Web en utilisant le serveur NodeJS (ExpressJS) actuellement. L'une des nouvelles exigences est que les utilisateurs puissent télécharger de grandes vidéos (potentiellement en concert) sur le serveur. Ils seront ensuite en mesure de les télécharger à nouveau. Est-ce que je pourrais réaliser ceci avec la pile actuelle?Téléchargement d'un fichier volumineux sur le serveur Web NodeJS

Je suis tombé sur des tutoriels utilisant Multer JS avec "multipart/form-data" spécifié par le frontal. Si je l'utilise, mon Express pourrait-il servir d'autres requêtes HTTP tout en écrivant un fichier vidéo géant unique sur le disque du serveur?

Répondre

1

Multer devrait fonctionner correctement. Il va diffuser les données telles qu'elles sont transmises par HTTP à un fichier sur le disque. Cela ne bloquera pas votre serveur. Ensuite, dans votre point de terminaison, vous avez accès à cet emplacement de fichier et pouvez faire tout ce dont vous avez besoin avec.

+1

Sur une note côté: Vous puis téléchargez simplement ce fichier à S3? Si c'est le cas, vous pouvez demander au client de télécharger le fichier directement sur S3. Cela évitera à votre serveur Node de devoir traiter les données de Go. Et S3 peut probablement servir vos fichiers plus rapidement que vos propres serveurs. – Randy

+0

Le téléchargement vers S3 semble être une bonne solution. Vu que vous le recommandez, il est sûr de le faire en termes de sécurité, je suppose? Vous ne voudriez certainement pas que quelqu'un commence à télécharger des fichiers sur votre S3, alors y a-t-il une sorte de schéma d'authentification? – jiminssy

+0

Le client demande à votre API un jeton d'accès à S3. Votre API crée essentiellement ce jeton en utilisant les bibliothèques S3 fournies par Amazon. Ceci est un jeton temporaire que votre client utilisera ensuite pour se connecter à S3 afin de télécharger un fichier. Une fois téléchargé, vous pouvez rappeler votre API avec le chemin ou l'identifiant. Votre API peut alors utiliser le fichier S3 comme bon lui semble. – Randy

2

Ayant fait moi-même (~ fichiers 20GB, sans multer) Je peux recommander ce qui suit (ce qui est probablement la plupart d'entre vous avez considéré, mais pour être complet):

  1. Choisissez un contrôle de téléchargement approprié (ou écrire le vôtre, mais fondamentalement quelque chose qui arrose les données est meilleur.J'ai utilisé plupload je pense)

  2. Sur le serveur faire une API pour gérer les données de morceau reçues, et l'écrire à un emplacement temporaire pendant le téléchargement (Vous peut vouloir hacher et vérifier les pièces individuelles ainsi).

  3. télécharger Une fois terminée, vérifier le fichier (j'ai utilisé un hachage généré par le client, et vérifié par rapport aux données mises en ligne)

+0

Juste curieux, y a-t-il une raison pour laquelle vous avez décidé de ne pas utiliser 'multer'? – Randy

+1

Je l'ai fait il y a 4/5 ans ... ne pense pas que le projet a même existé (Quand je l'ai fait, nous faisions encore beaucoup de HTML5 avec shimmer: O) –

0
var express = require("express"); 

    var app = express(); 
    var async = require('async'); 
    var fs = require('fs'); 
    var client = redis.createClient(); 
    var multiparty = require('multiparty'); 
    var util = require('util'); 

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

     var form = new multiparty.Form(); 

     form.parse(req, function(err, fields, files) { 

      client.get(fields.otp, function(err, reply) { 
    var oldpath = files.file[0].path; 
          var newpath = path + files.file[0].originalFilename; 
          fs.rename(oldpath, newpath, function (err) { 
          if (err) throw err; 
          res.write('File uploaded and moved!'); 
          res.end(); 
          }); 
    } 
    } 



app.listen(2001,function(){ 
    console.log("Server is running on port 2001"); 
});