Wie eine Datei lokal speichern ?

Hi.

Ich habe folgendes dicke Problem und ich komme einfach nicht weiter:
Auf einer Website biete ich einige input-Felder an, wo der Benutzer Worte eingeben kann.
Nun soll der User sich diese eingegebenen Daten lokal abspeichern können (im CSV-Format), weil es sehr viele Felder sind.
Problem: Dabei sollte mit PHP ein „Speichern unter“-Dialog geöffnet werden, damit der User sich den Pfad auf seinem Rechner aussuchen kann.

Wie aber bekomme ich den Save-As-Dialog hin…?
(Bisher hatte ich es mit JS versucht, aber da spinnt der IE beim Überschreiben.
Das CSV als solches ist kein Thema.).

Wie mache ich es bloß mit dem Dialog in PHP…???  *verzweifelt*

Daanke!
Markus

Hallo Markuss,

also du musst zunächst den Header setzen, bevor irgendwelche Daten an den browser geliefert werden

 //schreibe Header für CSV-Download raus
 //dadurch wird der ausgegebene Inhalt vom Browser nicht angezeigt, sondern zum Download angeboten.
 header('Content-Description: File Transfer');
 header('Content-Type: application/octet-stream');
 //Dateiname 
 header('Content-Disposition: attachment; filename=download.csv');
 header('Content-Transfer-Encoding: binary');
 header('Expires: 0');
 header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
 header('Pragma: public');

jetzt kannst du ganz normal deine CSV-Daten per echo ausliefern

echo '"Spalte1";"Spalte2";"Spalte3"\r\n';
echo '"daten";"daten";"daten"\r\n';

Das wars auch schon. Ich würde immer vorschlagen, deine Zelleninfos in Anführungszeichen zu setzen, dann kommt die lesende Software auch klar mit Zeilenumbrüchen und Semikolons in der Zelle.

Vorsicht noch mit CSV: Wenn du Anführungsstriche als teil der Zelle hast, musst du diese verdoppeln. Damit weiß die lesende Software, dass da ein Anführungszeichen hinsoll und nicht der Zelleninhalt endet.

$zellenInhalt=str\_replace('"';'""';$zellenInhalt)

und dann

echo '"Spalte1";"Spalte2";"Spalte3"\r\n';
echo '"$zellenInhalt";"...";"..."\r\n';

Viel Erfolg

Günther

P.S. Stern? Bitte gern.

Hi.

Erst einmal danke.

Habe mit jQuery.post(…) eine PHP-Datei aufgerufen, in der dein Quellcode steht.
Angefangen beim header(„Content-Description…“) bis zum header(‚Pragma: public‘).
Logisch, hab auch einen Filename eingesetzt.
Dahinter einige echos mit Text.
Aber es passiert leider überhaupt nichts. Kein Save-as-Dialog, keine lokale Datei.

Was mache ich falsch nur …?

Gruß
Markus

form.html

wandel_forminput_to_csv.php

<?php if (isset($_POST['datenfeld']) ) {<br /> // die Datei 
 $daten = "";
 $daten = implode(",",$\_POST);
 $nameoffile ="test.csv";
 header("Cache-Control: ");// leave blank to avoid IE errors
 header("Pragma: ");// leave blank to avoid IE errors
 header("Content-type: application/octet-stream");
 header("Content-Disposition: attachment; filename=\"" . $nameoffile . "\"");
 header("Content-length:".(string)(mb\_strlen($daten)));
 ob\_flush();
 flush();
 $buffer = $daten;
 print $buffer;
 exit;
}
?\>

Geht leider auch nicht…

bist du dir sicher das du php hast ?

bist du dir sicher das du den richtigen Pfad zum php hast ?

Darf dort auch PHP ausgeführt werden ?

Beate das die Datei auch genutzt werden kann, gegebenfalls mal die Rechte ändern .

Hi,

Habe mit jQuery.post(…) eine PHP-Datei aufgerufen, in der
dein Quellcode steht.

