Image Uploaden und umbennen

kapisa

Grünschnabel
Hallo Freunde

Als Anfänger habe ich mich zuerst mit flatfile beschäftig und hänge jetzt fest.
Ich habe ein Script geschrieben womit ich die Bilder uploaden kann.

Das Problem ist, wenn jemand ein Bild mit der Name (bild.jpg, pic.jpg usw) hochlädt, wird natürlich ein vorhandenes Bild ersetzt.

Hier mein Script:

<form enctype="multipart/form-data" action="upload.php" method="post">
<input name="file" type="file"><br>
<input type="submit" value="hochladen">
</form>

<?php
$tempname = $_FILES['file']['tmp_name'];
$name = $_FILES['file']['name'];
$type = $_FILES['file']['type'];
$size = $_FILES['file']['size'];

if($type != "image/gif" && $type != "image/pjpeg") {
$err[] = "nur gif und jpeg Dateien dürfen hochgeladen werden.";
}
if($size > "35000") {
$err[] = "Die Datei welche du hochladen willst, ist zu gross!<br>Maximale Dateigrosse beträgt 35 KB!";
}

If(empty($err)) {
copy("$tempname", "1/$name");
echo "Die Datei $name wurde erfolgreich hochgeladen!";
}
else {
foreach($err as $error)
echo "$error<br>";
}
?>

Ich möchta dass das Bild x.jpg beim uploaden den Name xy.jpg/gif erhält
xy.jpg = Name der User oder userid

Bitte ohne Mysql
 

Zatic

Erfahrenes Mitglied
Schau dir mal http://de3.php.net/move-uploaded-file an, das solltest anstatt copy benutzen.

Wenn du nicht willst, das etwas ueberschrieben wird, kannst du ja vorher pruefen, ob eine solche datei schon existiert und dann die neue umbenennen.
Das kannst du in einer schleife machen:

PHP:
$c = 0;
do {
    $suffix = strrchr($name, '.');
    $fname = strrpos($name, '_') === false ? strrpos($name, '.') : strrpos($name, '_');

    $c = settype($c, 'string');

    while (strlen($c) < 5) {
        $c = '0'.$c;
    }
    $name = $fname.'_'.$c.$suffix;

    $c = settype($c, 'integer');
    $c++;

} while (file_exists($user_id.$name))
$filename = $user_id.$name;


Hab das jetzt selber nicht getestet, aber es muesste eigentlich so gehen. Es nennt eben die datei solange um, bis keine gleichen namens mehr vorhanden ist.
Danach haettst du zB solche dateinamen:
23meinbild_00000.jpg
23meinbild_00001.jpg
23meinbild_00002.jpg
....etc

wobei 23 die ID des Users waere ($user_id oben)

Achja: So wie du das gemacht hast kann man JPGs nur mit der Internet Explorer hochladen, denn der macht aus image/jpeg -> image/pjpeg. Du musst aber auf beides pruefen, wenn auch andere Browser das verwenden koennen sollen.
Achja, es setzt voraus, dass der User eine Datei mit dateinamen erweiterung hochlaed, darauf solltest du noch pruefen. Wenn einfach nur 'meinbild' oder so hochgeladen wird, geht das nicht.
Hoffe das war was du gebraucht hast,

Gruesze,

Manuel
 
Zuletzt bearbeitet:

FireFlow

Erfahrenes Mitglied
Nun ich trage nacher den Dateinamen in meinem Fall in eine MySQL ein, deshalb ist so eine Zählung eigentlich überflüssig!
Ich gestalte also den Dateinamen so:

PHP:
$zeit = time();
$dateiname = $zeit . "_" . $userid . ".img";

Zu dem ".img": Ich verarebite nacher das Bild wieder per PHP und deshalb ist ja die Endung egal.
Ich habe auch die Zeit vorne, da das bei mir mehr sinn gibt die Dateien nach Datum als nach Benutzer zu ordnen.
 

ludz

Erfahrenes Mitglied
[...] funtzende [...]
*kopfschüttel* :rolleyes:

Eine andere Möglichkeit, um das Überschreiben bestehender Bilder zu vermeiden wäre die Benennung der Datei mit einer (fast) einzigartigen ID in Kombination mit Timestamp und Mikrosekunden.
 

kapisa

Grünschnabel
Danke an Alle !

Leider klappt es nict

http://www.tutorials.de/tutorials154463.html

Dort wird über upload-funktion gesprochen aber bei mir funktioniert ja das uploade der Daten.

vielleicht bin ich zu blöd dafür aber habe ja Weekend und würde mich über paar andere Möglichkeiten freuen.
 

Mairhofer

Erfahrenes Mitglied
Ich bin wieder in den "Alter Krass" Stil verfallen, war gestern mal wieder unter Leuten und das färbt direkt negativ ab, sorry Ludz ;)

Ich hatte gedacht, das Problem liegt auch noch im Upload, da dir geraten wurde auf move_uploaded_ umzusteigen.

Dann mal zum eigentlichen Problem, wobei ich mich frage ob es wirklich ein Problem ist oder nur eine theorethische Diskussion.

Wenn sich der Dateiname aus timestamp und Benutzer ID zusammensetzt, ist das Problem doch schon so gut wie gelöst.
Je nach zusammenhang, ist erstmal die Frage ob ein Benutzer die Möglichkeit hat in einer Sekunde mehrere Bilder hochzuladen oder eine Benutzer ID für mehrere Personen gilt, die gleichzeitig hochladen könnten.

Wenn es mehrere Personen von mehreren Rechnern sind, dann muss man wirklich in den microsekunden bereich gehen.
Kann ein Benutzer mehrere Bilder mit einem Formular hochladen, setzte in der Verarbeitung des Forms an.
Zum Beispiel: Der User hat die Möglichkeit in einem Formular 3 Bilder hochzuladen.
Bei der Auswertung des Formulars in PHP wird geprüft, wieviel Bilder der User hochladen will. Bei einem Bild ist das kein Problem, dann wird einfach time()+ID.img als Name genommen. Sind es zwei oder mehrere Bilder wird die Datei umbenannt in (time() + $i) +ID. Wobei sich $i bei jedem weiteren Uploadfeld erhöht um 1.
Sprich bei 3 Feldern:
1.: Dateiname: time() + ID
2.: Dateiname: (time() +1 ) + ID
3.: Dateiname: (time() +2 ) + ID
usw...


MfG
Andreas

// Edit: merke gerad das war mein Gold Posting: 100 Stückes :D