BlackBoard (http://www.black-board.net/index.php)
- Design, Programmierung & Entwicklung (http://www.black-board.net/board.php?boardid=55)
-- Webdesign (http://www.black-board.net/board.php?boardid=19)
--- Datei-Upload Script (http://www.black-board.net/thread.php?threadid=21786)


Geschrieben von SpL!T am 24.01.2006 um 10:52:

  Datei-Upload Script

Hi,

wollte mal fragen, wie man ein Script (PHP) schreibt, durch das ein Benutzer eine Datei in einen Ordner auf nem Server uploaden kann. Dabei meine ich, dass im Browser die "Durchsuchen" Form erscheint.

mfg fröhlich



Geschrieben von PygoscelisPapua am 24.01.2006 um 10:58:

  RE: Datei-Upload Script

Sollte da nicht allein schon ein

<form ...>
<input type="file" ...>
</form>

reichen? Dadurch bekommst Du ein Button mit durchsuchen. Gibt noch einige Attribute, mit denen man dann steuern kann, was hochgeladen werden darf, wie groß, etc. Aber das kannst Du ja dann in Selfhtml alles Nachschlagen (je nachdem, was Du brauchst).

[Edit: ]
Das ... soll übrigens heißen, dass da in die jeweiligen Tags noch mehr reingehört, bzw. reingehören kann.



Geschrieben von SpL!T am 24.01.2006 um 14:30:

 

danke für deine rasche Antwort.

Mir ist klar, dass es das von dir geschrieben Form tag braucht, ich frage mich jedoch, wie genau das Ganze reallisiert werden kann. Also wie ich Effektiv eine Datei hochladen mit dieser Form. Kann mir fast nicht vorstellen, dass das nur mit html geht. o.0



Geschrieben von Champus am 24.01.2006 um 15:46:

 

Sowas sollte man am besten per PHP machen, da man dann noch bestimmte Dateigrößen, Dateiendungen und sonstige Parameter viel genauer bzw. sicherer steuern kann (ebenso wie dynamische Dateinamen uvm.)

Mehr dazu hier.



Geschrieben von sleeepy am 11.01.2007 um 14:18:

 

ja mit php is das schon schöner das denk ich auch, deshalb wollt ich das grad mal probieren, jedoch ohne Erfolg, könnte auch dadran liegen, dass ich noch nie was mit php gemacht hab aber naja...mein code für den Upload auf der Seite sieht bis jetzt so aus:

code:
1:
2:
3:
4:
5:
<form action="input_file.htm" enctype="multipart/form-data">
datei hochladen: <input type="file">
<input type="submit" value="senden">
</form>


Das ist doch soweit richtig oder? Was muss jetzt in die input_file.htm rein, damit die Datei in einem Ordner meiner Wahl gespeichert wird??

Hab grad schon bei Selfhtml geguckt und mir die gepostete Seite näher angeschaut, aber da ich php nicht wirklich kann, komm ich da zu keinem Ergebnis leider :-/


/edit: ok jetzt bin ich soweit, dass der code heir wohl richtig sein sollte, jedoch kann er meine index.php nich anzeigen unglücklich

<?php phpinfo() ?> zeigt mir aber was an, von daher sollte php doch schon funktionieren oder?

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
<?php
$status = $_POST['senden'];
?>
<form action="input_file.htm" enctype="multipart/form-data" method="post">
datei hochladen: <input type="file">
<input type="submit" value="senden">
</form>
<?php
$status = "senden";
echo $status;
?>


//edit2: jetzt hab ich webspace gefunden mit php, aber ersagt es is nen fehler in der zeile:

<form action="input_file.htm" enctype="multipart/form-data" method="post">

///edit3: fehler eliminiert aber ich weis nich genau was ich jetzt mit der input_file.htm is, weil ich hab die ja gar nicht und ich bekomme nur nen fehler dass ich die seite nicht anzeigen kann wenn ich auf senden klicke...

und wenn ich das einfach weglasse, dann läd er keine datei hoch...



Geschrieben von LX am 11.01.2007 um 20:25:

Achtung

Als Form-Action sollte auf jeden Fall ein Script genannt werden, welches mit den gesendeten Daten auch was anfangen kann. Da eine HTML-Datei einzutragen ist wie einem Blinden eine Zeitung zu geben... da gehört also in diesem Fall eine PHP-Datei rein. PHP-Code in HTML-Dateien wird in aller Regel nicht interpretiert.

Ansonsten bringt's immer was, wenn man etwaige Fehlermeldungen mit in den Beitrag schreibt, sonst ist die Fehlersuche ziemlich mühselig.



Geschrieben von sleeepy am 11.01.2007 um 23:46:

 

ok, das hab ich mir schon gedacht, aber auf was für ein php script? ist das noch viel arbeit? ich will ja eigentlich nur ne datei hochladen...so soll das dann aussehen:

klicki

wenn ich das bei mir auf dem lokalen Rechner laufen lasse, dann bekomme ich keine Fehlermeldung, sondern die index.php wird gar nicht erst angezeigt...

und auf dem webspace funktioniert es gar nicht, also da kommen keine Dateien an und es wird auch kein Fehler angezeigt.



Geschrieben von LX am 12.01.2007 um 00:20:

Achtung

Das PHP-Skript, was die Datei in Empfang nimmt und irgendwo ablegt. Kann ja durchaus die gleiche Datei sein, in der auch das Formular steht, nur muss die dann eben *.php heißen und nicht *.htm. In der PHP-Doku gibt's einen netten Abschnitt mit Beispiel zu Dateiuploads, schau da mal rein.



Geschrieben von sleeepy am 12.01.2007 um 01:02:

 

ja dass es ne php file sein muss, ist mir schon klar, ist es auf dem webspace ja auch.

nur die Datei auf die verwiesen werden soll, das geht ja eben dann auch in einer Datei, kann ich das action dann einfach rausnehmen?

den richtigen pfad für die Dateien hab ich jetzt auch schon in der php.ini eingestellt...

Aber es wird keine Datein abgespeichert...unglücklich und ne Fehlermeldung bekomme ich auch nicht unglücklich



Geschrieben von LX am 12.01.2007 um 01:08:

Achtung

In der php.ini kannst du nur Temp-Verzeichnisse für Uploads setzen... außerdem wirst du bei deinem Webspace sicherlich keine Einstellungen in der php.ini bearbeiten können, weswegen das schonmal der Holzweg ist.

Guck dir doch mal das Beispiel an. Dort steht das Formular drin, in dem du _URL_ einfach durch den Dateinamen deines Skripts ersetzen musst. Den PHP-Teil weiter unten kannst du auch weitgehend übernehmen, du musst nur $uploaddir anpassen. Da du bei deinem Webspace-Hoster vielleicht den vollen Pfadnamen nicht kennst bzw. der sicherlich anders aussieht als lokal bei dir auf dem Rechner, kannst du ja

php:
1:
$uploaddir dirname __FILE__ ) . '/uploads/';


nehmen. Das würde dir deine Dateien in ein Unterverzeichnis uploads packen, der Teil davor bestimmt den Pfad zu der Datei, um die es gerade geht.



Geschrieben von sleeepy am 12.01.2007 um 13:19:

 

Dass man in der php.ini nur Temp-Verzeichnisse angeben kann, ist mir klar, das hab ich auch gemacht, da ich in meinem PHP auf meinem Rechner hier zuhause, noch kein tmp-dir eingestellt hatte. Aber da ichja noch keine weitere Verarbeitung der Datei mit drin hab, dacht ich das wär erstmal das schnellste um zu gucken ob überhaupt was ankommt...

Ja ich weis dass ich _URL_ durch den Namen eines PHP-Scripts ersetzten soll, doch ich habe ja keins, oder soll ich aus der index.php auf die index.php verweisen? Weil mir gesagt wurde, man könne das auch in einer Datei machen...

Egal ich hab jetzt in der zweiten Datei den Script von der Seite zum prüfen von Dateiuploads genommen, was soweit funktioniert, dass er mir jetzt wegnigstens sagt, dass die Datei nicht hochgeladen wurde:

Possible file upload attack! Here's some debugging info:
Array
(
)

Also auf meinem lokalen Rechner, denn hier kann ich jetzt auf einmal die Index.php doch anzeigen, wodurch ich den Webspace nich merh brauche...

ich glaub mein Problem ist jetzt noch diese Zeile:

if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploaddir . $_FILES['userfile']['name']))

weil ich ja nicht ein File names userfile habe, aber was muss ich dann da hinschreiben? ausserdem verstehe ich nicht , was in der Zeile genau passiert.... und wieso soll ich in dem $uploaddir noch "dirname ( __FILE__ ) . ergänzen? reicht nicht auch nur der pfad, wenn ich ihn vom untersten Verzeichnis der Festplatte angebe?



Geschrieben von LX am 13.01.2007 um 16:01:

 

Zitat:
Original von sleeepy
Aber da ichja noch keine weitere Verarbeitung der Datei mit drin hab, dacht ich das wär erstmal das schnellste um zu gucken ob überhaupt was ankommt...
Du musst die Datei verarbeiten, ansonsten kannst du so auch nicht prüfen, ob was ankam. Die Doku sagt dazu: "Wurde die Datei in dem temporären Verzeichnis nicht verschoben oder umbenannt, wird sie am Ende des Requests gelöscht."

Zitat:
Ja ich weis dass ich _URL_ durch den Namen eines PHP-Scripts ersetzten soll, doch ich habe ja keins, oder soll ich aus der index.php auf die index.php verweisen? Weil mir gesagt wurde, man könne das auch in einer Datei machen...
Du kannst das alles von einer einzigen Datei aus machen, ja. In diesem Fall nimm deine index.php, baue da in den HTML-Teil dein Upload-Formular ein und packe eben auch den PHP-Code rein, der die Datei entgegennimmt (wenn es eine gibt).

Zitat:
ich glaub mein Problem ist jetzt noch diese Zeile:

if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploaddir . $_FILES['userfile']['name']))

