2017-09-29 1 views
1

J'utilise ce code que j'ai trouvé sur Internet pour télécharger plusieurs fichiers sur un serveur Amazon S3.Recevoir une notification lorsque les tâches asynchrones sont terminées

const AWS = require("aws-sdk"); // from AWS SDK 
    const fs = require("fs"); // from node.js 
    const path = require("path"); // from node.js 

    // configuration 
    const config = { 
     s3BucketName: 'your.s3.bucket.name', 
     folderPath: '../dist' // path relative script's location 
    }; 

    // initialize S3 client 
    const s3 = new AWS.S3({ signatureVersion: 'v4' }); 

    // resolve full folder path 
    const distFolderPath = path.join(__dirname, config.folderPath); 

    // get of list of files from 'dist' directory 
    fs.readdir(distFolderPath, (err, files) => { 

     if(!files || files.length === 0) { 
     console.log(`provided folder '${distFolderPath}' is empty or does not exist.`); 
     console.log('Make sure your project was compiled!'); 
     return; 
     } 

     // for each file in the directory 
     for (const fileName of files) { 

     // get the full path of the file 
     const filePath = path.join(distFolderPath, fileName); 

     // ignore if directory 
     if (fs.lstatSync(filePath).isDirectory()) { 
      continue; 
     } 

     // read file contents 
     fs.readFile(filePath, (error, fileContent) => { 
      // if unable to read file contents, throw exception 
      if (error) { throw error; } 

      // upload file to S3 
      s3.putObject({ 
      Bucket: config.s3BucketName, 
      Key: fileName, 
      Body: fileContent 
      }, (res) => { 
      console.log(`Successfully uploaded '${fileName}'!`); 
      }); 

     }); 
     } 
    }); 

Comment puis-je être informé que le téléchargement est effectué pour exécuter un autre processus? res est appelée lorsqu'un seul fichier a été téléchargé avec succès.

+0

Pourquoi ne pas utiliser la res comme la notification pour exécuter un autre processus? – SILENT

+0

Les res sont appelés chaque fois qu'un nouveau fichier est téléchargé. – doej

+1

Alors? Vos questions portent-elles sur une notification après que tous vos téléchargements ont été terminés? – SILENT

Répondre

0

Que diriez-vous incrémenter un compteur quand un téléchargement de fichiers, puis de vérifier si tous les fichiers ont été téléchargés:

... 

var uploadCount = 0 

// Read file contents 
fs.readFile(filePath, (error, fileContent) => { 

    // If unable to read file contents, throw exception 
    if (error) { throw error } 

    // Upload file to S3 
    s3.putObject({ 
    Bucket: config.s3BucketName, 
    Key: fileName, 
    Body: fileContent 
    }, (res) => { 
    console.log(`Successfully uploaded '${fileName}'!`) 

    // Increment counter 
    uploadCount++ 

    // Check if all files have uploaded 
    // 'files' provided in callback from 'fs.readdir()' further up in your code 
    if (uploadCount >= files.length) { 
     console.log('All files uploaded') 
    } 

    }) 

}) 

... 
+0

Mon code est manquant, j'ouvre le dossier multipiple dans une boucle for. Je ne connais pas le nombre de fichiers. y-a-t'il une solution? – doej

+0

@doej Vous savez quand vous avez appelé files.length ... Ou ajoutez simplement un compteur à votre boucle for – SILENT

0

Vous pouvez essayer d'utiliser des promesses et promise.all

const AWS = require("aws-sdk"); // from AWS SDK 
const fs = require("fs"); // from node.js 
const path = require("path"); // from node.js 

// configuration 
const config = { 
    s3BucketName: 'your.s3.bucket.name', 
    folderPath: '../dist' // path relative script's location 
}; 

// initialize S3 client 
const s3 = new AWS.S3({ signatureVersion: 'v4' }); 

// resolve full folder path 
const distFolderPath = path.join(__dirname, config.folderPath); 

// get of list of files from 'dist' directory 
fs.readdir(distFolderPath, (err, pathURLS) => { 
    if(!pathURLS || pathURLS.length === 0) { 
    console.log(`provided folder '${distFolderPath}' is empty or does not exist.`); 
    console.log('Make sure your project was compiled!'); 
    return; 
    } 
    let fileUploadPromises = pathURLS.reduce(uplaodOnlyFiles, []); 
    //fileUploadPromises.length should equal the files uploaded 
    Promise.all(fileUploadPromises) 
     .then(() => { 
      console.log('All pass'); 
     }) 
     .catch((err) => { 
      console.error('uploa Failed', err); 
     }); 
}); 

function uploadFileToAWS(filePath) { 
    return new Promise(function (resolve, reject) { 
     try { 
      fs.readFile(filePath, function (err, buffer) { 
       if (err) reject(err); 
       // upload file to S3 
       s3.putObject({ 
        Bucket: config.s3BucketName, 
        Key: filePath, 
        Body: buffer 
       }, (res) => { 
        resolve(res) 
       }); 
      }); 
     } catch (err) { 
      reject(err); 
     } 
    }); 
} 

function uplaodOnlyFiles(fileUploadPromises, pathURL) { 
    const fullPathURL = path.join(distFolderPath, pathURL); 
    if (!fs.lstatSync(fullPathURL).isDirectory()) { 
     fileUploadPromises.push(uploadFileToAWS(fullPathURL)); 
    } 
    return fileUploadPromises; 
}