File upload mit move_uploaded_file funktioniert nicht

Alles, was PHP betrifft, kann hier besprochen werden.

File upload mit move_uploaded_file funktioniert nicht

Postby haemmerle » 25. June 2008 09:07

Hallo zusammen.
Ich habe folgendes Problem. Ich habe eine passwortgeschützte Login-Seite mit einem Dateiupload (und Bildverkleinerung). Nun funktioniert dieses Script sehr gut auf meinem Testserver (localhost). Beim Provider aber passiert nichts, d.h. Es schaut aus, als ob die Datei rauflädt, Sie ist aber nirendwo zu finden. Liegt dies vielleicht am Provider (safe mode) oder hat der vielleicht den File upload abgestellt - oder liegt der Fehler bei mir (diese Möglichkeit kommt natürlich immer zuletzt ;)
Danke.

Code:

if (isset($_FILES['bild']) and ! $_FILES['bild']['error']) {
// Alternativ: and $_FILES['bild']['size']
move_uploaded_file($_FILES['bild']['tmp_name'], "./datenbankbilder/" .$_POST['zufallszahl'].$_FILES['bild']['name']);

// Original resizen - start
$file = "./datenbankbilder/" .$_POST['zufallszahl'].$_FILES['bild']['name'];
$target = "./datenbankbilder/".$_POST['zufallszahl'].$_FILES['bild']['name'];
$max_width = "250";
$quality = "90";
$src_img = imagecreatefromjpeg($file);
$picsize = getimagesize($file);
$src_width = $picsize[0];
$src_height = $picsize[1];
if($src_width > $max_width)
{
$convert = $max_width/$src_width;
$dest_width = $max_width;
$dest_height = ceil($src_height*$convert);
}
else
{
$dest_width = $src_width;
$dest_height = $src_height;
}

$dst_img = imagecreatetruecolor($dest_width,$dest_height);
imagecopyresampled($dst_img, $src_img, 0, 0, 0, 0, $dest_width, $dest_height, $src_width, $src_height);
imagejpeg($dst_img, "$target", $quality);
// Original resizen - ende

printf("Bitte kopieren Sie untenstehenden <br />Pfad in die Zwischenablage: <br /><br />");
}
haemmerle
 
Posts: 5
Joined: 24. June 2008 09:38
Location: Pfäffikon

Postby Hanspeter Thöni » 25. June 2008 09:52

Ich sage es auch hier wieder:
Code: Select all
error_reporting(E_ALL);


Denn ich vermute stark, du wirst Scriptfehler kriegen, die helfen, die Ursache zu finden.

Es könnte mit dem SAVE-Mode zusammenhängen, so ein Problem hatte ich auch einmal (ähnliche Aufgabenstellung), schlussendlich habe ich das Temp-File per FTP verschoben, da alles andere wegen Berechtigungsproblemen nicht funktioniert hat.

Ein phpinfo(); könnte allenfalls auch helfen um herauszufinden, was aktiv ist und was nicht.
Gruss Hanspeter
User avatar
Hanspeter Thöni
 
Posts: 233
Joined: 17. August 2004 10:29
Location: Schweiz

Postby Hanspeter Thöni » 25. June 2008 10:57

Hallo

Habe mit phpinfo(); herausgefunden, dass fileupload on ist und das php im safemode ist.

mit error_reporting(E_ALL); habe ich aber gar keine Meldung erhalten.

Wenn ich in meinem http folder ein Unterverzeichnis ./datenbankbilder habe und im script als target auch dieses Unterverzeichnis angegeben habe, dann sollte es ja auch in dieses verzeichniss verschoben werden. Es sieht nämlich aus, als ob alles klappt, nur eben das Bild befindet sich nicht in diesem Ordner.

Danke
Roman Hämmerle


Mach doch mal ein print_r($_FILES) rein, dann kannst du wenigstens mal sehen, ob das File ohne Fehlercode angekommen ist usw.
Gruss Hanspeter
User avatar
Hanspeter Thöni
 
