Dateiupload mit Form unter PHP?

Hallo zusammen,

auf meiner Seite http://mediadaten.kinderflohmaerkte.de biete ich im
Formular die Möglichkeit an, ein Banner gleich mit dem Formular zu
übertragen. Das klappt leider nicht; die textlichen Inhalte werden
zwar ordentlich versendet, das Banner hängt aber nicht mit dran.

Ich habe von hotscripts.com dieses Form-Prcessor-PHP-Script: http://
www.noviceform.com/

Muß man noch etwas ändern oder beachten unter PHP, wenn man Dateien
mittels einem Formular übertragen möchte?

Vielen Dank im Voraus für Eure Hilfe.
Schönen Gruß, Michael

Hallo Michael,

Muß man noch etwas ändern oder beachten unter PHP, wenn man
Dateien
mittels einem Formular übertragen möchte?

wenn Du mit PHP Bilder hochladen willst, muss die den eingestellen enctype als ‚multipart/form-data‘ haben. Ein File-Input auf dieser Form lässt Dich dann die Datei mit dem Rest der Formulardaten hochladen.

Beispiel:

Nach dem Hochladen holst Du die Datei dann aus dem $_FILE-Array:

 $filename = $\_FILES['newpicture']['name'];
 $tmpfilename = $\_FILES['newpicture']['tmp\_name'];
 if (move\_uploaded\_file($tmpfilename, $newfilename)) {
 print('Datei hochgeladen.');
 } else {
 print('Fehler beim Hochladen.'); 
 }

Den Rest der Form-Daten kannst Du wie gehabt aus dem $_POST-Array lesen.

Schönen Gruß,
Rudy

2 anmerkungen

Nach dem Hochladen holst Du die Datei dann aus dem
$_FILE-Array:

$filename = $_FILES[‚newpicture‘][‚name‘];
$tmpfilename = $_FILES[‚newpicture‘][‚tmp_name‘];
if (move_uploaded_file($tmpfilename, $newfilename)) {
print(‚Datei hochgeladen.‘);
} else {
print(‚Fehler beim Hochladen.‘);
}

zum einen fehlt hier der check ob es sich um eine Grafik handelt. Auf diese Weise könnte man auch eine php Datei ausführen und so im schlimmsten Fall alle Daten löschen oder ähnliches.

zum anderen ist $newfilename in Deinem Beispiel nicht belegt und damit wird das Script auch nicht funktionieren - müsste einfach nur $filename heissen…

HTTP-Upload PHP
Hi Munich,

zum einen fehlt hier der check ob es sich um eine Grafik
handelt. Auf diese Weise könnte man auch eine php Datei
ausführen und so im schlimmsten Fall alle Daten löschen oder
ähnliches.

Und ob :wink: Das Beispiel war praktisch ein Fragment, die ganzen Checks drumherum sind nicht da. Wenn man das einigermaßen sicher machen will, dann dürfen die natürlich nicht fehlen.