weil ich ja nicht ein File names userfile habe, aber was muss ich dann da hinschreiben?
'userfile' ist hier die Bezeichnung, die Das FILE-Inputfeld deines Formulars hat. Wenn du das Feld mit einem anderen Namen versehen hast, dann muss dieser String natürlich angepasst werden.

Wenn du das alles in der gleichen Datei abhandeln willst, solltest du aber vor dem Ablauf des PHP-Teils prüfen, ob überhaupt eine Datei hochgeladen wurde (denn der Teil wird ja auch ausgeführt, wenn die Seite zum ersten Mal geladen wird und nur das Formular anzeigen soll). Das kannst du aber recht einfach machen, indem du um den PHP-Teil folgende Abfrage packst:

php:
1:
2:
3:
4:
5:
6:
if ( !empty ( $_FILES 'userfile' ] ) )
{
    // ...
    // hier den restlichen PHP-Code rein
    // ...
}


Zitat:
und wieso soll ich in dem $uploaddir noch "dirname ( __FILE__ ) . ergänzen? reicht nicht auch nur der pfad, wenn ich ihn vom untersten Verzeichnis der Festplatte angebe?
Der Pfad reicht natürlich auch, allerdings musst du den dafür kennen (was bei normalem Webspace normalerweise nicht der Fall ist) und dein Script könnte so nie an einem anderen Ort ausgeführt werden. dirname ( __FILE__ ) bestimmt den absoluten Pfad zum aktuellen Script, dabei wäre es dann egal, wo das Script eigentlich liegt.



