Download per JS

Status
Dieses Thema wurde gelöst! Zur Lösung gehen…

Sprint

Erfahrenes Mitglied
Hallo zusammen,

ich stehe hier vor dem Problem, eine Datei herunterladen zu wollen, ohne daß dafür ein Link angeklickt werden muß.
Konkret ist es so, daß über einen Button mittels AJAX ein PHP Script gestartet wird, das eine CSV Datei erstellt. Funktioniert wunderbar. Anschließend an die Erstellung soll die Datei automatisch heruntergeladen werden, und da hängt es momentan. Ich habe ein kleines PHP Script, das die Datei auch korrekt herunterlädt, wenn es vom Browser gestartet wird. Wird es aber per AJAX gestartet, nachdem die Erstellung durchgeführt wurde, wird nur der Inhalt der Datei geladen, nicht aber der Download angestoßen.
Ich hab auch schon zusätzlich eine htaccess Datei angelegt, die einen Download erzwingen soll - auch kein Erfolg.

Wie kann ich rein über JS einen Download erzwingen?
 

Sprint

Erfahrenes Mitglied
Ok, jetzt weiß ich was du meinst. So ähnlich wie da sieht meine PHP Datei auch aus. Ich habe jetzt auch extra nochmal genau das Beispiel übernommen, komme aber wieder zum selben Ergebnis. Es wird nur der Inhalt der Datei an den Browser gesendet, aber kein Download ausgeführt.
 

Sprint

Erfahrenes Mitglied
Das hier habe ich probiert:
PHP:
// meine ursprüngliche Datei
$datei = "temp/dyncheck.csv";
$dateiname = basename($datei);
$groesse = filesize($datei);
header("Content-Type: application/force-download");
header("Content-Disposition: attachment; filename=".$dateiname);
header("Content-Length: $groesse");
readfile($datei);

// von www Coding übernommen

$file = "temp/dyncheck.csv";
header("Content-Type: application/csv");
header("Content-Disposition: attachment; filename=datei.xml");
header("Content-Length: ". filesize($file));
readfile($file);

Das funktioniert ja auch, wenn es aus der Adressenzeile des Browsers aufgerufen wird. Wird es aber per AJAX aufgerufen, wird nur der Inhalt der Datei zurückgegeben.
 
Zuletzt bearbeitet:

basti1012

Erfahrenes Mitglied
Das geht auch ohne das Php Script und direkt mit Jquery/Javascript.
Bei mir läuft es so
HTML:
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="utf-8">
<title> ajax download</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
</head>
<body>
<button type="button" >download</button>
<script>
$('button').click(function(){
        let url = "dyncheck.csv";
        let new_filename="test_datei.csv";
        $.ajax({
            url: url,
            dataType: 'binary',
            xhrFields: {
                'responseType': 'blob'
            },
            success: function(data, status, xhr) {
                    var link = document.createElement('a'),
                    filename = new_filename;
                    link.href = URL.createObjectURL(data);
                    link.download = filename;
                    link.click();
            }
        });
});
</script>
</body>
</html>
 

Sprint

Erfahrenes Mitglied
Hast du auch ausprobiert, die Funktion aus einer anderen Funktion heraus zu starten? Darum geht es ja, daß der Download gestartet wird, ohne daß ein Button oder ein Link vom User angeklickt werden muß. Er startet die Funktion zur Erstellung der cdv Datei und anschließend soll automatisch die Datei heruntergeladen werden.
 

basti1012

Erfahrenes Mitglied
Meinst du das so
Code:
<script>
function download(){
        let url = "dyncheck.csv";
        let new_filename="test_datei.csv";
        $.ajax({
            url: url,
            dataType: 'binary',
            xhrFields: {
                'responseType': 'blob'
            },
            success: function(data, status, xhr) {
                    var link = document.createElement('a'),
                    filename = new_filename;
                    link.href = URL.createObjectURL(data);
                    link.download = filename;
                    link.click();
            }
        });
}
download()
</script>
Man muß halt nur anklicken wo er es speichern soll, oder meinst du das auch ohne das ?
Es muß den Browser ja gesagt werden wo er das speichern soll, wie es ohne geht weiß ich auch nicht , falls es überhaupt geht.
 
Status
Dieses Thema wurde gelöst! Zur Lösung gehen…