Chrome FileReader
-
29-09-2019 - |
Pregunta
Puede alguien darme un ejemplo de uso de la API FileReader ir a buscar contenido de un archivo en cromo?
Parece estar regresando undefined
para mí.
<!doctype html>
<html>
<script>
function handle_files(files) {
console.log(files)
reader = new FileReader()
ret = []
for (i = 0; i < files.length; i++) {
file = files[i]
console.log(file)
text = reader.readAsText(file) //readAsdataURL
console.log(text) //undefined
ret.push(text)
}
console.log(ret) // [undefined]
}
</script>
<body>
FileReader Test
<input type="file" onchange="handle_files(this.files)">
</body>
</html>
Solución
Mi problema era que yo asumí FileReader era síncrono. Esta es la forma correcta de hacerlo. Si usted está en el cromo, el código tiene que estar en ejecución en el servidor (host local o en un sitio). No va a trabajar con un archivo local.
<!doctype html>
<html>
<script>
function handle_files(files) {
for (i = 0; i < files.length; i++) {
file = files[i]
console.log(file)
var reader = new FileReader()
ret = []
reader.onload = function(e) {
console.log(e.target.result)
}
reader.onerror = function(stuff) {
console.log("error", stuff)
console.log (stuff.getMessage())
}
reader.readAsText(file) //readAsdataURL
}
}
</script>
<body>
FileReader that works!
<input type="file" multiple onchange="handle_files(this.files)">
</body>
</html>
Otros consejos
El objeto File API FileReader opera de la misma manera en Chrome que en Firefox, Opera o Internet Explorer 10 (Sí, funciona en IE ).
Simple Ejemplo
Se empieza por declarar una nueva instancia del lector:
var reader = new FileReader();
Definir sus devoluciones de llamada por sus diversas eventos :
reader.onloadend = function( ){
document.body.style.backgroundImage = "url(" + this.result + ")";
}
Y luego pasarlo algo para leer:
reader.readAsDataURL( file );
Violín: http://jsfiddle.net/jonathansampson/K3A9r/
Manejo de múltiples archivos
Cuando se trabaja con varios archivos, las cosas son un poco diferentes. Si bien es claro que necesitamos ciclo sobre la lista de archivos resultante, que también tendrá que utilizar un cierre para evitar que los datos del archivo de conseguir manipulado más numerosas iteraciones:
// Continue only if we have proper support
if ( window.FileReader ) {
// Provide our logic upon the change even of our input
document.getElementById("collection").onchange = function(){
// Couple variables for handling each file
var counter = -1, file;
// Cycle over all files
while ( file = this.files[ ++counter ] ) {
// Create a reader for this particular file
var reader = new FileReader();
// Respond to the onloadend event of the reader
reader.onloadend = (function(file){
return function(){
var image = new Image();
image.height = 100;
image.title = file.name;
image.src = /^image/.test(file.type) ? this.result : "t9QlH.png";
document.body.appendChild( image );
}
})(file);
// Begin reading data for this file
reader.readAsDataURL( file );
}
}
}
Violín: http://jsfiddle.net/jonathansampson/jPTV3/
función de detección
A pesar de FileReader está disponible en casi todos los navegadores modernos, todavía quiere estar seguro de que no causa ningún alboroto para los usuarios en los navegadores antiguos. Antes de utilizar el FileReader, asegúrese de comprobar el objeto de la ventana de su presencia:
if ( window.FileReader ) {
// Safe to use FileReader
}
se ejecutan localmente, De Chrome
debe tener en cuenta que la ejecución de este en un file: /// ruta en Chrome dará lugar a una experiencia roto. De manera predeterminada, las versiones actuales de Chrome no permiten file: /// páginas de acceso a otros archivos. Puede cambiar este comportamiento de carga Chrome con el --allow-file-access-from-files
bandera .
Nota, este método sólo se permitirá el acceso de archivo para los archivos de la instancia del navegador que se abrió con. Si quieres que este sea el caso para todos los tipos de navegadores en el futuro, podría modificar el acceso directo desde el escritorio. Simplemente haga clic en el acceso directo de Chrome, e ir a propiedades. A continuación, añadir la bandera al final del objetivo.