2010-11-24 37 views
8

J'ai créé un script d'importation pour les fichiers en texte brut dans une application Web.Détection du type de contenu d'un fichier lors de l'utilisation de l'interface FileReader de JavaScript

Mon script est la suivante:

function dataImport(files) { 
    confirm("Are you sure you want to import the selected file? This will overwrite any data that is currently saved in the application workspace."); 
    for (i = 0; i < files.length; i++) { 
     file = files[i] 
     console.log(file) 
     var reader = new FileReader() 
     ret = [] 
     reader.onload = function(e) { 
      window.localStorage.setItem("ApplicationData", e.target.result); 
     } 
     reader.onerror = function(stuff) { 
      console.log("error", stuff) 
      console.log (stuff.getMessage()) 
     } 
     reader.readAsText(file) 
    } 
} 

Il est essentiellement une modification de celle posée sur this question.

Cependant, au moment où l'utilisateur peut techniquement tenter d'importer n'importe quel fichier. Comme il est conçu pour les fichiers en texte brut, des problèmes peuvent survenir si un type de fichier différent est importé.

J'ai remarqué dans la console que le navigateur détecte le type de contenu du fichier importé. Voici un exemple.

fileName: "ideas.txt" 
fileSize: 377 
name: "ideas.txt" 
size: 377 
type: "text/plain" 
webkitRelativePath: "" 

Est-il possible, alors, de mettre en place un argument sur lequel le script détecte le type de contenu du fichier, et si elle ne fait pas partie d'un certain nombre de appropriés types de contenu spécifiés, ont le script refuser de l'importer?

Merci d'avance pour tout conseil.

+0

Je pense, par « détecter le type de contenu » u signifie, déduisant de l'extension du fichier .. –

+0

inférant par l'extension serait une façon de le faire, mais j'espérais que je pouvais accéder à tout ce qui dit le front ser qu'un fichier est, par exemple, "text/plain" ou "text/x-tex" ou "image/jpeg" et ainsi de suite. –

Répondre

14
if (file.type.match('text/plain')) { 
    // file type is text/plain 
} else { 
    // file type is not text/plain 
} 

String.match est une expression régulière, donc si vous voulez vérifier, si le fichier est tout type de texte, vous pouvez le faire:

if (file.type.match('text.*')) { 
    // file type starts with text 
} else { 
    // file type does not start with text 
} 
10

Le type de contenu peut être lu avec le code suivant:

// Note: File is a file object than can be read by the HTML5 FileReader API 
var reader = new FileReader(); 

reader.onload = function(event) { 
    var dataURL = event.target.result; 
    var mimeType = dataURL.split(",")[0].split(":")[1].split(";")[0]; 
    alert(mimeType); 
}; 

reader.readAsDataURL(file); 
+0

une autre option (plus simple) est de simplement vérifier: dataURL.split (",") [0] .split (":") [1] .split (";") [0] .indexOf ([votre type mime] > = 0 – Alberto