php, img upload, checken ob datei überschreiben?

mores

Aktives Mitglied
Thread Starter
Dabei seit
23.12.2003
Beiträge
3.580
Reaktionspunkte
107
also ich steh hier grad voll an.

ich bau grad ein cms, mit bilder-upload, funktioniert einwandfrei, nur würde ich gerne eine möglichkeit einbauen, beim bilder-upload den dateinamen zu überprüfen und gegebenenfalls zu ändern (datei_1.jpg, wenn datei.jpg existiert)

hier ist mein code:
PHP:
if(isset($_POST['F_OK'])){
	$db = mysql_connect("localhost", "username", "password");
	mysql_select_db("datenbankname",$db);

	$sql = "INSERT INTO `projekte` (`id`, `projektname`, `description`, `kunde`, `auftraggeber`, `kategorie`, `pic`, `link`, `target`, `width`, `height`) 
								VALUES ('', '$projektname', '$description', '$kunde', '$auftraggeber', '$kategorie', '$pic', '$link', '$target', '$width', '$height');";
	mysql_query($sql);
	
	chdir("../img_projekte/");

	// das normale pic verschieben.
	move_uploaded_file($_FILES['pic']['tmp_name'],$_FILES['pic']['name']);
	
	echo("neues projekt hinzugefügt!<br>");

ich habe natürlich aus php.net oder so ein paar anleitungen gelesen, die bei mir aber irgendwie nicht hinhauen und genau nix tun.

könnt ihr mir helfen?
 
Ungetestet aber sollte funken ... alle datein mit ner schleife in ein array einlesen ... array vergleichen mit dem neuen filename ... filenname unbennenn wenn gleich ...

lG dein arbeitnehmer

PHP:
<?php

if(isset($_POST['F_OK'])){ 
    $db = mysql_connect("localhost", "username", "password"); 
    mysql_select_db("datenbankname",$db); 

    $sql = "INSERT INTO `projekte` (`id`, `projektname`, `description`, `kunde`, `auftraggeber`, `kategorie`, `pic`, `link`, `target`, `width`, `height`)  
                                VALUES ('', '$projektname', '$description', '$kunde', '$auftraggeber', '$kategorie', '$pic', '$link', '$target', '$width', '$height');"; 
    mysql_query($sql); 
     
	 
	
	
	$vorhandenedatein = array();
	
	$ordner = "../img_projekte/"; 
	$action=opendir($ordner); 
	
	while($datei=readdir($action)){ 
		if(!preg_match("!(\.|\..)$!", $datei)){ 
			array_push($vorhandenedatein, $datei);
		}
	}
		
	
	
	
	 
	if($_FILES['pic']['name'] == $vorhandenedatein){
	
	
	chdir("../img_projekte/"); 

    // das normale pic verschieben. 
    move_uploaded_file($_FILES['pic']['tmp_name'],strlen($_FILES['pic']['name']) - 4)."_2.jpg"); 
     
    echo("neues projekt hinzugefügt!<br>");  
	}
	else{
	  chdir("../img_projekte/"); 

    // das normale pic verschieben. 
    move_uploaded_file($_FILES['pic']['tmp_name'],$_FILES['pic']['name']); 
     
    echo("neues projekt hinzugefügt!<br>");  
	}
  
	
	
	?>
 
werd ich gleich mal testen, vielen dank!

mensch, ich glaub ich sollte mir die arrays mal ansehen. scheinen ganz nützlich zu sein. irgendwie check ich sie nicht.
 
PHP:
if(isset($_POST['F_OK'])){ 
    $db = mysql_connect("localhost", "username", "password"); 
    mysql_select_db("datenbankname",$db); 

    $sql = "INSERT INTO `projekte` (`id`, `projektname`, `description`, `kunde`, `auftraggeber`, `kategorie`, `pic`, `link`, `target`, `width`, `height`)  
                                VALUES ('', '$projektname', '$description', '$kunde', '$auftraggeber', '$kategorie', '$pic', '$link', '$target', '$width', '$height');"; 
    mysql_query($sql); 
     
	 
	
	
	$vorhandenedatein = array();
	
	$ordner = "../img_projekte/"; 
	$action=opendir($ordner); 
	
	while($datei=readdir($action)){ 
		if(!preg_match("!(\.|\..)$!", $datei)){ 
			array_push($vorhandenedatein, $datei);
		}
	}
	
	
	
	
	
	
	$pruefen = true;
	 for($i=0; $i<100; $i++) {
		  
		  
					if($_FILES['pic']['name'] == $vorhandenedatein[$i] && $pruefen == true){
							chdir("../img_projekte/"); 
							// das normale pic verschieben. 
							move_uploaded_file($_FILES['pic']['tmp_name'],strlen($_FILES['pic']['name']) - 4)."_2.jpg"); 
							echo("neues projekt hinzugefügt!<br>");
							$pruefen = false;  
			
				
			
			}
			
	if($pruefen == false){
							 chdir("../img_projekte/"); 
						
							// das normale pic verschieben. 
							move_uploaded_file($_FILES['pic']['tmp_name'],$_FILES['pic']['name']); 
							 
							echo("neues projekt hinzugefügt!<br>");  
					}

jetzt sollte es gehen ... hab ich dir aber eh schon mal per email geschrieben lG
 
Da Du den tatsächlichen Dateinamen ja in der DB ablegst, geht es auch über die DB (ist u.U. auch schneller):
PHP:
function DateinameBereitsVergeben($filename)
{
	global $db;
	
	if ($filename == '')
	{
		return false;
	}
	
	$sql = "SELECT id FROM projekte WHERE pic = '" . str_replace("'", "''", basename($filename)) . "' LIMIT 1";
	if (!($result= @mysql_query($sql, $db)))
	{
		die ('Lesen aus File-Tabelle');
	}

	return (mysql_fetch_array($result)) ? true : false;
}

Dann das Ganze in einer Schleife aufrufen, bis man eine Kombination aus ehem. Dateiname und einer 3-stelligen Zufallszahl gefunden hat. Fertig. Den Dateinamen musst Du vorher aufspalten in name und erweiterung.

PHP:
do
{
	$attach_filename = $filename . '_' . substr(rand(), 0, 3) . '.' . $file_extension;
}
while (DateinameBereitsVergeben($attach_filename));

Alles so mal eben zusammenkopiert und aus dem Kopf. Ungetestet. Bei mir schauen die DB-Anweisungen anders aus, weil ich dafür eine eigene Klasse gebastelt habe, die mir viel Arbeit abnimmt. Ich hoffe, das ist so richtig zusammengebastelt.
 
--- gelöscht, weil mittlerweile änderungen und PLAN B gepostet wurden :) ---
 
Zuletzt bearbeitet:
danke für den hinweis =)

