PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Suche Upload Formular


Olodin
2003-09-30, 13:29:44
Ich suche ein einfaches Formular, mit dem ich Dateien über HTTP auf den Webserver laden kann. Wichtig dazu wäre auch ne Dokumentation, damit ich das Teil anpassen kann.

Im Netz hab ich zwar schon ein paar gefunden, aber immer ohne Doku und Anforderungen. Bin kein php/cgi/pl Genie. :)

Der Server steht bei mir rum, kann also alles mit machen, falls nötig.

Nase
2003-09-30, 13:37:32
Am besten mal hier vorbeischauen http://www.dclp-faq.de/q/q-formular-upload-php4.html
Sollte man mit ein bisschen probieren durchaus hinkriegen. Wenn nichts hilft, dann frag einfach nochmal hier nach.

Olodin
2003-10-01, 14:49:13
Original geschrieben von Nase
Am besten mal hier vorbeischauen http://www.dclp-faq.de/q/q-formular-upload-php4.html
Sollte man mit ein bisschen probieren durchaus hinkriegen. Wenn nichts hilft, dann frag einfach nochmal hier nach.

Hm, das Listing am Ende dieses Artikels ist nicht vollständig, oder sehe ich das falsch?

Wie würde denn konkret das php-file aussehen, auf welches das Formular dann zugreift?
Am besten wäre wohl ein Beispiel mit funktionierendem php file, dem html Forumular und Angaben zur Serverumgebung.
Das ganze dann auf meine Bedürfnisse anzupassen, sollte dann kein Problem sein.

Nase
2003-10-01, 15:41:06
Da steht alles drin was du brauchst. Allerdings sollte man das noch ein bisschen umformen, um die Dateinamen beizubehalten. In meinem Script (das ich hier nicht posten werde, da es noch viel mehr kann als nur einen DateiUpload und ausserdem mit 300 Zeilen nicht allzu einfach zu durchschauen ist) mache ich das in etwa so:

//Datei auf den Server hochladen

//maximale Bildgroesse in Bytes, Standard sind 30KByte
$max_groesse = 30720;

if (isset($_FILES[$i]) && ! $_FILES[$i]['error'] && $_FILES[$i]['size'] <= $max_groesse)
{

$dateiname = explode("/",$_FILES[$i]['name']);
$counter = count($dateiname);

$dateiendung = explode(".", $dateiname[$counter-1]);

move_uploaded_file($_FILES[$i]['tmp_name'], './fotos/' . md5($dateiendung[0]) . '.' . $dateiendung[1]);

}

Das Ganze Script ist jetzt allerdings noch auf einen multiplen Upload ausgelegt, und zudem werden die Dateinamen noch per md5 verschlüsselt (im Originalen Script kommen da noch ein paar Parameter mehr dazu, hab ich aber bereits entfernt).
Was du nun noch austauschen müsstest, ist das $i bei allen $_FILES. Da muss einfach nur der Name deines Formulars rein. Ach ja, und den Ort, wo die Dateien hin sollen, könntest du auch noch ändern :)

Olodin
2003-10-01, 17:21:55
OK, bin noch im Versuchsstadium:

Hab jetzt zwei Dateien:

submit.html und upload.php

submit.html:
<h1>Hallo</h1>
<form action="upload.php" method="post"
enctype="multipart/form-data">
<input type="file" name="probe" />
<input type="submit" value="los" />
</form>

upload.php
//Datei auf den Server hochladen
//maximale Bildgroesse in Bytes, Standard sind 30KByte

$max_groesse = 30720;

if (isset($_FILES[submit.html]) && ! $_FILES[submit.html]['error'] && $_FILES[$i]['size'] <= $max_groesse)


{

$dateiname = explode("/",$_FILES[submit.html]['name']);

$counter = count($dateiname);

$dateiendung = explode(".", $dateiname[$counter-1]);

move_uploaded_file($_FILES[submit.html]['tmp_name'], '/tmp' . md5($dateiendung[0]) . '.' . $dateiendung[1]);

}


