Dateiupload mit Formular

Hallo!

Benutzer meiner Internetseite sollen ein Bild auf meinen Server laden können. Ich habe dies mit diesem recht einfachen Script gelöst, das ich im Internet gefunden habe:

PHP:
<form
  action=""
  method="post"
  enctype="multipart/form-data">
<input type="file" name="probe" />
<input type="submit" value="Los!" />
</form>
<hr />
<?php
  if (isset($_FILES['probe']) and ! $_FILES['probe']['error']) {
    // Alternativ:            and   $_FILES['probe']['size']
    move_uploaded_file($_FILES['probe']['tmp_name'], "./newfile.gif");
    printf("Die Datei %s steht jetzt als " .
          "newfile.txt zur Verfügung.<br />\n",
      $_FILES['probe']['name']);
    printf("Sie ist %u Bytes groß und vom Typ %s.<br />\n",
      $_FILES['probe']['size'], $_FILES['probe']['type']);
  }
 ?>

Dabei wird jedesmal eine Datei "newfile.gif" erstellt. Das Problem ist, dass beim nächsten Upload diese Datei logischerweise überschrieben wird. Ich müsste es aber so haben, dass automatisch ein neuer Dateiname generiert wird. Bspw. lädt Benutzer A ein Bild hoch, das dann Bild1.gif genannt wird, das Bild von Benutzer B würde dann Bild2.gif heißen usw. Müsste also immer fortlaufen.

Kann mir da jemand helfen?

Liebe Grüße
 
Ich würde statt einer fortlaufenden ID einfach das Bild mit einem Zeitstempel versehen ([phpf]time[/phpf] oder [phpf]microtime[/phpf]).

Dadurch wird zwar der Dateiname länger und schlechter zu merken, aber die Chancen auf doppelte Dateinamen bzw. Uploads zur gleichen Zeit werden minimiert.
 
Hallo,

schönes Script, aber ein paar nützliche Sachen fehlen noch. Zum einen würd ich nach Dateiformat selektieren (Bild / Text / usw.) und zweitens nach Dateigröße. Ich weiß ja nicht wie das Script bei dir läuft, aber momentan kann könnte jeder irgendwas auf deinen Server hochladen. Zum Beispiel nen php Script das man von Hand irgendwo included, da spielt auch die vergebene Endung keine Rolle. Desweiteren würd ich noch ein paar Daten zu den hochladenden speichern, IP par example.

achja:
"Die Datei %s steht jetzt als newfile.txt zur Verfügung.<br />\n"
sollte doch bestimmt:
"Die Datei %s steht jetzt als newfile.gif zur Verfügung.<br />\n"
heißen
 
Stimmt, da hatte ich auch schon dran gedacht. Könntest du mir da vielleicht helfen? Weiß nämlich nich so genau, wie ich das mit der Größe und dem Typ machen könnte.


Ich hab auch noch ein 2. Problem. Und zwar soll nach Hochladen der Datei über einen weiteren Button eine Email an mich verschickt werden, in der der Dateiname drin steht - damit ich dem Benutzer eine Datei zuordnen kann. Ist das denn jetzt über mein Zeit-Script überhaupt noch möglich? Weil diese Variable ja nicht direkt festgelegt ist ...
 
zum 1.
du hast die Variablen $_FILES['probe']['size'] und $_FILES['probe']['type'] schon verwendet, du brauchst sie nur vor move_uploaded_file prüfen, size nicht größer als so und soviel Bytes, type zum beispiel image/jpeg oder image/gif. erfüllt das File die bedingungen nicht, löschst es und führst kein move_uploaded_file durch. Alles Andere ist eh unnütz.
Zu2.
nach move_uploaded_file() machst einfach mail() und versendest so eine Mail an dich mit den Daten der Datei.
 
Okay danke, hab das mit dem Überprüfen hinbekommen.
Aber nochmal zur Mail - wie die verschickt wird ist mir klar, aber mein Problem liegt jetzt im Namen des jeweiligen Bildes.

Damit jedes Bild einen anderen Namen hat, wird ja ein Randomname generiert über microtime_float():

PHP:
function microtime_float()
		{
		list($usec, $sec) = explode(" ", microtime());
		return ((float)$usec + (float)$sec);
		}
		
		$time_start = microtime_float();
		
		// Sleep for a while
		usleep(100);
		
		$time_end = microtime_float();
		$time = $time_end - $time_start;

Der Name des hochgeladenen Bildes auf dem Server lautet dann also immer "$time.gif"
Aber diese Variable ist ja nicht kontant sondern ändert sich ständig - und wenn ich jetzt in der Email den Namen des vom Benutzer X hochgeladenen Bildes mitsenden will und diesen einfach als $time angebe, dann wird ja wieder ein neuer Zeitstempel generiert. Und so komme ich ja nie mehr auf den eigentlichen Namen ...
 
hi,
ich häts eh bissel anders gemacht, aber seis drum. Dann speicher $time noch in einer anderen Variable zwischen, etwa so:
PHP:
function microtime_float()
        {
        list($usec, $sec) = explode(" ", microtime());
        return ((float)$usec + (float)$sec);
        }
        
        $time_start = microtime_float();
        
        // Sleep for a while
        usleep(100);
        
        $time_end = microtime_float();
        $time = $time_end - $time_start;
        $pic_name = $time.".gif";
        /** hier müsstest ja eigentlich die dabei mit move_uploaded_file() verschieben **/
        /** dann mach hier auch gleich mail() **/
zumal ich nicht verstehe wieso sich der Name ändern sollte bloß weil du $time ausliest. Solange du $time nicht neu berechnest behällt sie ihren Wert. Ergo: Wenn du die Mail gleich nach dem verschieben der Datei losschickst hat sich auch der Wert der Variablen nicht geändert.
 
Naja das Problem ist dass die Email nicht gleichzeitig mit dem Hochladen verschickt wird, sondern erst hinterher nach Eingabe persönlicher Daten. Und dann wird über $time ja wieder ein neuer Zeitpunkt generiert - und über Zwischenspeichern funktioniert das auch nicht, wird auch wieder eine andere Zahl ausgegeben ...
 
Dann speichere den Zeitstempel in einer [phpf]Session[/phpf] ab. Oder einem Cookie. Oder übergib ihn per Post und einem versteckten <input> Feld.
 
Zurück