XHTMLforum

XHTMLforum (http://xhtmlforum.de/index.php)
-   Serveradministration und serverseitige Scripte (http://xhtmlforum.de/forumdisplay.php?f=80)
-   -   Erzeugen und Download von JSON-file fehlerhaft (http://xhtmlforum.de/showthread.php?t=74091)

Iago2 17.05.2020 15:12

Erzeugen und Download von JSON-file fehlerhaft
 
Hallo,

Ich erzeuge eine JSON-Datei und möchte diese mit dem Browser herunterladen. Das Erzeugen funktioniert, aber der Download nicht. Ich habe den folgenden Ansatz:

PHP-Code:

function createFile() {
   
    
$date date("d-m-h-i-s");
    
$dir "./JSON/";

    
$file $dir.'CP'.$date.'.json';
    
    
$info '[{"Hello":"JSON"}]';

    
file_put_contents($file$infoFILE_APPEND);

    return 
$file;

    }

    function 
downloadFile($file) {

        if (
file_exists($file)) {
    
header('Content-Description: File Transfer');
    
header('Content-Type: application/octet-stream');
    
header('Content-Disposition: attachment; filename="'.basename($file).'"');
    
header('Expires: 0');
    
header('Cache-Control: must-revalidate');
    
header('Pragma: public');
    
header('Content-Length: ' filesize($file));
    
readfile($file);
    exit;
    }
    


Dann:
PHP-Code:

 downloadFile(createFile()); 


Leider bekomme ich auch keine Fehlermeldung hier. Kann es sein, dass ich $file nicht richtig übergebe? Für eine Hilfestellung wäre ich dankbar.

protonenbeschleuniger 18.05.2020 17:00

Zitat:

Zitat von Iago2 (Beitrag 554245)
Leider bekomme ich auch keine Fehlermeldung hier.

D.h. du hast keine Informationen in der Entwicklerkonsole? Keine Fehlermeldung? Keine Übertragung im Netzwerk?
Das klingt merkwürdig.

Iago2 18.05.2020 19:14

Zitat:

Zitat von protonenbeschleuniger (Beitrag 554249)
D.h. du hast keine Informationen in der Entwicklerkonsole? Keine Fehlermeldung? Keine Übertragung im Netzwerk?
Das klingt merkwürdig.

Nein. Ich rufe die Funktion über AJAX auf. Normalerweise sehe ich in console.log dann die Fehlermeldung. (php error_reporting ist aktiv). downloadFile($file) wird definitv auch ausgeführt.

Benötigen diese Header-Anweisungen nicht einen reload der Seite??

protonenbeschleuniger 18.05.2020 19:22

und was sagt der Netzwerkreiter (CTRL+SHIFT+Q)

Iago2 18.05.2020 20:21

general:
Request URL: http://localhost/cpicks/actions.php?...createLiteJson
Request Method: POST
Status Code: 200 OK
Remote Address: [::1]:80
Referrer Policy: no-referrer-when-downgrade

response headers
Cache-Control: must-revalidate
Connection: Keep-Alive
Content-Description: File Transfer
Content-Disposition: attachment; filename="CP18-05-07-15-04.json"
Content-Length: 18
Content-Type: application/octet-stream
Date: Mon, 18 May 2020 17:15:04 GMT
Expires: 0
Keep-Alive: timeout=5, max=98
Pragma: public
Server: Apache/2.4.43 (Win64) OpenSSL/1.1.1f PHP/7.4.4
X-Powered-By: PHP/7.4.4

request headers
Accept: */*
Accept-Encoding: gzip, deflate, br
Accept-Language: de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7
Connection: keep-alive
Content-Length: 12
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Cookie: PHPSESSID=79k9ngj1uecogbo4151ivl59j4
Host: localhost
Origin: http://localhost
Referer: http://localhost/cpicks/
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36
X-Requested-With: XMLHttpRequest

query string parameters
action: createLiteJson

form data
id=undefined

protonenbeschleuniger 18.05.2020 20:42

Dann kommt alles an. Die Datei ist 18 Byte gross?

Iago2 19.05.2020 14:35

Zitat:

Zitat von protonenbeschleuniger (Beitrag 554254)
Dann kommt alles an. Die Datei ist 18 Byte gross?

Ist das ne Frage ob die Datei 18byte gross ist?
Wo kommt das an? Warum wird kein Download Dialog angezeigt?

cloned 19.05.2020 15:05

Ja, das ist eine Frage ob die Datei, die du erwartest 18 Byte groß ist.

Auch nett, dass du einen Teil von dem Netzwerktab hier kopiert hast, aber da gibt es mehrere Tabs (Zumindest bei Chrome, FF wohl auch)

Da siehst du genau was der Server zurückliefert und kannst dir auch eine Vorschau anzeigen lassen. Was hier wohl erwartet wurde: Dass du dir die Sachen anschaust und uns sagst ob auch wirklich alles so ankommt wie es soll.

Wenn alles ankommt wie es soll und kein download Dialog angezeigt wird kann man dort einmal ansetzen. Kommt es nicht so zurück wie es soll dann muss das php Skript angepasst werden.

Iago2 20.05.2020 19:18

Mit refresh der Seite funzt es, leider mit AJAX nicht.
Hilf wohl nix die Metrik zu analysieren.

Haha, jetzt schreibst mir das hier in die Datei an den Anfang:
./JSON/CP20-05-06-31-07.json is created

Wer braucht das?

protonenbeschleuniger 20.05.2020 22:05

Ajax?
Bis jetzt ging es um Serverseigien Code. Die Frage bisher was, ob das im Browser ankommt das ist was du erwartest. Wenn es beim normalen Aufruf funktioniert, dann liegt es wohl am Ajax Code, den kennen wir aber nicht.

Iago2 21.05.2020 00:25

Zitat:

Zitat von protonenbeschleuniger (Beitrag 554260)
Ajax?
Bis jetzt ging es um Serverseigien Code. Die Frage bisher was, ob das im Browser ankommt das ist was du erwartest. Wenn es beim normalen Aufruf funktioniert, dann liegt es wohl am Ajax Code, den kennen wir aber nicht.

Im Browser kommt sogar mehr an als ich erwarte. So gibt mir console.log den ganzen Inhalt der Datei an.

AJAX request ist auskommentiert.

Code:

$("#JSON-export-full").on("click", function () {
  var url = window.location.href;
  window.location.href = url + "?action=download&variation=full";

  /*  $.ajax({
    type: "POST",
    url: "actions.php?action=createFullJson",
    data: "variation=full",
    success: function (result) {
      console.log(result);
    },
  }); */
});

actions.php (für AJAX request):
Code:

if($_GET['action'] == "createFullJson") {

        $file = createFile(createAJAX($connection,$_POST['variation']));
      // echo $file." is created";

        downloadFile($file);
    }


index.php (reload der Seite):
Code:

if($_GET['action'] == "download") {

  $file = createFile(createAJAX($connection,$_GET['variation']));
      //  echo $file." is created";

        downloadFile($file);
}

Ich hab das echo $file." is created"; in index.php und action.php auskommentiert. Seltsam, dass das bei index.php einfach mit in die Datei reingeschrieben wird.

protonenbeschleuniger 21.05.2020 11:11

Das ist ein ziemliches durcheinander. Die Frage ist aber nach wie vor, warum der download Dialog nicht angezeigt wird?

Da bis hierhin kein offenischtlicher Fehler zu sehen ist, solltest du ganz vorne anfangen und prüfen, was dein Browser macht wenn er diesen Header bekommt. Das geht einfach in dem du dir nur diesen ausgeben läßt.

So könnte eine test.php aussehen:
PHP-Code:

<?php
header
('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="test.php"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: 0');

Wird damit der Dialog angezeigt?

Iago2 21.05.2020 21:56

Zitat:

You can't "download a file using AJAX". AJAX is about downloading data from a server for JavaScript to process.

To let the user download the file either use a simple link to the file/servlet, or if you really, really need to use JavaScript, then assign the URL to document.location.href.
Quelle(1) stackoverflow

Zitat:

It's not about AJAX. You can download a file with AJAX, of course. However the file will be kept in memory, i.e. you cannot save file to disk. This is because JavaScript cannot interact with disk. That would be a serious security issue and it is blocked in all major browsers.

Quelle(2): stackoverflow

Schulmeisterlich geschrieben
Ich verweigere mich hier jedem Kommentar!

protonenbeschleuniger 21.05.2020 22:06

Ich bin verwirrt, AJAX ist genau deshalb erfunden worden damit du JS Code vom Server nachladen kannst. Irgendwie verstehe ich den Sinn von dem was du vor hast nicht. Der AJAX Code ist dafür da, dass du mit dem "runtergeladenen" JS Code weiterarbeiten kannst. Also das der Repsonse im JS ankommt. Wenn du einen Download anstossen willst musst du diesen mit einem normalen Request anstossen.

Daher war mir nicht klar was du hier genau erwartest, bzw. warum deine Erwartung nicht eingetreten ist. Von Ajax war auch wenig zu sehen, deine header Angaben sind nicht vom AJAX Request.

Es ist immer hilfreich wirklich alle Informationen zu teilen.

cloned 22.05.2020 12:22

Ich bin auch verwirrt, aber ich denke hier soll gar nicht eine Lösung gefunden werden? Der Threadstarter möchte lediglich denkanstöße oder Bestätigungen für seine Sachen haben?

Mit Ajax kann keine Datei heruntergeladen werden, das stimmt.
Das heißt aber nicht, dass die Datei dann nicht gespeichert werden kann wenn die Daten per Ajax vom Server an den Browser geschickt wird.


Alle Zeitangaben in WEZ +2. Es ist jetzt 08:39 Uhr.

Powered by vBulletin® Version 3.8.11 (Deutsch)
Copyright ©2000 - 2021, vBulletin Solutions, Inc.

© Dirk H. 2003 - 2020