if (isset($\_POST['uploadpicture']) && trim($\_POST['uploadpicture']) !== '') {
 $MB = 1048576; //1 MB in Bytes
 $limit = floor($MB \* 1.2); //maximal 1,2 MB
 $filename = trim($\_FILES['newpicture']['name']); //Original-Dateiname
 $ext = strtolower(substr(strrchr($filename, "."), 1); //Erweiterung ermitteln
 if (strlen($filename) && in\_array($ext, array('jpg', 'jpeg')) { //Erweiterung prüfen
 $tmpfilename = $\_FILES['newpicture']['tmp\_name']; //Name der temporären Datei
 $size = $\_FILES['newpicture']['size']; //Dateigröße ermitteln
 if ($size 


> zum anderen ist $newfilename in Deinem Beispiel nicht belegt  
> und damit wird das Script auch nicht funktionieren - müsste  
> einfach nur $filename heissen...

Fehler meinerseits :wink: 

NB:
http://www.wer-weiss-was.de/cgi-bin/forum/showarchive.fpl?ArtikelID=2993959&archived=1&searchtext=HTTP%20Upload&type=parts&bool=and&database=Archiv#2993959
http://www.wer-weiss-was.de/cgi-bin/forum/searcharchive.fpl?&searchtext=HTTP+Upload&op=search&x=0&type=parts&bool=and&theme=0&startdate=0&enddate=0&database=Archiv&entries=30

Gruß,
Rudy

Wow,

offenbar habe ich hier zwei richtige Experten erwischt!
Schonmal vielen Dank für Eure Ausführungen.

Vielleicht habe ich mich nicht ganz korrekt ausgedrückt. Ich möcht
ekeine Dateien auf einen Webspace uploaden, sondern einfach nur
nachher als E-Mail-Anhang erhalten. Mit dem Formular soll das GIF
oder JPG mit übertragen werden.

Ach ja: arrays usw. sind für mich böhmische Dörfer. Ich kann nur
fertigen Code an einer Stelle eines Scripts einfügen, die mir exakt
genannt wird. bestenfalls kann ich noch ein php-Script
eindeutschen…

In diesem Sinne schonmal vielen Dank für erneutes Helfen! Danke!

Gruß, Michael

PHP MIME-Mails?
Hi Michael,

Vielleicht habe ich mich nicht ganz korrekt ausgedrückt. Ich
möchte keine Dateien auf einen Webspace uploaden, sondern einfach
nur nachher als E-Mail-Anhang erhalten. Mit dem Formular soll das
GIF oder JPG mit übertragen werden.

Wenn ich den Zweck verstanden habe, so möchtest Du Leuten die Möglichkeit bieten, auf deiner Webseite einen Banner zu veröffentlichen. Und Du willst das lösen, indem Du Dir den Banner per E-Mail zuschicken lässt, den aus dem Anhang speicherst, und dann… auf den Server lädst und den Link auf deiner Webseite einbindest.

Und dafür möchtest Du nun ein relativ umfangreiches Skript einsetzen, das Mails im MIME-Format, also mit binärem Anhang, versendet.

Frage: Warum sparst Du Dir die ganze Geschichte nicht einfach, lässt die Datei auf dem Server liegen und schickst Dir einen Link in einer simplen Text/Html-Mail zu?

Schönen Gruß,
Rudy

Hi rudy,

weil ich das Banner meinem AdServer zuführen muss.

Ich möchte es meinen Werbetreibenden so einfach wie möglich machen
und darum sollen Sie mir das Banner gleich mit dem Auftragsformular
mitschicken können…

Gruß, Michael

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

PHP MIME-Mail / Bild-Anhang
Hi Michael,

weil ich das Banner meinem AdServer zuführen muss.
Ich möchte es meinen Werbetreibenden so einfach wie möglich
machen und darum sollen Sie mir das Banner gleich mit dem
Auftragsformular mitschicken können…

Ok, das macht Sinn und scheint den Aufwand wert. Hier habe ich Dir ein getestetes Beispielskript gepostet.

Stichwort Spamschutz: Wenn man so ein Skript nicht bedacht schützt, kann ein findiger Spammer den Server als Virenschleuder missbrauchen.
Siehe dazu die Notes auf http://it2.php.net/mail - das Skript unterhalb sollte demnach einigermaßen spamsicher sein.

<?php if (strlen($_POST['sendmail'])) {<br /> $errorMsg = '';
 if (!strlen(trim($\_POST['name']))) {
 $errorMsg = 'Bitte geben Sie Ihren Namen an.
';
 } 
 $regex = '/^[A-z0-9][\w.-]\*@[A-z0-9][\w\-\.]+\.[A-z0-9]{2,6}$/';
 if (!preg\_match($regex, trim($\_POST['email']))) {
 $errorMsg .= 'Bitte geben Sie Ihre gültige E-Mail Adresse an.
';
 }
 if (!strlen($errorMsg)) {
 $boundary='--' . md5( uniqid("myboundary") ); 
 $sep=chr(13).chr(10); 
 $disposition="inline";
 if(eregi("MIME-Version: ",$\_POST['name'].$\_POST['email'].$\_POST['mailtext'])){die('Get out, spammer.');}
 $to="[email protected]"; 
 $cc="[email protected]";
 $subject = "E-Mail von ".trim($\_POST['name'])." am ".date("d.m.Y",mktime());

 $header ="From: ".trim($\_POST['name'])." \nX-Priority: 3 (Normal)\nCC: $cc\n";
 $header.="Mime-Version: 1.0\nContent-Type: multipart/mixed;\n boundary=\"$boundary\"\n";
 $header.="Content-Transfer-Encoding: 8bit\nX-Mailer: Php/libMailv1.3\n";

 $mailtext = wordwrap(implode("\r\n", preg\_split("/\r?\n/", trim($\_POST['mailtext']))),72);
 $message .="This is a multi-part message in MIME format.\n--$boundary\n";
 $message .= "Content-Type: text/plain; charset=iso-8859-1\n";
 $message .= "Content-Transfer-Encoding: 8bit\n\n" . $mailtext ."\n";
 foreach($\_FILES['attachment']['error'] as $key =\> $error) {
 if($error == UPLOAD\_ERR\_OK) { 
 $filename = $\_FILES['attachment']['name'][$key];
 $ext = strtolower(substr(strrchr($filename, "."), 1)); 
 if (!in\_array($ext, array('jpg', 'gif', 'jpeg'))) {
 $errorMsg.="Anhang $filename konnte nicht versendet werden - falsches Dateiformat ($ext)
";
 continue;
 }
 $filetype = $\_FILES['attachment']['type'][$key];
 $message .="--$boundary\nContent-type: $filetype ;\n name=\"$filename\"\n";
 $message .="Content-Transfer-Encoding: base64\nContent-Disposition: $disposition;\n filename=\"$filename\"\n";
 $linesz= filesize( $\_FILES['attachment']['tmp\_name'][$key])+1;
 $fp= fopen( $\_FILES['attachment']['tmp\_name'][$key], 'r' );
 $content = chunk\_split(base64\_encode(fread( $fp, $linesz)));
 fclose($fp);
 $message .= $sep.$content;
 }
 }
 $sent = mail($to, $subject, $message, $header);
 if ($sent) {
 $errorMsg .= "Ihre E-Mail wurde erfolgreich versandt.
";
 }
 }
}

?\>



 E-Mail mit Anhang versenden =$errorMsg?\> 

Name:

E-Mail:

Ihre Nachricht:

Anhang 1:
Anhang 2:

N.B.: Der Code stammt größtenteils nicht von mir, sondern aus dem Handbuch. Ich habe ihn mit Checks versehen, angepasst und getestet. Vielleicht brauche ich sowas ja auch mal :wink:

Wenn Du mehr Infos zu MIME-Mails möchtest:
http://www.php4-forum.de/mime_mail.htm
http://www.infos24.de/phpe/handbuch/23_php_mail.htm

Schönen Gruß,
Rudy

PS: Vorsicht beim Quoten, w-w-w hat den blöden -Bug immer noch nicht behoben. Grrr.

1 Like

Das Böhmische Dorf namens Array

offenbar habe ich hier zwei richtige Experten erwischt!
Schonmal vielen Dank für Eure Ausführungen.

Hm… Danke *g* aber soooo der Profi bin ich auch wieder ned…

Ach ja: arrays usw. sind für mich böhmische Dörfer.

Böhmische Dörfer sind teilweise wirklich schön und manchmal sogar nützlich…
Mir war auch lange unklar was ein Array ist und was man damit machen kann…
Prinzipiell ist es so:

Ein Array vereinigt mehrere Variablen in einer einzigen „Variable“ - dem Array eben.

Wofür ist das nützlich?
Nun, wenn Du zum Beispiel ein Script baust, das verschiedene Sprachversionen anbietet, so wirst Du die Sprachbelegungen in einer separaten Datei speichern. Wenn Du dann auch noch funktionen verwendest müsstest Du alle Ausgaben übergeben oder globalisieren - wenn Du ein array verwendest reicht es diese eine Arrayvariable zu übergeben…

Das ist aber nicht der einzige Vorteil von Arrays - Mit Arrays stehen einem zusätzliche Funktionen zur verfügung - das herauswerfen von doppelten Werten, das sortieren nach Wert oder Schlüssel, das ermitteln des maximalen oder minimalen Wertes in einem array - die einfache überprüfung ob eine bestimmte Variable in diesem Array (irgendwo) gesetzt ist, die ermittlung wieviele Elemente im Array gespeichert sind und vieles mehr.

Auch die Abarbeitung ist einfacher weil man mit for bzw while schleifen viel besser abarbeiten kann und nicht für jede Variable eine extra Prüfung benötigt.

So - nachdem ich jetzt in einem Crashkurs erklärt habe was ein array ist noch kurz ein Beipiel für einen Arrayinhalt.

Ein array wird z.B. so angelegt:

$meinarray = array();

$meinarray[] = "Apfel";
$meinarray[] = "Banane";
$meinarray[] = "Kirsche";
?\>

Dieses Array hat nun drei Variablen gespeichert, auch wenn es vielleicht aussieht als würde der Wert immer wieder überschrieben werden.
Dabei werden dem Array sog. keys zugeordnet.
Sofern Du sie nicht manuell belegst fängt die numerierung immer bei 0 an.
D.h. Du bekommst den Apfel wieder mit einem
echo $meinarray[‚0‘];
(Die ’ sind nicht unbedingt nötig, empfehlen sich aber)

so könnte man nun die drei Früchte auch wieder ausgeben:

for ($i = 0; $i ";
 }
?\>

Du siehst hier dass das ’ weggefallen ist… Wenn Du Variablen für den Key benutzt solltest Du das meiner Erfahrung nach tun - die Variable wird sonst nicht ersetzt :wink:

Du kannst bei der erzeugung des Arrays aber auch Deine eigenen Keys setzen oder die Belegung umdrehen
$meinarray[] = array();
$meinarray[‚Apfel‘] = 1;
$meinarray[‚Banane‘] = 2;
$meinarray[‚Kirsche‘] = 3;

naja - okay - ich denke das reicht erst mal…
Zur auflösung von solchen arrays empfilt sich ein while list…
aber da spicke ich auch jedesmal noch :wink:

1 Like