ingobar: Daten speichern: Download anstoßen

Hallo,

ich wollte Daten aus einem Eingabeformular per PHP irgendwo(!) auf dem PC speichern. Dazu sammle ich die Daten mit JS und rufe dann per HTTPRequest eine php-Datei auf, die die Daten schreiben soll. Das funktioniert auch, wenn ich den Ordner auf dem Server vorher festlege. Ich möchte aber, dass ich die irgendwo speichern kann. Ich muss also eine Datei erzeugen (kein Problem) und diese dann als Download anbieten. Genau das bekomme ich aber nicht hin. Hier mal mein Code:

function write_curData($filename,$ending,$data) {
 $data = utf8_encode($data); //wegen Umlauten
 $today = date("Ymd_His");
 if ($filename=="") {
  $filename = 'aktuelleDB_'.$today;
 }
 $dirName = "savedDBs"; //festgelegter Ordner auf dem Server
 $file = "./".$dirName."/".$filename.".".$ending;
 if (file_exists($file)) {
  delete_oldVersion($file); //Inhalte loeschen
 }
 if (!$handle = fopen($file, "w")) {
  echo "Kann die Datei $filename nicht ˆffnen";
  exit;
 }
 if (!fwrite($handle, $data)) { //Daten schreiben
  echo "Kann in die Datei $file nicht schreiben";
  exit;
 }

fclose($handle); //Datei wurde erzeugt

//Ab hier sollte der Download beginnen
 $mm_type="application/octet-stream";

header("Cache-Control: public, must-revalidate");
 header("Pragma: hack");
 header("Content-Type: " . $mm_type);
 header("Content-Length: " .(string)(filesize($file )) );
 header('Content-Disposition: attachment; filename="'.$filename.".".$ending.'"');
 header("Content-Transfer-Encoding: binary\n");

readfile($file);
}

function delete_oldVersion($filename) {
 @fopen($filename, "w");
 @fwrite($filename, "");
 @fclose($filename);
}

write_curData($_POST['filename'],$_POST['ending'],$_POST['data']);

Statt des Dialogs, wie er bei Downloads üblich ist, wird bei mir nur ein neues Browserfenster geöffnet und der Inhalt der Datei reingeschrieben.

Vielleicht liegt es an dem JavaScriptteil, daher hier noch der entsprechenden Code:

var url = "./writedb.php?";
  var data2send = "filename="+cur_db_filename;
  if (type=="normal") {
   data2send += "&ending=iba&data="+escape(changeDataForExport());
  } else {
   data2send += "&ending=sql&data="+escape(changeDataForSQLExport());
  }
  if (saveDB_ajax_anfrage!=null) {
   saveDB_ajax_anfrage.open("POST", url, true);
   saveDB_ajax_anfrage.onreadystatechange = zeigeBestaetigung_save_writeDB;
   saveDB_ajax_anfrage.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
   saveDB_ajax_anfrage.send(data2send);
  } else {
   alert("Es konnte keine Verbindung zum Server aufgebaut werden.");
  }

function zeigeBestaetigung_save_writeDB(){
 if (saveDB_ajax_anfrage.readyState == 4) {
    if (saveDB_ajax_anfrage.status == 200) {
     var antwort = saveDB_ajax_anfrage.responseText;
   var xmlAntwort = saveDB_ajax_anfrage.responseXML;
   var splittedAntwort = antwort.split(" ");
   if (splittedAntwort[0]!="Datenbank") {
    errorWin=window.open('','','left=0,top=0,toolbar=no,location=no,directories=no,status=no,scrollbars=yes,resizable=yes,copyhistory=no,width=800,height=600');
    if (errorWin!=null) {
     errorWin.document.write(antwort);
     errorWin.focus();
    }
   } else {
    alert(antwort);
   }
    } else {
     var antwort = saveDB_ajax_anfrage.responseText;
   alert("Fehler! Anfragestatus ist " + saveDB_ajax_anfrage.status);
   alert(antwort);
     }
   }
}

Ich hatte ja schon gedacht, dass es an meinem errorWin liegt. Aber das Entfernen dieser Zeile hat keine Auswirkung. Auch das Entfernen von onreadystatechange zeigt keine Wirkung. Es wird die Datei auf dem Server korrekt angelegt und dann geht ein Fenster auf mit dem Inhalt der Datei.

Da ich daran jetzt schon ein paar Wochen immer wieder was ausprobiere, wäre ein konkreter Tipp ("schreib das so und so") am liebsten.

Aber auch so möchte ich mich mal bei allen für die Tipps bedanken.