rename()-Funktion
DHK
- php
Hallo,
ich habe folgenden Sachverhalt: Der Benutzer kann in ein Eingabefeld einen neuen Namen für eine Datei eingeben. Dieser wird dann per POST-Verfahren an die Datei "rename_image.php" übergeben, die das Bild dann tatsächlich auch umbennen sollte. Leider funktioniert es nicht (ich bastel da jetzt schon 2 wochen dran rum). Hier mal das Skript, das ich zuletzt ausprobiert habe:
--------------------------------
<?php
$rights = getRights();
if(!in_array("Galerie", $rights)) {
no_rights();
} else {
switch(@$_GET['gal']) {
case "g1_screenshots":
if (isset($_FILES['img'])) {
switch ($_FILES['img']['type']) {
case "image/pjpeg":
rename("/galerie/Screenshots/GothicI/".$_POST['Bild2']."", "/galerie/Screenshots/GothicI/".$_POST['neuername'].".jpg");
break;
case "image/jpeg":
rename("/galerie/Screenshots/GothicI/".$_POST['Bild2']."", "/galerie/Screenshots/GothicI/".$_POST['neuername'].".jpg");
break;
case "image/png":
rename("/galerie/Screenshots/GothicI/".$_POST['Bild2']."", "/galerie/Screenshots/GothicI/".$_POST['neuername'].".png");
break;
case "image/gif":
rename("/galerie/Screenshots/GothicI/".$_POST['Bild2']."", "/galerie/Screenshots/GothicI/".$_POST['neuername'].".gif");
break;
} }
echo '<a href="index.php?section=admin&site=galerie&action=g1_screenshots&">Zurück</a>';
echo '<br />Das Bild '.$_POST['Bild2'].' wurde erfolgreich in '.$_POST['neuername'].' umbenannt.';
break;
case 'g2_screenshoots':
// hier kommt noch was hin
break;
case 'g2dndr_screenshoots':
// hier kommt noch was hin
break;
case "g1_comics":
// hier auch
break;
case 'g2_comics':
//hier auch
break;
case 'g2dndr_comics':
// da auch
break;
case "g1_karten":
// hier auch
break;
case 'g2_karten':
// hier auch^^
break;
case 'g2dndr_karten':
// und da auch noch
break;
default:
echo "<p>\n";
echo " Bitte benutzen sie nur einen Link aus dem Adminmenu.\n";
echo " <a href="index.php?section=admin&".SID."">\n";
echo " Zurück zum Adminbereich\n";
echo " </a>\n";
echo "</p>\n";
break;
}
}
?>
---------------------------------
Weiß jemand Rat?
Gruß
DHK
Moin,
Weiß jemand Rat?
Hast du die Schreibrechte entsprechend gesetzt?
Grüße aus Hamburg
Michel
Hast du die Schreibrechte entsprechend gesetzt?
Ja (CHMOD 777).
Hallo,
ich bins nochmal. Sorry, die Problembeschreibung war wohl zu ungenau. Deshalb hier eine genaue Beschreibung:
Ich gebe in das Eingabefeld den neuen Namen für das Bild ein, in diesem Falle "Huhu". Die Seite "rename_image.php" wird per Klick auf den Submit-Button geladen und die Meldung (wie ich es ja auch will) "Das Bild >>Pipapo.JPG<< wurde in >>Huhu<< umbenannt" wird ausgegeben. (Natürlich füge ich innerhalb der rename()-Funktion ein .JPG, .PNG, oder .GIF an den neuen Namen an, je nach Dateityp). Wenn ich mir die Dateien im FTP-Programm jedoch ansehe, heißt die Datei immer noch "Pipapo.JPG" und nicht "Huhu.JPG". Das ist mein Problem (ich hoffe, es war ausführlich genug beschrieben). Fehlermeldung kommt keine, obwohl ich error_reporting auf E_ALL gestellt habe.
DHK
echo $begrüßung;
"Das Bild >>Pipapo.JPG<< wurde in >>Huhu<< umbenannt" wird ausgegeben. [...] Wenn ich mir die Dateien im FTP-Programm jedoch ansehe, heißt die Datei immer noch "Pipapo.JPG" und nicht "Huhu.JPG".
Viele Funktionen, so auch rename(), klären dich über den Erfolg oder Misserfolg ihrer Tätigkeit durch einen entsprechenden Rückgabeparameter auf. Was liefert dir rename() und wie reagiert den Script darauf? Möglicherweise gibt es außer dem Rückgabenwert noch eine Meldung, die aus irgendeinem Grunde bei dir nicht angezeigt wird. Wie ist error_reporting und display_errors eingestellt und kommt eine Meldung, wenn du error_reporting auf E_ALL und display_errors auf 1 stellst?
echo "$verabschiedung $name";
Viele Funktionen, so auch rename(), klären dich über den Erfolg oder Misserfolg ihrer Tätigkeit durch einen entsprechenden Rückgabeparameter auf. Was liefert dir rename() und wie reagiert den Script darauf?
Hallo,
rename() liefert überhaupt nix zurück (frag mich nicht warum). Hier mal, wie ich das überprüft habe (vielleicht ist ja da der Fehler):
--------------------------------------
if (rename("/galerie/Screenshots/GothicI/".$_POST['Bild2']."", "/galerie/Screenshots/GothicI/".$_POST['neuername'].".jpg")) {
echo "TRUE";
} else {
echo "FALSE";
}
break;
case "image/jpeg":
if (rename("/galerie/Screenshots/GothicI/".$_POST['Bild2']."", "/galerie/Screenshots/GothicI/".$_POST['neuername'].".jpg")) {
echo "TRUE";
} else {
echo "FALSE";
}
break;
case "image/png":
if (rename("/galerie/Screenshots/GothicI/".$_POST['Bild2']."", "/galerie/Screenshots/GothicI/".$_POST['neuername'].".png")) {
echo "TRUE";
} else {
echo "FALSE";
}
break;
case "image/gif":
if (rename("/galerie/Screenshots/GothicI/".$_POST['Bild2']."", "/galerie/Screenshots/GothicI/".$_POST['neuername'].".gif")) {
echo "TRUE";
} else {
echo "FALSE";
}
--------------------------------
Wie ist error_reporting und display_errors eingestellt und kommt eine Meldung, wenn du error_reporting auf E_ALL und display_errors auf 1 stellst?
error_reporting ist auf E_ALL gestellt und display_errors weiß ich nicht, wie ich das eingeben soll (es kam immer irgendeine Fehlermeldung, egal ob ich eingab "display_errors = 1", "display_errors(1)", "display_errors("1")" oder "display_errors = "1"".
DHK
echo $begrüßung;
Viele Funktionen, so auch rename(), klären dich über den Erfolg oder Misserfolg ihrer Tätigkeit durch einen entsprechenden Rückgabeparameter auf. Was liefert dir rename() und wie reagiert den Script darauf?
rename() liefert überhaupt nix zurück (frag mich nicht warum).
Oh doch, nur sieht man manche Werte nicht, wenn man sie nur mit einem einfachen echo ausgibt. Verwende zum Anzeigen var_dump(), dann siehst du auch solche Werte wie false oder null statt eines Leerstrings wie bei echo.
Hier mal, wie ich das überprüft habe (vielleicht ist ja da der Fehler):
if (rename("/galerie/Screenshots/GothicI/".$_POST['Bild2']."", "/galerie/Screenshots/GothicI/".$_POST['neuername'].".jpg")) {
echo "TRUE";
} else {
echo "FALSE";
}
Also irgendetwas muss dieser Code ausgeben. Es sei denn, er kommt gar nicht zur Ausführung, weil eine frühere Entscheidung zu seinen Ungunsten ausgefallen ist. Prüfe in den Fall die Ergebnisse der Entscheidungsausdrücke (am besten mit mit var_dump()).
Übrigens, das Anhängen von Leerstring an Strings bewirkt überhaupt nichts und kann deshalb weggelassen werden.
Wie ist error_reporting und display_errors eingestellt und kommt eine Meldung, wenn du error_reporting auf E_ALL und display_errors auf 1 stellst?
error_reporting ist auf E_ALL gestellt und display_errors weiß ich nicht,
phpinfo() beantwortet diese Frage.
wie ich das eingeben soll (es kam immer irgendeine Fehlermeldung, egal ob ich eingab "display_errors = 1", "display_errors(1)", "display_errors("1")" oder "display_errors = "1"".
Auf dem Entwirklungsrechner sollte man das in der Konfiguration von PHP oder der des Verzeichnisses konfigurieren. Siehe dazu die Dokumentation zur Konfiguration PHPs im PHP-Handbuch.
Für einige Konfigurationswerte gibt es eigene Funktionen zum Einstellen, wie beispielsweise error_reporting() für den Parameter error_reporting. Für alle anderen Parameter[*] gibt es ini_set().
[*] Zumindest für die, die sich im Script-Kontext verstellen lassen.
echo "$verabschiedung $name";
Hallo,
ich glaube, ich habe den Fehler gefunden.
Also irgendetwas muss dieser Code ausgeben. Es sei denn, er kommt gar nicht zur Ausführung, weil eine frühere Entscheidung zu seinen Ungunsten ausgefallen ist. Prüfe in den Fall die Ergebnisse der Entscheidungsausdrücke (am besten mit mit var_dump()).
Tatsächlich muss etwas zu seinen Ungunsten ausgefallen sein. Sieh dir mal folgende Zeilen an:
-----------------------------------------
if (isset($_FILES['img'])) {
switch ($_FILES['img']['type']) {
// usw. hier kommt dann das Skript
-----------------------------------------
Diese if- und switch-Prüfung hier habe ich aus einem Upload-Skript, in dem auch die Dateitypen überprüft wurden. Vermutlich kennt meine Datei die Variable $_FILES gar nicht und führt daher den if-Teil nicht aus.
Da wir jetzt den Fehler kennen, muss er noch behoben werden. Wie kann ich alternativ die Dateitypen überprüfen?
Gruß
DHK
echo $begrüßung;
Vermutlich kennt meine Datei die Variable $_FILES gar nicht und führt daher den if-Teil nicht aus.
Bitte nicht Rätselraten sondern nachprüfen! print_r() oder var_dump() eignen sich für die Anzeige von Inhalten komplexer Typen wie Arrays. Vorher noch ein <pre> erhöht die Übersichtlichkeit der Ausgabe.
Wie kann ich alternativ die Dateitypen überprüfen?
getimagesize() stellt dir auch die Typ-Information zur Verfügung.
echo "$verabschiedung $name";
Hallo,
es lag tatsächlich an diesem $_FILES. Ich hab es jetzt mit getimagesize() gemacht und schon taucht das nächste Problem auf:
Obwohl ich CHMOD 777 für die Datei index.php und rename_image.php eingestellt habe, kommt folgende Meldung beim Aufrufen des Skripts:
------------------------------------------
SecureSSI: Das Script (/usr/export/www/vhosts/funnetwork/hosting/derorden/index.php) hat versucht ausserhalb von ihrem Userverzeichniss auf die Datei /galerie/Screenshots/GothicI/Gothic2 2004-12-28 14-09-52-62.JPG zuzugreifen.
Dies ist nicht erlaubt!
Warning: rename() [function.rename]: Sicherheitsverletzung: in /usr/export/www/vhosts/funnetwork/hosting/derorden/inhalt/rename_image.php on line 15
-------------------------------------------
Weißt du, wie ich erreiche, dass diese Meldung nicht mehr kommt und das Ausführen der Funktion rename() verhindert?
Gruß
DHK
echo $begrüßung;
SecureSSI: Das Script (/usr/export/www/vhosts/funnetwork/hosting/derorden/index.php) hat versucht ausserhalb von ihrem Userverzeichniss auf die Datei /galerie/Screenshots/GothicI/Gothic2 2004-12-28 14-09-52-62.JPG zuzugreifen.
Dies ist nicht erlaubt!
Weißt du, wie ich erreiche, dass diese Meldung nicht mehr kommt und das Ausführen der Funktion rename() verhindert?
Die Meldung sagt doch alles wunderschön aus. Wenn du mal genau hinsiehst, erkennst du sicherlich, dass du nach /galerie/... schreiben wolltest. Dies ist eine absolute Pfadangabe und geht damit vom Wurzelverzeichnis aus. Relative Pfadangaben - also solche, die nicht mit einem / beginnen - gehen dagegen vom Verzeichnis des aufgerufenen Scripts aus. Korrigiere die Pfadangabe zu einem absoluten Pfad, in den du zu schreiben berechtigt bist oder in einen ebensolchen relativen Pfad.
echo "$verabschiedung $name";
Hast du die Schreibrechte entsprechend gesetzt?
Ja (CHMOD 777).
Hallo,
ich bins nochmal. Sorry, die Problembeschreibung war wohl zu ungenau. Deshalb hier eine genaue Beschreibung:
Ich gebe in das Eingabefeld den neuen Namen für das Bild ein, in diesem Falle "Huhu". Die Seite "rename_image.php" wird per Klick auf den Submit-Button geladen und die Meldung (wie ich es ja auch will) "Das Bild >>Pipapo.JPG<< wurde in >>Huhu<< umbenannt" wird ausgegeben. (Natürlich füge ich innerhalb der rename()-Funktion ein .JPG, .PNG, oder .GIF an den neuen Namen an, je nach Dateityp). Wenn ich mir die Dateien im FTP-Programm jedoch ansehe, heißt die Datei immer noch "Pipapo.JPG" und nicht "Huhu.JPG". Das ist mein Problem (ich hoffe, es war ausführlich genug beschrieben). Fehlermeldung kommt keine, obwohl ich error_reporting auf E_ALL gestellt habe.
DHK
hi,
Leider funktioniert es nicht (ich bastel da jetzt schon 2 wochen dran rum).
Wenn dir nach zwei Wochen Beschäftigung mit einem Thema immer noch keine aussagekräftigere Problembeschreibung als "funktioniert nicht" einfällt, können wir dir auch nicht weiterhelfen.
Bitte lies doch erst mal die Tipps für Fragende, und probiere es dann noch mal mit einer _nachvollziehbaren_ Problembeschreibung.
Dass du dein error_reporting beim Entwickeln in PHP auf E_ALL stellst, darf hoffentlich vorausgesetzt werden.
gruß,
wahsaga