Rechte @ Pictureupload

aKraus

Erfahrenes Mitglied
Hallo,
Ich hab meinen Rootserver (Suse) mit Visas formatiert und Confixx installiert. Nun habe ich neben ein paar Problemen mit Birnen (Pear) auch ein Problem mit dem Upload von Bildern. Hierfür habe ich eine kleine Klasse geschrieben, welche sehr den Aufbau von C# ähnelt (vom Prinzip her - war es leid, dauerhaft für so Kleinigkeiten wie Änderungen an Textboxen & Co sämtlichen Code durchzugehen). Wer mich bereits ein bisschen im Forum beobachtet hat, wird evtl. gemerkt haben, dass ich nur sehr ungern von mir verfassten Quellcode präsentiere. Darausfolgend handelt es sich um wirkliche Verzweiflung :).

classPictures: (bitte keinen Kommentar zur deutschen Fehlerausgabe. Normalerweise ist es MLS fähig...)
PHP:
<?
	class classPictures
	{
		var $PicPath;
		var $PicDirec;
		var $PicWidth;
		var $PicHeight;
		var $PicSize;
		var $PicExtension;
		var $TextBoxName;
 
		function classPictures($cTextBoxName = "", $cPicPath = "", $cPicDirec = "", $cPicWidth = 0, $cPicHeight = 0, $cPicSize = 0, $cPicExtension = ""){
			$this->PicPath	 = $cPicPath;
			$this->PicDirec	 = $cPicDirec; 
			$this->PicWidth	 = $cPicWidth;
			$this->PicHeight	= $cPicHeight;
			$this->PicSize	 = $cPicSize;
			$this->PicExtension = $cPicExtension; 
			$this->TextBoxName = $cTextBoxName;
		}
 
		function Show(){		
			if($this->TextBoxName != "") {
				echo "<input type=\"file\" name=\"".$this->TextBoxName."\">";
				return true;
			} else {
				echo "Kein Name für die Textbox gesetzt";
				return false;
			}
		}
 
		function Upload() {
			$typ	 = $_FILES[$this->TextBoxName]['type'];
			$size	= $_FILES[$this->TextBoxName]['size'];
			$name	= $_FILES[$this->TextBoxName]['name'];
			$tmpname = $_FILES[$this->TextBoxName]['tmp_name'];
 
			$imgsize = getimagesize($tmpname);
 
			if($imgsize[0] == $this->PicWidth && $imgsize[1] == $this->PicHeight) {
				if(eregi($this->PicExtension, $typ)) { 
					if($size < $this->PicSize){
						if($this->CreateDirectory()){
							if($this->Delete()){		
								/*if(@copy($tmpname, $this->PicPath)){
									return "Bild wurde hochgeladen.";
								} else {
									return "Bild nicht hochgeladen.";
								}*/
								echo $tmpname.'<br>';
								echo copy($tmpname, $this->PicPath);
							} else {
								return "Altes Bild konnte nicht gelöscht werden";
							}
						} else {
							return "Ordner konnte nicht angelegt werden!";
						}
					} else {
						return "Die Datei ".$name." ist ".($size - $this->PicSize)." KB zu groß!";
					}
				} else {
					return "Falsches Dateiformat...<br>Nur .gif und .jpeg";
				} 
			} else {
				return "Größe ungültig. ".$this->PicWidth."x".$this->PicHeight." (Breite x Höhe)";
			}
		}
		function Delete(){
			if(file_exists($bildpath)) { 
				if(!@unlink($bildpath)) {
					return false;
				}
			}
			return true;
		}
 
		function CreateDirectory() {
			if(!file_exists($this->PicDirec)) {
				if(!mkdir($this->PicDirec, 0777)) {
					return false;
				}
			} 
			return true;
		}
 
	}
?>


Hier der Code des Aufrufes (in kurzform zusammengefasst):
PHP:
 	include_once "_class/classPictures.php";
	$pic_path = "_pictures/user/".$user_id."/profil_small.jpg";
	$pic_direc = "_pictures/user/".$user_id."/";
	$pic_width = 100;
	$pic_size = 819200;
	$pic_height = 133;
	$pic_ext	= "(jpg|jpeg)$";
	$textbox	= "upload_file";
 
	if($_POST["add"]){
		$pic = new classPictures($textbox, $pic_path, $pic_direc, $pic_width, $pic_height, $pic_size, $pic_ext);
		echo $pic->Upload();
	} else { ?>
		<form name="form1" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>" enctype="multipart/form-data">
		 <?php
		$pic = new classPictures($textbox);
		$pic->Show();
		 ?>
		 <br><input type="submit" name="add" value="Abschicken">
		</form>
	<?php
	}

Und jetzt zur Stelle mit dem Fehler:
PHP:
/*if(@copy($tmpname, $this->PicPath)){
	return "Bild wurde hochgeladen.";
} else {
	return "Bild nicht hochgeladen.";
}*/
echo $tmpname.'<br>';
echo copy($tmpname, $this->PicPath);
Ich habe bereits das Errorhandling auskommentiert und mir die "wirklichen" Fehler ausgeben lassen. Allerdings scheint es irgendein Rechteproblem auf dem Root zu sein. Er will irgendwie das Bild mit einem anderen Benutzer verschieben als er dieses hochgeladen hat! Evtl. weiss jemand, woran es liegen kann bzw. wie man den Fehler beseitigt... Auch würden mir euere Meinungen zu meinem Ansatz mit den Klassen für so kleinigkeiten wie das Bilderhochladen gefallen.

Ausgabe des Fehlers:
/srv/www/htdocs/web0/phptmp/phpPYqf9r

Warning: copy(): SAFE MODE Restriction in effect. The script whose uid is 636 is not allowed to access /srv/www/htdocs/web0/html/www/_pictures/user/1 owned by uid 30 in /srv/www/htdocs/web0/html/www/_class/classPictures.php on line 80

Warning: copy(_pictures/user/1/profil_small.jpg): failed to open stream: No such file or directory in /srv/www/htdocs/web0/html/www/_class/classPictures.php on line 80
 
Zuletzt bearbeitet:
Hallo,

der Apache-User (meist `nobody`) und der PHP-User sind nicht dieselben.

Im Safemode ist es nicht möglich via PHP aufs Dateisystem zuzugreifen, wenn unterschiedliche Benutzer vorhanden sind.

Da du hast Zugriff auf den Server hast, ist es das einfachste herauszufinden, unter
welchem Benutzer Apache ausgeführt wird und dann den PHP in diesen Benutzer zu ändern
und dann httpd neu zu starten.

P.S.: Die Fehlermeldung hätte gereicht :-)
 
Hi,
da ich im Confixx "PHP Upload" aktiviert habe, sollte der Upload eigentlich möglich sein, oder?
Wie kann ich nachschauen, mir welchen Usern gearbeitet wird?
Ich stell da ungern die httpd datei um, da es eigentlich mit confixx gehen sollte...

So Long
 
Mit Confixx hab ich leider keine Erfahrung, ich weiß aber das "normaler" Weise unter Confixx Apache und PHP unter dem user `web12345` laufen.

Da aber bei dir nicht beides unter demselben User läuft, liegt vielleicht noch ein Konfigurationsfehler vor.
 
Nur so interesse halber:
was hältst du von der Programmierweise mit den Klassen, so wie ich es Testweise handhabe?
 
Da du ja eh mehrere Funktionen benötigst, sind Klassen der wahrscheinlich eleganteste Weg.
Ob sie tatsächlich funktionell benötigt werden mal dahingestellt,
ich verzichte meistens darauf.
 
Zurück