Error: move_uploaded_file() auf eigenem Server

Hallo,

ich möchte meinen Foren-Account dafür benutzen, einem Kumpel zu helfen. Er hat mir vor ein paar Tagen gesagt, dass er bald ein Upload-System für seinen Server (nicht bei bplaced) bauen möchte. Da ich ja früher schon eins für bplaced gebaut habe (und dann wieder offline nehmen musste), hab ich ihm einfach mein Script gegeben.

Nun hat er es in den Server eingespeißt. Bei einem Upload kommt der Success-Text, aber wenn er auf den Link klickt, erhält er nur eine 404-Seite.

Hier der Vermerk aus der error.log:

PHP Warning: move_uploaded_file(content/image_30-10-2014_10-06-27.jpg): failed to open stream: Permission denied in /var/www/foo/bar/uploads/index.php on line 87, referer: http://domain.tdl/uploads/ PHP Warning: move_uploaded_file(): Unable to move '/tmp/phpV7sEqD' to 'content/image_30-10-2014_10-06-27.jpg' in /var/www/foo/bar/uploads/index.php on line 87, referer: http://domain.tdl/uploads/
Ein Hinweis: Er sagt, dass es nicht am tmp- bzw. uploads-Ordner liegt, da diese per chmod 777 (als Root) bekommen haben. Wisst ihr, wo es hier brennt? Würde mich um eine Antwort freuen. :slight_smile:

Gruß, DMan

Scheint als hätte das Script kein Schreibrecht in “content”, so auch immer das liegt.
Liegt der content-Ordner neben der index.php, also /var/www/foo/bar/uploads/content?
Habt ihr es bereits mit einer Absoluten Pfadangabe versucht?

[quote=“heavygale”]Scheint als hätte das Script kein Schreibrecht in “content”, so auch immer das liegt.[/quote]Wurde gegeben, hat aber nichts geändert.

[quote=“heavygale”]Liegt der content-Ordner neben der index.php, also /var/www/foo/bar/uploads/content?[/quote]Korrekt.

[quote=“heavygale”]Habt ihr es bereits mit einer Absoluten Pfadangabe versucht?[/quote]Für was: form-action, target-Ordner?

PS: Der tmp-Ordner ist schon der im Hauptverzeichnis, nicht der unter /var/, oder?
Und vielen Dank für die schnelle Antwort!

Ich meinte den Zielordner, also den zwieten Parameter für move_uploaded_file().

Wo der tmp Ordner liegt ist für das Script egal, da die Funktion ja lediglich den Namen erwartet ($_FILES[‘name_des_formularfeldes’][‘tmp_name’]). Wo der tmp Ordner liegt ist ja in Apache/PHP Konfiguriert

Gibt move_uploaded_file() true oder false zurück?

Ist auf dem Server evtl. Safe Mode aktiviert? Siehe erster Hinweis: de2.php.net/move_uploaded_file

[quote=“heavygale”]Wo der tmp Ordner liegt ist für das Script egal, da die Funktion ja lediglich den Namen erwartet ($_FILES[‘name_des_formularfeldes’][‘tmp_name’]).[/quote]$name = $_FILES['file']['name']; $target = 'content/' . $name; move_uploaded_file($_FILES['file']['tmp_name'],$target);

[quote=“heavygale”]Wo der tmp Ordner liegt ist ja in Apache/PHP Konfiguriert[/quote]; Temporary directory for HTTP uploaded files (will use system default if not ; specified). ; http://php.net/upload-tmp-dir ;upload_tmp_dir =

[quote=“heavygale”]Gibt move_uploaded_file() true oder false zurück? Ist auf dem Server evtl. Safe Mode aktiviert?[/quote]Wie soll ich das rausfinden?

Und nochmal Danke. ^^

[quote=“DManstrator”]

z.b. mit var_dump(move_uploaded_file(…)) was dann eine Ausgabe auf der Seite bewirkt oder if(move_uploaded_file(…)) { erfolg } else { fehler}.
Wenn move_uploaded_file false zurückgibt sollte auch nicht dein Success-Text angezeigt werden. :wink:

Ob Safe Mode aktiv ist kannst du mit ini_get(‘safe_mode’) abfragen, auch dies gibt true oder false zurück.

[quote=“heavygale”]Ob Safe Mode aktiv ist kannst du mit ini_get(‘safe_mode’) abfragen, auch dies gibt true oder false zurück.[/quote]echo ini_get('safe_mode')."<br />"; echo ini_get('upload_max_filesize');
Gibt mir “2M” und nichts anderes aus.
Meintest du sql.safe_mode? Sonst gibt es keinen Eintrag in der php.ini.

Ich habe weiterhin keine Lösung gefunden und bräuchte immer noch Hilfe. o:
Kann evtl. mal ein bplaced-Admin mir sagen, ob es generell an der Config liegt oder ob das anders geregelt werden muss.

Bisher sind wir immer noch nicht weitergekommen. Wir haben die php.ini jetzt die Tmp-Dir doch angegeben.

[code]file_uploads = On

; Temporary directory for HTTP uploaded files (will use system default if not
; specified).
; http://php.net/upload-tmp-dir
upload_tmp_dir = /var/www/tmp_file_upload/[/code]
Dieses Verzeichnis haben wir als Root mit chmod -R 0755 gesetzt. Auch die anderen Verzeichnisse (das Verzeichnis mit dem Upload-Script und das Verzeichnis, wo alles landet) sind auf 0755 gesetzt. Auch die Upload-Datei haben wir 0644 gesetzt. Und ich persönlich find’s seltsam, dass im Error-Log ein anderes tmp-Verzeichnis steht (siehe Code unten).

[Sun Dec 21 11:38:04 2014] [error] PHP Warning: move_uploaded_file(content/image.jpg): failed to open stream: Permission denied [Sun Dec 21 11:38:04 2014] [error] PHP Warning: move_uploaded_file(): Unable to move '[b]/tmp[/b]/phpI1ndpA' to 'content/image.jpg'
Das einzige, was wir gefunden haben ist das hier und das versteht keiner von uns so wirklich.

Würde uns schon helfen, wenn uns das jemand erklären kann. Vielen Dank!

Hallo,

nun möchte ich auch mal versuchen zu helfen.

Ich vermute Ihr habt einen Linux-Server!? Also deinem Link zur Folge sollt Ihr herausfinden wer der Benutzer dieses Services ist, ist bzw. sollte www-data als Benutzer und Gruppe sein.

Nun meine Frage habt Ihr den Ordner als root oder als schulze, meiner, schmidt angelegt? Dann ist Euer Problem die Rechteverwaltung von Linux, welche es verbietet, dass Apache schreiben darf.
Dann darf die Dateiberechtigung nicht 755 sein! Da Ihr der Besitzer seit und die Gruppe, sprich diese sollte www-data sein mit 755 nur Leserechte und Ausführungsrechte besitzt. ist es so, so solltest Ihr dem Ordner mit chmod 775 -R www (am besten gleich den ganzen Ordner) jene Berechtigungen geben. Oder Ihr gebt mit chown -R www-data:www-data www gleich dem Apacheservice jene Rechte. Damit Ihr als Benutzer auch noch Zugriff habt, solltet Ihr euch mit adduser meier,schulze,lehmann www-data in die Gruppe schieben und den Ordner www mit chmod 775 -R www Berechtigung zum schreiben geben.

MFG Micha

PS: Wenn Ihr noch Hilfe mit dem RootServer braucht, schreibt eine PN.