TypeError no detectado: URL.createObjectURL: el argumento 1 no es válido para ninguna de las sobrecargas de 1 argumento

3 minutos de lectura

Avatar de usuario de Lino
Lino

Estoy tratando de proporcionar a los administradores una descarga de CSV al hacer clic en el botón. La llamada ajax utilizada para hacerlo se activa mediante un botón en el panel de administración de WordPress. Para la parte de AJAX, principalmente copié el código de la respuesta de Jonathan Amend sobre esta pregunta. Con algunos ajustes y la configuración del servidor, he estado tratando de descargar el archivo csv. La ventana de descarga no aparece y la consola dice:

Uncaught TypeError: URL.createObjectURL: Argument 1 is not valid for any of the 1-argument overloads.

Por Argumento 1 sólo puede significar el blob que se envía desde el lado del servidor. La documentación para URL.createObjectURL dice:

object: un objeto File, Blob o MediaSource para crear una URL de objeto.

Al juntar eso, solo puede significar que el blob los datos recibidos del servidor tienen un formato incorrecto. Cuando registro el typeof blob para consolar, dice "string".

Esto es parte del código usado en el lado del servidor:

    // Reading arguments, sanitize and validate data
    // Query database and store in $results (as assoc_array)
    $delimiter = ";";
    $file = fopen("php://output","w");

    $cols_printed = false;
    foreach($results as $row) {

        if (!$cols_printed){

            // FPUT 1: Write Aliases of query to file once
            fputcsv($file, array_keys($row), $delimiter);
            $cols_printed = true;
        }

        // FPUT 2: Write values to file
        fputcsv($file, array_values($row), $delimiter);
    }
    // Close file, sending headers

Si comento FPUT 2, entonces se puede descargar el csv (por supuesto, solo con los nombres de las columnas y sin datos). El typeof blob cambios a "object". Traté de convertir todo blob explícitamente antes de llamar al URL.createObjectURL en JS, permitiéndome descargar con éxito el archivo sin error, pero las filas reales no se veían por ninguna parte. Entonces, ¿qué hace que la segunda FPUT sea diferente?

EDIT 1: He hecho algunas pruebas adicionales. si tomo el FPUT1 fuera de la declaración if, arroja el mismo error. Dentro del script .php no hay otros var_dump, print_r o echo que podría producir esta salida. Incluso al poner un echo "test"; al final de este archivo, las dos líneas nuevas vienen aún después. Podría arreglar esto moviendo todo el código al archivo principal plugin.php. Sin embargo, el cliente todavía piensa en la respuesta como una cadena, a pesar de cambiar mi SELECTa una sola columna INT.

  • ¿Está seguro de que su código PHP no produce ningún error? ¿Lo ha verificado realmente? ¿Inspeccionó la solicitud en las herramientas de desarrollo de su navegador y verificó cuál era el código de respuesta?

    – CBroe

    30 oct 2020 a las 14:33

  • No se como verificar eso. Sin embargo, en las herramientas de desarrollo, esta llamada POST devuelve el estado 200, así como todos los datos deseados en la pestaña “respuesta”. Cualquiera que sea la razón, la respuesta comienza con 2 saltos de línea. Copiar e inspeccionar la respuesta al bloc de notas no mostró caracteres especiales ni nada por el estilo, simplemente CRLF.

    – Lino

    30 oct 2020 a las 14:51

  • No veo por qué esas nuevas líneas deberían evitar que funcione la parte de descarga, pero de cualquier manera, deben provenir de su script PHP. Y no veo cómo comentar la línea debajo // FPUT 2 incluso debería cambiar algo al respecto: primero escribió los encabezados en el archivo en cualquier caso bajo // FPUT 1por lo que si esas nuevas líneas resultan de alguna manera de // FPUT 2entonces esperaría que vinieran después la línea de encabezado, no al comienzo del archivo… Vas a tener que depurar un poco más aquí, no creo que nadie pueda decir lo que está pasando aquí desde el exterior.

    – CBroe

    30 oct 2020 a las 14:55

¿Ha sido útil esta solución?