2009-06-02 17 views
5

En Firefox 3 es posible acceder al contenido de un elemento <input type="file"> de la siguiente manera.Datos de archivo del elemento de entrada

Asumir un formulario con los siguientes elementos:

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

Ahora los datos del archivo seleccionado se puede acceder con:

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

¿Hay una manera multi-navegador para realizar la misma ¿cosa?

documentación Firefox para esta función:

+0

¿Qué estás tratando de lograr? ¿Vista previa de la imagen en el navegador o cargas de archivos Ajax? –

+0

El objetivo actual es dibujar la imagen en un lienzo. En el futuro, creo que tal vez quiera realizar una carga a través de Ajax. – Doug

+0

Usted es bastante limitado en ese caso. Las cargas de archivos Ajax funcionan en FF 3+, Safari 4+ y Chrome 2+, por lo que puede tener más suerte allí. Yo, por mi parte, no conozco otra forma de importar datos de imagen dentro de un lienzo. Si encuentra uno, actualice esta pregunta. –

Respuesta

8

Esto es posible por lo menos en Chrome, Firefox y Safari: Reading Files. sistémica asociados 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

el código jsFiddle no parece funcionar ahora en Chrome. –

+0

Gracias por señalarlo, he actualizado el violín. Parece que la API se ha finalizado y Chrome ahora está utilizando .slice() en lugar del anterior .webkitSlice(). – Paul

Cuestiones relacionadas