die methode mitd er datenbank geht auch aber wenne s für einen kunden ist und er vl via ftp oder sonst ein anderer was raufladet hast du schon ein problem
 
@PBgrafik: nö, geht leider noch immer nicht.
response nach dem eintragen ist ein lange liste von "projekt wurde hinzugefügt", aber weder in der DB noch im zielordner steht das neue bild.

:(

nachdem "der kunde" nicht per FTP hochladen soll ist die db-version okay, ich werd die mal durchgehen.

danke auch für deinen tipp, manjo.
du stellst mich zwar vor relativ grosse hürden mit deinen voraussetzungen (ich muss dateinamen aufsplitten, und in schleife laufen lassen), aber ich check das mal aus.

PBgrafik ... ich find da keine mail mit dem code.
hab ich möglicherweise verschlampt oder IRGENDWO archiviert. sorry.
 
Zuletzt bearbeitet:
thats the new one
PHP:
	    $vorhandenedatein = array(); 
     
    $ordner = "../img_projekte/";  
    $action=opendir($ordner);  
     
    while($datei=readdir($action)){  
        if(!preg_match("!(\.|\..)$!", $datei)){  
            array_push($vorhandenedatein, $datei); 
        } 
    } 
	$pruefen = 1; 
	for($i=0; $i<100; $i++) { 
	
	
	
	
	//####################
		if($_FILES['pic']['name'] == $vorhandenedatein[$i] && $pruefen == 1){ 
			chdir("../img_projekte/");  
		// das normale pic verschieben.  
			$filenamelengh = strlen(($_FILES['pic']['name'])) - 4;
			$newfilename = substr($_FILES['pic']['name'], 0, $filenamelengh)."_2.jpg";
			for($i=0; $i<200; $i++) { 
			if($newfilename == $vorhandenedatein[$i]){
			$filenamelengh = strlen(($_FILES['pic']['name'])) - 4;
			$newfilename = substr($_FILES['pic']['name'], 0, $filenamelengh)."_3.jpg";
			}
			if($newfilename == $vorhandenedatein[$i]){
			$filenamelengh = strlen(($_FILES['pic']['name'])) - 4;
			$newfilename = substr($_FILES['pic']['name'], 0, $filenamelengh)."_4.jpg";
			}
	
			
			}
			
			move_uploaded_file($_FILES['pic']['tmp_name'],$newfilename);  
			echo("neues projekt hinzugefügt und dateinamen geändert!<br>"); 
			$pruefen = 2;   

		} 
	//####################

	  
	}	if($pruefen == 1){
		$pruefen = 3;
	}
		if($pruefen == 3){ 
			 chdir("../img_projekte/");  
			// das normale pic verschieben.  
			move_uploaded_file($_FILES['pic']['tmp_name'],$_FILES['pic']['name']);  
			  
			echo("neues projekt hinzugefügt!<br>");   
		}
}