Geschrieben von sleeepy am 13.01.2007 um 16:53:

 

Rieeesen Danke für die Hilfe LX Augenzwinkern mir hat natürlich die Bezeichnung für mein File-Input Feld gefehlt...

Hab jetzt zum laufen bekommen, so dass ich eine Datei hochladen kann, welche dann in einem von mir bestimmten Verzeichnis gespeichert wird und man bei erfolgreichem Upload noch ein paar Infos zu der Datei bekommt und mit dem if ( !empty... funktioniert nun alles in einer Datei.. smile

Der Code sieht jetzt so aus:

php:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
<?php
$status $_POST['senden'];
?>
<form action="index.php" enctype="multipart/form-data" method="post">
Datei hochladen: <input name="userfile" type="file">
<input type="submit" value="senden">
</form>

<?php
$status "senden";
?>

<?php
if ( !empty ( $_FILES 'userfile' ] ) )
{
$uploaddir '/download/FTP/upload/';
print "<pre>";
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploaddir $_FILES['userfile']['name'])) {
   print "File is valid, and was successfully uploaded.  Here's some more debugging info:\n";
   print_r($_FILES);
} else {
   print "Possible file upload attack!  Here's some debugging info:\n";
   print_r($_FILES);
}
} 
?>

Ist nun vielleicht nicht der beste Quelltext, aber es funktioniert smile

//edit: ja das uploaden klappt jetzt, jedoch sind die hochgeladenen Dateien alle beschädigt.. unglücklich weis da vielleicht jemand Rat? Ich könnte sie jetzt überprüfen, aber davon hab ich ja auch nichts, ich weis ja dass sie nich richtig übertragen wurden irgendwie....

//edit2: also bei Bilddateien bekomme ich immer Fehler beim Öffnen, ne txt-Datei z.B geht ohne Probleme...



Geschrieben von LX am 13.01.2007 um 20:44:

Achtung

Wie groß sind denn die Bilder?

Eventuell überschreitest du damit ein Größenlimit... von denen gibt's nämlich eine ganze Menge: Man kann eins im Formular setzen mit dem versteckten Eingabefeld MAX_FILE_SIZE (das gilt aber nur für den Browser). Dann gibt's noch einen Satz Direktiven in der php.ini (upload_max_file_size und post_max_size). Außerdem gibt's auch noch von Seiten des Apachen eine Einschränkung (LimitRequestBody, aber die ist per Default zumindest für Bilder groß genug).



Geschrieben von sleeepy am 13.01.2007 um 23:24:

 

ok dann werd ich mir nochmal die ganzen größenlimits angucken, die Bilder waren aber alle kleiner als 500KB...werd ich nachher mal gucken und dann Bericht erstatten obs funktioniert.

/edit: ja jetzt hab ich die von php gesetzten Größen auf 100M gesetzt, und grad nochmal geguckt, da war auch nen 8KB großes Bild dabei....das kann ja wohl dann nicht an irgendwelchen Beschränkungen liegen!?


Forensoftware: Burning Board 2.3.6, entwickelt von WoltLab GmbH