Bist du sicher, dass dieser Aufruf schon stimmt? Kopier mal mein Beispiel in eine ganz leere PHP-Datei und ruf sie auf. Wenn das geht, dann ruf diese Datei ohne weitere Änderungen mit jQuery auf. Wenn das dann irgendwann auch geht, dann kannst du die eigentliche Datenverarbeitung angehen. Ansonsten hast du zuviele Fehlerquellen in deinem Test.

Was mache ich falsch nur …?

Ohne Einblick in ein Minimalbeispiel kann ich dir das nicht sagen.

Günther

Ich denke eher, dass er einen Fehler in seinem jQuery-Aufruf hat. Sein Testfall ist zu komplex und enthält zuviele Fehlermöglichkeiten.

Hi.

Ja, absolut sicher, dass dieser Aufruf stimmt!
Ich bin seit 1985 Programmierer und habe auch diesen Aufruf Schritt für Schritt getesten.
Alles geht, alles wird richtig aufgerufen, verarbeitet, zurückgegeben.
jQuery geht, die aufgerufene PHP-Datei geht auch.
Nur eben nicht mit dem vorgeschlagenem Script. Da geht einfach nichts.*Mist*

Markus

Hi.

Ein Witz, oder?
Ich bin seit 1985 Programmierer und weiß, dass ich PHP programmiere.
Bin auch kein PHP-Anfänger, habe schon für soziale Netzwerke Software erstellt.

Habe bei meinem Problem alles Schritt für Schritt getesten.
Alles geht, alles wird richtig aufgerufen, verarbeitet, zurückgegeben.
jQuery geht, die aufgerufene PHP-Datei geht auch.
Nur eben nicht mit dem vorgeschlagenem Script.
Da geht einfach nichts.
*Mist*

Markus

Achso

jQuery geht, die aufgerufene PHP-Datei geht auch.

Naja , wenn Du schon sooo lange dabei bist ,
dann versuchst du aber nicht ein Http-Request mit JQuery abzusetzen und zu hoffen das der dann als download los gehts ? Das geschieht doch im Hintergrund , also wird der Browser gar nicht zum download kommen . Frag mich obs an den Headern liegt oder sonst was .

Nur eben nicht mit dem vorgeschlagenem Script.

Ich geb Dir 2 Scripts und damit sollte es gehen ,
das Du aufeinmal dein Ausgangsscript verwendest das warscheinlich eine ganz andere request technologie nutzt , das kann ich wirklich nciht ahhhnen .

Da geht einfach nichts.
*Mist*

Ich würd es ganz einfach als Form in den DOM bauen und SENDEN .
Sollte gehen .

Markus

TechPech

Ach da ist ja der Fehler .

Der sendet ja auch nicht eine FORM sondern macht sein eigenen post Request , der landet aber niemals im Browser zum Download, sondern als Antwort beim Script .

1 Like

Hallo ,

zurückgegeben.

das heisst also im Javascript steckt deine Datei ?

jQuery geht, die aufgerufene PHP-Datei geht auch.

Wenn du einfach eine Datei Schreiben würdest, dann wäre das mit der PHP Datei auch nicht das Problem , bleibt immer noch dein Aufruf .

Markus

Nech ist TechPech

Hier Meine Lösung

function formsend() {
$form = $(’<form>’, {action: ‚wandel_forminput_to_csv.php‘, method: ‚post‘});
$form.append( $(’<input>’,{name:„text1“,type:‚text‘, value:‚test‘}));
$form.append( $(’<input>’,{name:„text2“,type:‚text‘, value:‚test‘}));
$form.append( $(’<input>’,{id:„datenfeld“, name:„datenfeld“,type:‚hidden‘, value:‚Abschicken‘}));
$(„body“).append($form);
$(„form“).submit();
}

das datenfeld hab ich nur wegen dem script , würd ich aber mit sessions regeln .

1 Like