Posts: 233
Joined: 17. August 2004 10:29
Location: Schweiz

Postby Hanspeter Thöni » 25. June 2008 11:12

Habe folgendes Resultat erhalten:

Array ( [bild] => Array ( [name] => ZahlungsbelegLeuchten.jpg [type] => image/pjpeg [tmp_name] => /tmp/phpl2I85F [error] => 0 [size] => 80684 ) )

Werde aber daraus überhaupt nicht schlau ist "phpl2I85F" der temporäre Name diese Files? und was bedeutet dann [erro] => 0 ?

Vielen Dank für Deine Hilfe.

Roman

Nun, das sieht eigentlich gut aus. Ich vermute nachwievor, dass das Verschieben des Files nicht funktioniert (Berechtigung).

Bitte prüfe im phpinfo(); ob ev. Display_errors auf off steht. Wenn ja, (was auf produktivumgebungen durchaus sinn macht), kannst du keine Fehlermeldungen vom Script bekommen, egal welcher Error_reporting level gesetzt ist.

Wenn display_errors auf off steht, sollte ein Log-File (option error_log) und log_errors auf on in phpinfo(); gesetzt sein, wo die Fehlermeldungen reingeschrieben werden. Falls dies nicht der Fall ist, kein Log definiert ist oder du keinen Zugriff auf das Log hast, musst du dich an den Provider wenden, dann das sind Einstellungen welche du nicht selber beeinflussen kannst.

Denn ohne Anzeige der Scriptfehler wird es sehr schwierig sein, solche Fehler zu finden.
Gruss Hanspeter
User avatar
Hanspeter Thöni
 
Posts: 233
Joined: 17. August 2004 10:29
Location: Schweiz

Postby Wiedmann » 25. June 2008 11:26

move_uploaded_file($_FILES['bild']['tmp_name'], "./datenbankbilder/" .$_POST['zufallszahl'].$_FILES['bild']['name']);

Benutze hier einen absoluten Pfad, und keinen relativen.
Wiedmann
AF Moderator
 
Posts: 17102
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

RE: error_reporting(E_ALL); und phpinfo();

Postby haemmerle » 25. June 2008 11:53

mit phpinfo() habe ich herausgefunden, dass error_log = no value, log_errors auf on ist. Ich habe aber keine Möglichkeit (oder ist weiss nicht wie, resp. wo) dieses Logfile anzusehen.
Werde mich einmal an den Provider wenden. Vielen Dank für die Hilfe.
haemmerle
 
Posts: 5
Joined: 24. June 2008 09:38
Location: Pfäffikon

Postby Hanspeter Thöni » 25. June 2008 12:04

Steht display_errors auf off? Das wäre der Grund, warum keine Fehlermeldungen angezeigt werden.

Es gibt 2 Vernünftige Konfigurationen:
1. Display_error ist on, dann werden die Fehlermeldungen in den Browser geschickt (eher für Testumgebungen als für Produktiv geeignet).
2. Display_error ist off, dafür ist ein Log-File aktiviert.

Ist beides nicht aktiv, wird es sehr schwierig, Scriptfehler zu finden.
Gruss Hanspeter
User avatar
Hanspeter Thöni
 
Posts: 233
Joined: 17. August 2004 10:29
Location: Schweiz

RE: error_reporting(E_ALL); und phpinfo();

Postby haemmerle » 25. June 2008 12:13

Display errors steht auf off.

Ebenfalls habe ich noch versucht den Pfad vom relativ auf den absoluten Pfad http://www.xxxxxx/datenbankbilder/xxxx zu ändern. Leider ebenfalls ohne Erfolg.

Gruss
Roman
haemmerle
 
Posts: 5
Joined: 24. June 2008 09:38
Location: Pfäffikon

Postby Wiedmann » 25. June 2008 12:23

Ebenfalls habe ich noch versucht den Pfad vom relativ auf den absoluten Pfad http://www.xxxxxx/datenbankbilder/xxxx zu ändern

