[PHP] Eine Datei nach dem Upload umbennen

sergey

Stammgast
[PHP] Eine Datei nach dem Upload umbennen und ausgeben

Hey @ all,
hab ein verzwicktes Problem.
Ich sollte einen Datei-Upload realisieren, ansich kein Problem, die File Typen sind bekannt, etc.

Jetzt lade ich aber alles in nur ein Verzeichnis, da kann es zu kollisionen zwischen denn Dateien kommen, deshalb möchte ich diese umbennen lassen.

Im Grundlegenden geht es um folgendes:

Bild Upload:
- Der User kann ein Bild angeben, das er gerne in seinem Profil angzeigt haben möchte. Dieses wird danach auf den Server geladen. (Möchte eigentlich das umbennen noch vor dem Upload machen, nur kann ich nicht einfach einen Dateinamen angeben, die Endung muss ja auch noch ran.)

Wie kann ich dies:
- Entweder vor dem Upload (dynamisch)
- oder nach dem Upload (statisch)

erledigen?

Gruss

sergey
 
Zuletzt bearbeitet:

Dragonlord

PCtipp-Moderation
Teammitglied
Nachher

Die Datei umbenennen kannst Du nur nach dem Upload. Auf dem Rechner des Benutzers hast Du keine Rechte die Datei umzubenennen. Es gibt im PHP Funktnionen, damit Du verhindern kannst, dass bestehende Dateien mit gleichem Namen überschrieben werden.

Der Einfachheit halber, könntest Du ja bei jedem Bild das ein Benutzer hochladen will eine Zufallszahl hinzufügen.

lg Roger
 

sergey

Stammgast
Eigentlich möchte ich das Bild nach dem Name des Users benenen.
Wie kann ich die Endung übernehmen, aber den Namen ändern?

Gruss

sergey
 

FloHoCH

Stammgast
Bleibt die Dateiendung nicht sowieso bestehen? Hast dus getestet?

Sonst musst du halt den Temp-Name auslesen (von rechts nach links) und den Teil bis zum ersten Punkt (Dateiendung) zwischenspeichern. Oder du konvertierst alle Bilder in ein einheitliches Format (JPG oder PNG).

Noch ein Tipp: Schütze dein Zielverzeichnis mit htaccess (PHP deaktivieren) oder überprüfe direkt im Script, ob das Upload-File auch tatsächlich ein Bild ist, damit dir keiner Scripts in dein Webspace laden und ausführen kann!
 

sergey

