2009-06-02 2 views
5

Dans Firefox 3, il est possible d'accéder au contenu d'un élément <input type="file"> comme indiqué ci-après.Données de fichier de l'élément d'entrée

Supposons une forme avec l'élément suivant:

<input type="file" id="myinput"> 

maintenant les données du fichier sélectionné sont accessibles avec:

// Get the file's data as a data: URL 
document.getElementById('myinput').files[0].getAsDataURL() 

est-il un moyen multi-navigateur pour accomplir la même chose?

documentation Firefox pour cette fonction:

+0

Qu'essayez-vous d'accomplir? Aperçu de l'image dans le navigateur ou ajouts de fichiers Ajax? –

+0

L'objectif actuel est de dessiner l'image sur une toile. À l'avenir, je pense que je pourrais vouloir effectuer un téléchargement via Ajax, cependant. – Doug

+0

Vous êtes assez limité dans ce cas. Les téléchargements de fichiers Ajax fonctionnent dans FF 3+, Safari 4+ et Chrome 2+, de sorte que vous pouvez avoir plus de chance là-bas. Pour ma part, je ne connais pas d'autre moyen d'importer des données d'image à l'intérieur d'une toile. Si vous en trouvez un, veuillez mettre à jour cette question. –

Répondre

8

Ceci est possible dans au moins Chrome, Firefox et Safari: Reading Files. voir associé jsfiddle

function readBlob(opt_startByte, opt_stopByte) { 

    var files = document.getElementById('files').files; 
    if (!files.length) { 
     alert('Please select a file!'); 
     return; 
    } 
    var file = files[0]; 
    var start = parseInt(opt_startByte) || 0; 
    var stop = parseInt(opt_stopByte) || file.size - 1; 

    var reader = new FileReader(); 

    // If we use onloadend, we need to check the readyState. 
    reader.onloadend = function(evt) { 
     if (evt.target.readyState == FileReader.DONE) { // DONE == 2 
      document.getElementById('byte_content').textContent = _.reduce(evt.target.result, 
       function(sum, byte) { 
        return sum + ' 0x' + String(byte).charCodeAt(0).toString(16); 
       }, ''); 
     document.getElementById('byte_range').textContent = 
      ['Read bytes: ', start + 1, ' - ', stop + 1, 
      ' of ', file.size, ' byte file'].join(''); 
     } 
    }; 

    var blob; 
    if (file.slice) { 
     blob = file.slice(start, stop + 1); 
    }else if (file.webkitSlice) { 
     blob = file.webkitSlice(start, stop + 1); 
    } else if (file.mozSlice) { 
     blob = file.mozSlice(start, stop + 1); 
    } 
    console.log('reader: ', reader); 
    reader.readAsBinaryString(blob); 
    } 

    document.querySelector('.readBytesButtons').addEventListener('click', function(evt) { 
    if (evt.target.tagName.toLowerCase() == 'button') { 
     var startByte = evt.target.getAttribute('data-startbyte'); 
     var endByte = evt.target.getAttribute('data-endbyte'); 
     readBlob(startByte, endByte); 
    } 
    }, false); 
+0

le code jsFiddle ne semble pas fonctionner dans Chrome maintenant. –

+0

Merci d'avoir signalé cela, j'ai mis à jour le violon. Il semble que l'API a été finalisée et que Chrome utilise maintenant .slice() à la place de l'ancien .webkitSlice(). – Paul

Questions connexes