web-dev-qa-db-fra.com

Récupère le nom du fichier après que filereader charge un fichier de manière asynchrone

je charge plusieurs fichiers dans un répertoire pour analyser certaines données d'eux. Cela fonctionne très bien jusqu'à présent, mais j'aimerais savoir quel fichier je regarde. J'ai donc besoin du nom du fichier après son chargement. Quelqu'un peut-il aider à ce sujet?

// récupère tous les fichiers dans le répertoire

function updateData(){
  var dirReader = approot.createReader();

  var fail =failCB('Error - Directory for parsing failed to open'); // logs fail...
  dirReader.readEntries(parseData,fail); 
}

// chargement de chaque fichier

function parseData(entries){
  var i;
  for (i=0; i<entries.length; i++) {
    var reader = new FileReader();
    reader.onloadend = createListItem;
    reader.readAsText(entries[i]);
  }
}

// ICI JE VOUDRAIS CONNAÎTRE LE NOM !!!!

function createListItem(evt){
    // it gives me all the loaded data. But based on wich file it was, i would like to handle it!
  console.log(evt.target.result)
    // lets say something like this
    $('#content').find(   file.name   ).append(evt.target.result);
  }
}

acclamations pour toutes suggestions;)

27
Sidrich2009

Créez une fermeture autour de la File pour capturer le fichier actuel. Ensuite, vous pouvez obtenir le nom du fichier. 

Un exemple: http://www.html5rocks.com/en/tutorials/file/dndfiles/#toc-reading-files

Fermeture pour capturer les informations du fichier.

function parseData(entries){
  for (var i=0; i<entries.length; i++) {
    reader.onloadend = (function(file) {
      return function(evt) {
        createListItem(evt, file)
      };
    })(entries[i]);
    reader.readAsText(entries[i]);
  }
}

Et la fonction appelée obtient un argument supplémentaire

function createListItem(evt, file) {
  console.log(evt.target.result)
  console.log(file.name);
}
35
ebidel

Le code source suivant ajoute un attribut au lecteur de fichier 

    for(i=0; i < files.length; i++)
    {
        var fileReader = new FileReader();
        fileReader.onload = function(file)
        {
              // DO what you need here
              // file name = file.target.fileName
        } // end of reader load
        fileReader.fileName = files[i].name;
        fileReader.readAsBinaryString(files[i]);
    }
11
Thibault T

Une autre façon de résoudre ce problème consiste à lire le nom du fichier après l'événement onload- avec l'événement onloadend- comme ceci:

for (var i = 0; i < files.length; i++) {

    var fileReader = new FileReader();

    fileReader.fileName = files[i].name;

    fileReader.onload = function () {
        /* do something with file */
    }

    fileReader.onloadend = function () {
        console.log(fileReader.fileName); // here you can access the original file name
    }

    fileReader.readAsText(files[i]);

}
0
C.Christensen