Thomas L.: Formular mit Dateianhang

Hallo Forumler,

ich hatte wegen meines oben genannten Problems hier nun schon einige Male geschrieben und damit sicher Eure Nerven sehr strapaziert. Dafür möchte ich mich hier jetzt einmal entschuldigen und gleichzeitig noch einmal für Eure großartige Hilfe danken.

  • Jetzt hat es anscheinend endlich geklappt. Manchmal sieht man halt den Wald vor lauter Bäumen nicht ;-)

Und doch habe ich hier noch einmal eine Bitte: Ich bin mir nicht sicher, ob das Script hundertprozentig in Ordnung ist. Daher bitte ich abschließend über unten stehende Zeilen zu sehen. Wäre wirklich riesig. Schon mal vielen Dank dafür. Ich bin echt über jeden Hinweis dankbar.

Freundliche Grüße
Thomas L.

session_start();

//Überprüfung des Upload-Feldes
if (isset($_FILES['file']['name']) && trim($_FILES['file']['name']) != "") {
   $max_attach_size = 2097152;
   if ($_FILES['file']['size'] > $max_attach_size) {
      $errors[] = "Attachment zu groß";
      }
   elseif ($_FILES['file']['error'] != UPLOAD_ERR_OK) {
      $errors[] = "Die Übertragung der Datei ist fehlgeschlagen";
      }
   else {
      $file_copy = "../tmp/".$_FILES['file']['name'];
      move_uploaded_file($_FILES['file']['tmp_name'],$file_copy);
      $_SESSION['file'] = $file_copy;
      $_SESSION['filetype'] = $_FILES['file']['type'];
      }
   }

//Attachment
if (isset($_SESSION['file'])) {
   $filename = basename($_SESSION['file']);
   $datei_content = fread(fopen($_SESSION['file'],"r"),filesize($_SESSION['file']));
   $datei_content = chunk_split(base64_encode($datei_content),76,"\n");
   $header .= "\n\n--$boundary";
   $header .= "\nContent-Type: ".$_SESSION['filetype']."; name="".$filename.""";
   $header .= "\nContent-Transfer-Encoding: base64";
   $header .= "\nContent-Disposition: attachment; filename="".$filename.""";
   $header .= "\n\n".$datei_content;
   }

//hochgeladene Datei löschen, wenn Mail verschickt wurde
if (isset($_SESSION['file'])) {
   unlink($_SESSION['file']);
   session_unset();
   session_destroy();
   }

//Formular
<form name="feedback" action="<? echo $PHP_SELF."?".session_name()."=".session_id(); ?>" method="post" enctype="multipart/form-data">

Attachment:<br>
<?php
if (isset($_SESSION['file'])) {
    $filename = basename($_SESSION['file']);
    echo "Die Datei ".$filename." wurde bereits hochgeladen.";
    }
else { ?><input type="file" name="file" size="40">
<?php } ?>

</form>

  1. Hello,

    session_start();

    //Überprüfung des Upload-Feldes
    if (isset($_FILES['file']['name']) && trim($_FILES['file']['name']) != "") {

    Du solltest immer mit der Auswertung des Fehlerwertes anfangen. Sollte der nämlich ungelich 0 sein, kannst Du Dir alle anderen Überprüfungen schenken.

    if (isset($_FILES['file']['error']) and $_FILES['file']['error'] === 0)

    Wenn der Wert === 0 ist (identisch 0) dann ist genau ein File fehlerfrei hochgeladen worden.
    Der Error-wert könnte auch noch ein Array sein, dann wurden mehrere Files hochgeladen.

    else {
          $file_copy = "../tmp/".$_FILES['file']['name'];
          move_uploaded_file($_FILES['file']['tmp_name'],$file_copy);
          $_SESSION['file'] = $file_copy;

    hier solltest Du sicherheitshalber basename($_FILES['file']['name']) benutzen, da man
            Dir ggf. auch einen Pfad unterschieben könnte. In wieweit PHP hier schon selber
            'kastrierend' tätig wird, weiß ich nicht.

    $_SESSION['filetype'] = $_FILES['file']['type'];

    Den MIME-Type des Files solltest Du lieber mit einer Funktion festelstellen
            http://forum.de.selfhtml.org/archiv/2005/2/t100192/#m613445

    }
       }

    //Attachment
    if (isset($_SESSION['file'])) {
       $filename = basename($_SESSION['file']);

    aha, hier kommt also basename() ;-)

    $datei_content = fread(fopen($_SESSION['file'],"r"),filesize($_SESSION['file']));
       $datei_content = chunk_split(base64_encode($datei_content),76,"\n");

    $header .= "\r\n\r\n--$boundary";

    Header werden mit \r\n oder besser gesagt mit CRLF abgeschlossen!
    Bei Base64 Abschnitten sit das \n aber richtig

    $header .= "\r\nContent-Type: ".$_SESSION['filetype']."; name="".$filename.""";
       $header .= "\r\nContent-Transfer-Encoding: base64";
       $header .= "\r\nContent-Disposition: attachment; filename="".$filename.""";
       $header .= "\r\n\r\n".$datei_content;
       }

    ...

    Harzliche Grüße aus http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    1. Hallo,

      vielen Dank für deine aufschlussreichen Hinweise.

      Den MIME-Type des Files solltest Du lieber mit einer Funktion festelstellen
      http://forum.de.selfhtml.org/archiv/2005/2/t100192/#m613445

      Den Mime-Typ werde ich dann wohl mit PHP auslesen. Vor allem, wenn es hier schon einige Probleme gegeben hat. Erst mal schauen, ob die Funktion unterstützt wird ;-)

      Header werden mit \r\n oder besser gesagt mit CRLF abgeschlossen!
      Bei Base64 Abschnitten sit das \n aber richtig

      CRLF? Was ist das? Wo finde ich hierzu genauere Informationen?

      Vielen Dank für deine Bemühungen und Gruß

      Thomas L.

      1. Hello,

        CRLF? Was ist das? Wo finde ich hierzu genauere Informationen?

        Das sind die Codes   0Dh 0Ah
        So ist es in der RFC vorgesehen.
        Wenn man jetzt \r\n in den Text einfügt, dann werden diese Synonyme ggf. nochmals Betriebssystem-spezifisch gegen die tatsächlichen Codes ersetzt und nicht  \r = 0Dh  und  \n = 0Ah

        Bei PHP habe ich aber bisher keine Abweichung von  \r = 0Dh  und  \n = 0Ah  feststellen können, bei anderen Sprachen (PERL) kann das aber von MAC zu DOS zu UNIX ... Unterschiede geben.

        Sichererer ist es daher, sich eine Konstante CRLF mittes

        define('CRLF',chr(13).chr(10))

        zu definieren. Dann sollte nix mehr schief gehen.

        Harzliche Grüße aus http://www.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau