Error de FileReader: el objeto ya está ocupado leyendo Blobs

2 minutos de lectura

Estoy creando un sistema de carga de archivos de arrastrar y soltar para cargar galerías de fotos. Este es mi código fuente que maneja archivos caídos. Este funciona con varios archivos si los coloco uno por uno, funciona, pero cuando coloco más de uno al mismo tiempo, ocurre este error:

Uncaught InvalidStateError: Failed to execute 'readAsDataURL' on 'FileReader': The object is already busy reading Blobs.

function handleFiles(files)
{
    var reader = new FileReader();
    var formdata = new FormData();

    $.each(files, function(i, j)
    {
        $("td.photos span.status").html("Processing file: "+j.name);

        formdata.append('file', j);

        $.ajax({
            url: "uploadalbum.php",
            type: "POST",
            dataType: "json",
            data: formdata,
            processData: false,
            contentType: false,
            success: uploadfinished
        });

        reader.onload = handleReaderLoad;
        reader.readAsDataURL(j);
    });
}

¿Algunas ideas?

  • tienes que llamar FileReader.abort() después de manejar cada onLoad

    – FFF

    5 jun 2018 a las 23:40


Creo que ya te dieron el error.

Error al ejecutar ‘readAsDataURL’ en ‘FileReader’: el objeto ya está ocupado leyendo Blobs

Entonces, ¿el lector de archivos ya está ocupado pero solo cuando suelta varios archivos? Entonces probablemente esté ocupado con el primer archivo (y el segundo falla).

cuando pones var reader = new FileReader(); en su jQuery cada ciclo funcionará como se muestra a continuación:

$.each(files, function(i, j)
{
    var reader = new FileReader();
    $("td.photos span.status").html("Processing file: "+j.name);

    formdata.append('file', j);
    .... <snip>

}

  • ¡Agradable! ¡Me alegro de que te haya ayudado y gracias por avisarnos!

    -Dick van den Brink

    20 de julio de 2014 a las 3:15

Un caso que puede causar esto es cuando se llama dos veces a un lector de archivos. Si aún se está ejecutando, emitirá este error.

    reader.onload = function( event ) {
            // do stuff
        };
    reader.readAsDataURL( file );

    /* arbitrarily complex code */
    reader.readAsDataURL( file2 );

    /* oops */

Avatar de usuario de Bhushan Mahajan
Bhushan Mahajan

Puede intentar reinicializar el objeto FileReader.

    <script type="text/javascript">                                                             

   debugger;        

    ////////////////Write-1/////////////////////////
    
    var blob = new Blob([],  {type: "text/plain"});
    
    for (var i=0; i<10; i++)
    {
      
        blob = new Blob([blob," "+i], {type: "text/plain"});
    }
    
    /////////////////Write-2//////////////////////////
    
    var parts = [];

    for (var i = 11; i < 20; i++) 
    {
        parts.push(" " + i);
    }

     
      
    var blob1 = new Blob(parts);
    
    //////////////////Read-1////////////////////////////
    
    var def = new FileReader();  
    
   def.addEventListener("loadend", function(e) {  var x      = e.srcElement.result;  alert(x); });  

  def.readAsText( blob );  
  
  ///////////////////Read-2/////////////////////////////// 
  
    def = new FileReader();  
    
    def.addEventListener("loadend", function(e) {  var x      = e.srcElement.result;  alert(x); });  
   
    def.readAsText( blob );  
   
 /////////////////////////////////////////////////
     </script>                                               

                                                

¿Ha sido útil esta solución?