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.