habe leider keine bessere methode um das mehrmalige prüfen zu umgehen
 
Na sooo schwer ist das auch nicht:
PHP:
$file_extension = GetExtension($file_name);
	
if ( preg_match("/[\\/:*?\"<>|]/i", $file_name) )
{
	die('Ung&uum;lltige Zeichen im Dateinamen!');
}

$attach_filename = strtolower($file_name);
$attach_filename = str_replace(' ', '_', $attach_filename);
$attach_filename = rawurlencode($attach_filename);
$attach_filename = preg_replace("/%(\w{2})/", "_", $attach_filename);
$attach_filename = DeleteExtension($attach_filename);
$new_filename = $attach_filename;
	
do
{
	$attach_filename = $new_filename . '_' . substr(rand(), 0, 3) . '.' . $file_extension;
}
while (DateinameBereitsVergeben($attach_filename));
Ich hab noch ein bisschen Prüfung dabei, damit keine wilden Zeichen im Dateinamen vorkommen, dann werden z.B. leerzeichen durch Unterstrich ersetzt usw. Solltest Du auch tun, damit Du keinen Salat in dem Verzeichnis bekommst. Schon mal eine Datei in der Shell gelöscht, die Whitespaces und zig Sonderzeichen enthält?

Dazu noch die Fkts:
PHP:
function GetExtension($filename)
{
	$extension = strrchr(strtolower($filename), '.');
	$extension[0] = ' ';
	$extension = strtolower(trim($extension));
	if (is_array($extension))
	{
		return '';
	}
	else
	{
		return $extension;
	}
}
function DeleteExtension($filename)
{
        return substr($filename, 0, strrpos(strtolower(trim($filename)), '.'));
}
Es sollte auch immer so sein, dass in dem Verzeichnis, wo per php Dateien hochgeladen werden, nur diese eine Routine Zugriff hat, sonst entsteht doch auch ein wüstes Chaos, welche Datei nun von wo kommt und wer weiss wohin gehört.

Ich dachte, wenn Du eine Art cms baust, kennst Du Dich mit php gut aus und brauchtest nur einen Anstoss?
 
Manjo schrieb:
Ich dachte, wenn Du eine Art cms baust, kennst Du Dich mit php gut aus und brauchtest nur einen Anstoss?
:) ja, kenn mich schon aus.
mit den rudimentären sachen eben, wie in-die-DB-schreiben, und aus-der-DB-lesen.
ich hab's jetzt auch schon eine längere zeit nicht betrieben, daher auch noch eingerostet, und überhaupt hab ich das ganze früher mit ASP gemacht, was wieder ziemlich anders ist.

DAU-sicherheitseinstellungen (sonderzeichen, überschreiben, usw.), damit hab ich mich nie wirklich beschäftigt, da ich die ersten paar CMSe für mich selbst machte, oder für kunden die ich betreute, die eigentlich gar nicht wussten dass sie ein CMS hatten. war mir immer zu mühsam, hab ich daher nicht wirklich "gelernt" und, wie du siehst, tu ich mir schwer damit. :) :)

naja. soviel zu mir :)

danke für deine ausformulierung. werde das mal studieren und meinen php-level erhöhen.

danke auch an powerbookgrafik für die file-basierte lösung.

ist ja toll wie schnell das hier geht!
 
Hallo PBG,

wo kommt die '100' her in for($i=0; $i<100; $i++) {? Wie wäre es mit for($i=0; $i<count($vorhandenedatein); $i++) {?

Gruß
Manjo
 
Zurück
Oben Unten