2017-05-26 3 views
0

Comment récupérer un fichier si le service web de votre nœud est sur un serveur Linux (ubuntu) et que vous devez télécharger des fichiers depuis un serveur Windows?Transférer de Windows vers Linux dans le nœud js avec smbget

2 Options valides:

Comment pouvez-vous faire à partir du système d'exploitation directement au lieu de compter sur les paquets de noeuds tiers?

Répondre

2

Vous pouvez utiliser smbget (utilitaire linux inclus avec https://linux.die.net/man/1/smbget), puis utilisez le nœud enfant_processus spawn pour appeler la fonction. Remplacez simplement [groupe de travail], [nom d'utilisateur], [mot de passe], [adresse_serveur] et [chemin] par vos propres informations ici.

function getFile(file) { 
    return new Promise(function(resolve, reject) { 
    var tempFilePath = `/tmp/${file}`; // the linux machine 
    var remoteFile = require('child_process').spawn('smbget', ['--outputfile', tempFilePath, '--workgroup=[workgroup]', '-u', '[username]', '-p', '[password]', `smb://[serveraddress]/c$/[path]/[path]/${file}`]); 
    remoteFile.stdout.on('data', function(chunk) { 
    //  //handle chunk of data 
    }); 
    remoteFile.on('exit', function() { 
     //file loaded completely, continue doing stuff 

     // TODO: make sure the file exists on local drive before resolving.. an error should be returned if the file does not exist on WINDOWS machine 
     resolve(tempFilePath); 
    }); 
    remoteFile.on('error', function(err) { 
     reject(err); 
    }) 
    }) 
} 

Le fragment de code ci-dessus renvoie une promesse. Donc, dans le nœud, vous pouvez envoyer la réponse à une route comme ceci:

var express = require('express'), 
router = express.Router(), 
retrieveFile = require('../[filename-where-above-function-is]'); 

router.route('/download/:file').get(function(req, res) { 
    retrieveFile.getFile(req.params.file).then(
     file => { 
      res.status(200); 
      res.download(file, function(err) { 
      if (err) { 
       // handle error, but keep in mind the response may be partially sent 
       // so check res.headersSent 
      } else { 
       // remove the temp file from this server 
       fs.unlinkSync(file); // this delete the file! 
      } 
      }); 
     }) 
     .catch(err => { 
     console.log(err); 
     res.status(500).json(err); 
     }) 
    } 

La réponse sera le binaire réel du fichier à télécharger. Puisque ce fichier a été récupéré à partir d'un serveur distant, nous devons également nous assurer que nous supprimons le fichier local en utilisant fs.unlinkSync().

Utilisez res.download pour envoyer les en-têtes appropriés avec la réponse afin que les navigateurs Web les plus récents sachent que l'utilisateur doit télécharger le fichier.