Stammgast
Hhhhmm weiss nicht, habs noch nicht versucht...
Werd heute auch kaum dazu kommen, hab einen eingebundenen Finger... :(

Der Upload ist gleich doppelt gesichert:
1. Login aller User (nur berechtigte)
2. Der Upload wird immer überprüft (Whitelisting)

Gruss

sergey
 

FloHoCH

Stammgast
Der Upload ist gleich doppelt gesichert:
1. Login aller User (nur berechtigte)
2. Der Upload wird immer überprüft (Whitelisting)

Sehr gut, ansonsten gibt es eine Funktion, mit welcher du überprüfen kannst, ob es sich tatsächlich um ein Bild handelt (also auch nicht um ein Script mit der Dateiendung eines Bilds). Wenn du willst suche ich dir die Funktion gerne aus meinen Scripts (weis nicht mehr auswendig, wie die hiess).
 

sergey

Stammgast
Wär vielleicht auch nicht schlecht, jede weitere absicherung sagt mir tendenziel mehr zu als ab... :D

Gruss

sergey
 

FloHoCH

Stammgast
Also ich hab das damals so gemacht:

Code:
       $tmp_name = $_FILES["BILD"]["tmp_name"];
       $size = getimagesize ($tmp_name); //Mit dieser Funktion wird gleichzeitig geprüft, ob es ein Bild ist!
       if ($size != "") //Wenn keine Bilddatei, dann kein Rückgabewert
       {
		$max_filesize = 1048576; // maximal erlaube Dateigroesse in Bytes (1 MB)
		if ($_FILES['BILD']['size'] > $max_filesize) {
    		       echo "Datei ist zu gross - Abbruch!";
	        }
	        else
                {
	              $name = $_FILES["BILD"]["name"];
     ...

       else
      {
        	print ' Sie haben ein ungültiges Bildformat angegeben! Upload fehlgeschlagen. ';
        	exit;
       }

Sprich die gesuchte Funktion: getimagesize();
 

sergey

Stammgast
Okay, werd das dann mal noch so versuchen.

Aber eben, momentan ein bisschen lädiert, ist nicht so einfach mit schreiben... :(

Gruss

sergey
 

FloHoCH

Stammgast
Aber eben, momentan ein bisschen lädiert, ist nicht so einfach mit schreiben... :(

Es stresst dich ja niemand hier :)

Ich bin dafür beim Sehen eingeschränkt (kaputte Brille) ;) Ist auch nicht viel angenehmer, als die Sache mit dem Finger ... Werde wohl das schöne Wetter ausnutzen!
 

sergey

Stammgast
Jetzt funkionierts... :D

Hab es folgendermassen gelöst:

(Auszug aus meinem Code)

PHP:
//Die Datei ins gewünschte Verzeichnis verschieben
        if (is_uploaded_file($_FILES['filename']['tmp_name'])) {
            if (!move_uploaded_file($_FILES['filename']['tmp_name'], $upfile)) {
                echo "Problem: Konnte die Datei nicht in das Zielverzeichnis verschieben.<br>";
                echo "<a href='javascript:history.back()'>zurück</a>\n";
                errorlog($_SESSION['user'], $pg, $_SERVER['REMOTE_ADDR'], 'Konnte Datei nicht ins Zielverzeichnis verschieben.');
                exit;
            } else {
                $rename = rename($dir.$_FILES['filename']['name'], $dir.$_SESSION['user'].".jpg");
                if (!$rename) {
                    echo "Konnte das File nicht umbenennen.<br>\n";
                } else {
                    echo "File erfolgreich umbenannt.<br>\n";
                }
            }

So klappt es...

Hab aber bereits ein neues Problem, und zwar möchte jetzt gerne die Bilder aus dem Ordner auslesen, danach überprüfen, ob der User ein Bild eingestellt hat oder nicht.

Wie kann ich dies realisieren?

Gruss

sergey
 

FloHoCH

Stammgast
Ich habe auf meiner Seite ein Schript, mit welchem du die Files in einem Verzeichnis ausgeben kannst: http://floho.ch/download.php?view.3 Das kannst du bestimmt so abändern, dass du es brauchen kannst (einfach den Teil raus kopieren, der dir ein Array mit den Filenamen erstellt)...

Eine andere Möglichkeit ist, dass du direkt in die Datenbank schreibst, dass der User ein Bild hat (mit Bildname oder einfach ein boolean). Dann musst du auch nix überprüfen, was wiederum deine Applikation nicht unnötig verlangsamt!
 

sergey

Stammgast
Eine andere Möglichkeit ist, dass du direkt in die Datenbank schreibst, dass der User ein Bild hat (mit Bildname oder einfach ein boolean). Dann musst du auch nix überprüfen, was wiederum deine Applikation nicht unnötig verlangsamt!

Hhhmmm, hab ich mir eben auch schon überlegt, werd da mal ein wenig rumproben, bin momentan leider nicht mehr ganz auf der Höhe. (Wie stark Frauen einen ablenken können... :o)

Gruss

sergey
 

FloHoCH

Stammgast
Hhhmmm, hab ich mir eben auch schon überlegt, werd da mal ein wenig rumproben, bin momentan leider nicht mehr ganz auf der Höhe. (Wie stark Frauen einen ablenken können... :o)

Den Kommentar zu den Frauen wage ich mir zu verkneifen :)

Wenn du weitere Fragen hast, dann frag einfach ;)
 

FloHoCH

Stammgast
Wenn ihr ein Bild freigebt zum Upload, wie gross macht ihr dies maximal?

Du meinst wohl, wo du die Grenze setzen sollst für den Upload?

Jedenfalls höher als bei PCTipp :)

Spass bei Seite ... Kommt halt immer drauf an, was für ein Bild es ist und wo es in der Seite gezeigt wird. Sollte halt Verhältnismässig sein. Oberstgrenze ist sicher bei 1 MB.
 

FloHoCH

Stammgast
Nee, ich meinte schon die Bildgrösse, also das Format Höhe mal Breite. :D

OK, aber auch hier gilt, was du damit machst bzw. wofür du es brauchst.
Machst du das Bild kleiner als es hochgeladen wurde oder lässt du es nur kleiner anzeigen oder soll es in originalgrösse ersichtlich sein? Wenn du ein Bild kleiner anzeigen lässt, als es ist hast du unnötig Ladezeiten und oft ist die Qualität auch nicht erfreulich.

Für ein Profil-Bild würd ich sagen 400x600
 
Oben