Das ist kein absoluter (Dateisystem-) Pfad (was PHP benutzt), sondern eine URI (etwas, was ein Browser benutzt).
Wiedmann
AF Moderator
 
Posts: 17102
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

Re: File upload mit move_uploaded_file funktioniert nicht

Postby Nobbie » 25. June 2008 13:14

haemmerle wrote:Liegt dies vielleicht am Provider (safe mode)


Ja.

Im Safe Mode funktionieren meistens keine Uploads, weil dazu das tmp Verzeichnis die falsche UserID hat. Das ist eigentlich seit vielen Jahren bekannt und auch nicht trivial lösbar.
Nobbie
 
Posts: 13170
Joined: 09. March 2008 13:04

Postby Wiedmann » 25. June 2008 13:23

Im Safe Mode funktionieren meistens keine Uploads, weil dazu das tmp Verzeichnis die falsche UserID hat.

Eben deswegen benutzt man "move_uploaded_file(), und nicht copy()/rename().
Wiedmann
AF Moderator
 
Posts: 17102
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

Postby Nobbie » 25. June 2008 13:59

Wiedmann wrote:Eben deswegen benutzt man "move_uploaded_file(), und nicht copy()/rename().


Ne, das nützt nichts. Da macht auch move_uploaded_file nichts anders.

Gib einfach mal "move_uploaded_file safe mode" in Google ein...
Nobbie
 
Posts: 13170
Joined: 09. March 2008 13:04

Postby Wiedmann » 25. June 2008 14:06

Da macht auch move_uploaded_file nichts anders.

Eben weil es was anders macht, gibt es diese Funktion...

Aber wie schon geschrieben, der OP muss einfach einen absoluten Pfad benutzen, anstatt einen relativen. So wird zwar die Datei verschoben, aber nicht dahin wo er vermutet.

(Das Zielverzeichnis muss natürlich existieren, muss dem PHP-User gehören, und die Zieldatei darf noch nicht existieren)

Gib einfach mal "move_uploaded_file safe mode" in Google ein...

Und dann? Das viele Leute kein PHP-Manual lesen können, war mir schon vorher bekannt ;-)
Wiedmann
AF Moderator
 
Posts: 17102
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

move_uploaded_file()

Postby haemmerle » 25. June 2008 15:05

Wie von Herrn Wiedmann und Herrn Thöni gesagt funktionierte es aus zwei Gründen nicht und zwar...

a) musste ich den Absoluten Pfad angeben und
b) waren die Benutzerrechte für meinen uploadfolder datenbankbilder nicht richtig gesetzt. Der Provider hat dies nun korrigiert und nun funktoniert es tadellos

Vielen herzlichen Dank an beide Herren - ohne sie hätte ich das nie und nimmer geschafft.

Gruss
Roman
haemmerle
 
Posts: 5
Joined: 24. June 2008 09:38
Location: Pfäffikon

Postby Nobbie » 25. June 2008 15:41

Wiedmann wrote:Und dann? Das viele Leute kein PHP-Manual lesen können, war mir schon vorher bekannt ;-)


Das hat auch damit nichts zu tun.

Wenn in einer Multiuser-Umgebung das Uploadverzeichnis (und/oder das Zielverzeichnis) nicht die gleiche UserID wie das Script besitzt, funktioniert auch move_uploaded_file nicht. Diese Funktion ist genauso dem safe mode unterlegen wie alle anderen I/O Funktionen a la copy etc. auch - muss auch, sonst könnte man so den safe mode aushebeln.

Ob das HIER die Ursache war/ist, kann ich mangels Kenntnis über den Server nicht sagen. Jedenfalls hat es immer wieder Provider mit falsch konfiguriertem Webspace gegeben, weswegen dieses Upload Problem schon uralt ist.
Nobbie
 
Posts: 13170
Joined: 09. March 2008 13:04

Next

Return to PHP

Who is online

Users browsing this forum: No registered users and 7 guests