Die beiden Dateien liegen auf dem Server. Wenn ich jetzt auf Submit klicke, wird einfach nur der Text des upload.php Files angezeigt. Läuft also noch was schief...

Nase
2003-10-01, 17:24:47
PHP Code beginnt immer mit <?php und endet mit ?> . Ausserdem muss das $_FILES[probe] und nicht $_FILES[submit.html] heissen.

Olodin
2003-10-01, 17:41:53
Original geschrieben von Nase
PHP Code beginnt immer mit <?php und endet mit ?> . Ausserdem muss das $_FILES[probe] und nicht $_FILES[submit.html] heissen.

Ahh, danke. Jetzt funzt zumindest das PHP Script, hab allerdings noch Probleme mit den Rechten auf dem Server:


Warning: Unable to create '/tmp08c0868d033b608e36509c457af8ff96.html': Permission denied in /home/user/public_html/upload.php on line 17

Warning: Unable to move '/tmp/phpP0aQWm' to '/tmp08c0868d033b608e36509c457af8ff96.html' in /home/user/public_html/upload.php on line 17


Das sollte aber jetzt hinhauen irgendwie. Anscheinend hat der apache User keinen Zugriff auf das File, oder wie?

Nase
2003-10-01, 17:45:33
Hast du dem /tmp Ordner denn auch volle Zugriffsrechte gegeben? Chmodde den mal auf 0777.

Olodin
2003-10-01, 17:50:13
Original geschrieben von Nase
Hast du dem /tmp Ordner denn auch volle Zugriffsrechte gegeben? Chmodde den mal auf 0777.

Haben alle Zugriff drauf. Wie bekomm ich die Checksum Sache aus deinem Script? Würde die move_xxx Zeile ohne so aussehen:


move_uploaded_file($_FILES[probe]['tmp_name'], '/tmp' '.' . $dateiendung[1]);

Nase
2003-10-01, 17:55:14
Vielleicht liegt das auch nur an einem kleinen Fehler meinerseits. Probier mal $_FILES['probe']

Olodin
2003-10-01, 18:01:20
Original geschrieben von Nase
Vielleicht liegt das auch nur an einem kleinen Fehler meinerseits. Probier mal $_FILES['probe']

Zeigt leider keine Wirkung. An der Checksum könnte es nicht liegen, oder?
Hm, vielleicht liegt es an einer Apache Einstellung, werd ich mal nachschaun.

Nase
2003-10-01, 18:22:27
Ok, jetzt hast du es geschafft. Hier mal ein Script, was eigentlich funktionieren sollte. Habe es aber noch nicht getestet.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<html>
<head>
<title>Upload</title>
</head>

<body>

<?php

if(isset($abschicken))
{

//Datei auf den Server hochladen

//maximale Bildgroesse in Bytes, Standard sind 30KByte
$max_groesse = 30720;

//Es werden soviele Daten hochgeladen, wie in den verfuegbaren Feldern angegeben wurden
for ($i = 0; $i < 3; $i++)
{

if (isset($_FILES[$i]) && ! $_FILES[$i]['error'] && $_FILES[$i]['size'] <= $max_groesse)
{

$dateiname = explode("/",$_FILES[$i]['name']);
$counter = count($dateiname);

$dateiendung = explode(".", $dateiname[$counter-1]);

move_uploaded_file($_FILES[$i]['tmp_name'], md5($dateiendung[0]) . '.' . $dateiendung[1]);

}

if ($_FILES[$i]['size'] > $max_groesse)
{
echo 'Datei ist zu gro&szlig;!<br>';
}

}

}

?>

<br>

<form method="post" enctype="multipart/form-data" action="upload.php">
<table width="60%" cellspacing="1" cellpadding="2" boder="0" bgcolor="#10216B" align="center">
<tr bgcolor="#FFFFFF">
<td>
<input type="file" name="0"><br>
<input type="file" name="1"><br>
<input type="file" name="2"><br>
</td>
</tr>
<tr bgcolor="#FFFFFF">
<td colspan="2" align="center">
<input type="submit" name="abschicken" value="Abschicken">
</td>
</tr>
</table>
</form>

</body>
</html>

Die Datei muss upload.php heissen.


