Nicht erfasster TypeError: URL.createObjectURL: Argument 1 ist für keine der 1-Argument-Überladungen gültig

Lesezeit: 3 Minuten

Linos Benutzer-Avatar
Linoleum

Ich versuche, den Administratoren per Knopfdruck einen CSV-Download zur Verfügung zu stellen. Der dazu verwendete Ajax-Aufruf wird über einen Button im WordPress Admin-Dashboard ausgelöst. Für den AJAX-Teil habe ich größtenteils den Code aus Jonathan Amends Antwort auf diese Frage kopiert. Mit ein paar Anpassungen und der serverseitigen Einrichtung habe ich versucht, die csv-Datei herunterzuladen. Das Download-Fenster erscheint nicht und die Konsole sagt:

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

Mit Argument 1 kann es nur die bedeuten blob die von der Serverseite gesendet wird. Die Dokumentation für URL.createObjectURL sagt:

Objekt: Ein Datei-, Blob- oder MediaSource-Objekt, für das eine Objekt-URL erstellt werden soll.

Zusammengenommen kann das nur bedeuten, dass die blob Die vom Server empfangenen Daten haben ein falsches Format. Wenn ich mich anmelde typeof blob zu trösten, heißt es "string".

Dies ist Teil des serverseitig verwendeten Codes:

    // 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

Wenn ich FPUT 2 auskommentiere, kann die CSV heruntergeladen werden (natürlich nur mit den Spaltennamen und ohne Daten). Der typeof blob Änderungen an "object". Ich habe versucht, das Ganze umzuwandeln blob ausdrücklich vor dem Aufruf der URL.createObjectURL in JS, wodurch ich die Datei erfolgreich und fehlerfrei herunterladen konnte, aber die tatsächlichen Zeilen waren nirgendwo zu sehen. Was unterscheidet also den 2. FPUT?

EDIT 1: Ich habe einige weitere Tests durchgeführt. Wenn ich die nehme FPUT1 außerhalb der if-Anweisung wird derselbe Fehler ausgegeben. Innerhalb des .php-Skripts gibt es keine anderen var_dump, print_r oder echo wer könnte diese Ausgabe produzieren. Auch beim Anlegen echo "test"; Ganz am Ende dieser Datei kommen die beiden Zeilenumbrüche noch danach. Ich konnte dies beheben, indem ich den gesamten Code in die Hauptdatei plugin.php verschob. Der Client betrachtet die Antwort jedoch immer noch als Zeichenfolge, obwohl er my geändert hat SELECTzu einer einzelnen INT-Spalte.

  • Sind Sie sicher, dass Ihr PHP-Code keine Fehler produziert, haben Sie das tatsächlich überprüft? Haben Sie die Anfrage in Ihren Browser-Entwicklungstools überprüft und den Antwortcode überprüft?

    – CBroe

    30. Oktober 2020 um 14:33 Uhr

  • Ich weiß nicht, wie ich das überprüfen soll. In Entwicklungstools gibt dieser POST-Aufruf jedoch den Status 200 sowie alle gewünschten Daten unter der Registerkarte „Antwort“ zurück. Was auch immer der Grund ist, die Antwort beginnt mit 2 Zeilenumbrüchen. Das Kopieren und Überprüfen der Antwort auf Notepad zeigte keine Sonderzeichen oder ähnliches, einfach CRLF.

    – Lino

    30. Oktober 2020 um 14:51 Uhr

  • Ich verstehe nicht, warum solche Zeilenumbrüche verhindern sollten, dass der Download-Teil funktioniert, aber so oder so müssen diese von Ihrem PHP-Skript kommen. Und ich sehe nicht, wie man die Zeile darunter auskommentiert // FPUT 2 Daran sollte sich sogar nichts ändern – die Header der Datei hast du auf jeden Fall zuerst unter geschrieben // FPUT 1also wenn diese Zeilenumbrüche in irgendeiner Weise resultieren aus // FPUT 2dann würde ich erwarten, dass sie kommen nach die Kopfzeile, nicht ganz am Anfang der Datei … Sie müssen hier noch etwas debuggen, ich glaube nicht, dass irgendjemand von außen erkennen kann, was hier vor sich geht.

    – CBroe

    30. Oktober 2020 um 14:55 Uhr

1446880cookie-checkNicht erfasster TypeError: URL.createObjectURL: Argument 1 ist für keine der 1-Argument-Überladungen gültig

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy