Formular mit Dateianhang
Thomas L.
- php
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.
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>
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
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.
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