//Edit: ein paar überflüssige Funktionen entfernt

Olodin
2003-10-01, 19:38:16
Original geschrieben von Nase
Ok, jetzt hast du es geschafft. Hier mal ein Script, was eigentlich funktionieren sollte. Habe es aber noch nicht getestet.

*snip*

Die Datei muss upload.php heissen.


//Edit: ein paar überflüssige Funktionen entfernt

Habs jetzt mal mit der Datei probiert, wenn ich die exakt so übernehme, bekomme ich folgende Fehlermeldungen:


Warning: Unable to create '916550c11df02b334432a50285e008e9.TXT': Permission denied in /var/www/html/upload.php on line 62

Warning: Unable to move '/tmp/php0U9xul' to '916550c11df02b334432a50285e008e9.TXT' in /var/www/html/upload.php on line 62


Ich hab mich grad mal kurz durch die php.ini auf meinem System gewühlt, für File Uploads wird jetzt anscheinend der /tmp Ordner genommen, brauch man also in der move Zeile nicht mit angeben.
Ich versteh nur nicht, warum jetzt immer noch permission denied kommt.

Matthias2x
2003-10-01, 20:45:52
such mal in deiner php.ini nach "safe_mode". wenn dort "on" steht, dann änder das mal auf "off" und starte danach den Webserver neu, falls du PHP als Apache-Modul laufen hast. könnte das Problem beheben

Olodin
2003-10-01, 21:26:00
Original geschrieben von Matthias2x
such mal in deiner php.ini nach "safe_mode". wenn dort "on" steht, dann änder das mal auf "off" und starte danach den Webserver neu, falls du PHP als Apache-Modul laufen hast. könnte das Problem beheben

safe_mode ist Off. Brauch ich auch so für ein paar andere Sachen.

*grml* Ich werd mir das morgen mal weiter anschauen.

Nase
2003-10-01, 22:09:23
Wenn du PHP lokal laufen lässt, dann musst du in deinem PHP Verzeichnis natürlich einen Ordner /tmp (ggf. anders, je nachdem, was in der php.ini angegeben ist) anlegen.

Olodin
2003-10-02, 08:51:56
Original geschrieben von Nase
Wenn du PHP lokal laufen lässt, dann musst du in deinem PHP Verzeichnis natürlich einen Ordner /tmp (ggf. anders, je nachdem, was in der php.ini angegeben ist) anlegen.

Die Einstellung dafür in der php.ini sieht so aus:

; Temporary directory for HTTP uploaded files (will use system default if not
; specified).
;upload_tmp_dir =

Nach meinem Verständnis müsste er so die Dateien nach /tmp schreiben. Habs auch mal testweise auf folgendes geändert um wirklich sicher zu gehen:
upload_tmp_dir = /tmp

Geht leider immer noch nicht. :(

Ich würd das ganze einfach gerne realisieren, um den FTP Server von extern nicht erreichbar machen zu müssen.

Hm, vielleicht sollte ich es mit einem Script versuchen, welches auf den lokalen FTP zugreift?

Trotzdem schonmal vielen Dank an euch!!!

Nase
2003-10-02, 09:07:34
Ich hatte bei mir auch das Problem, dass bei mir das Temp Verzeichnis fehlte. Wenn du die Einstellung dazu in der php.ini auf default lässt, dann brauchst du nur in dem Verzeichnis, wo PHP installiert ist, einen neuen Ordner names temp erstellen, und dann ist alles wieder gut.

Olodin
2003-10-02, 10:35:39
Original geschrieben von Nase
Ich hatte bei mir auch das Problem, dass bei mir das Temp Verzeichnis fehlte. Wenn du die Einstellung dazu in der php.ini auf default lässt, dann brauchst du nur in dem Verzeichnis, wo PHP installiert ist, einen neuen Ordner names temp erstellen, und dann ist alles wieder gut.

Also wenn ich in der php.ini folgendes angebe:

upload_tmp_dir = /tmp

dann geh ich davon aus, dass der Pfad für mein System absolut ist, also das /tmp im root Verzeichnis gemeint ist, welches eine Maske von 777 hat.