Nach Upload neue HTML Seite und zufälliger Name.

05/12/2013 14:22 Skyui#1
Hallo Zusammen,

ich habe mir einen Upload Script besorgt aus dem Internet. Alles funktioniert einwandfrei. Wenn ich aber meine Dateien uploade kommen Sie 1 zu 1 in mein Server an. Also der Name bleibt gleich. Wie kann ich es so machen das der Datei Name sich automatisch zufällig ändert.
2. Frage: Wie kann ich es so machen das jedes mal nach dem Upload eine neue HTML Seite entsteht und dort die geuploaded Datei automatisch eingefügt ist?

Der Upload Script arbeitet ohne Datenbank.

LG Skyui
05/12/2013 15:05 Project Rivalry#2
Du gibts einfach einen zufälligen namen entweder mit der PHP random Funktion oder mit timestamp.
05/12/2013 15:08 Synatex#3
Dafür gibts den Befehl uniqid() der dir anhand des Mikrosekundenbereichs einen Hash ermittelt der dementsprechend im Normalfall nur einmal vorkommt.

[Only registered and activated users can see links. Click Here To Register...]
05/12/2013 18:12 Cooltek#4
Hey,
ich empfehle: Zahl 1-10.000 "-" DD-MM-YYY "-" HH:mm:ss
Könnte so aussehen
Code:
//assuming $fileExtension = the file's respective extension, without the dot
$newFileName = rand(1,10000)." - ".date(d.m.Y)." - ".date(H:i:s).'.'.$fileExtension;
Und zu dem HTML Seite erstellen (Achtung, Schwachsinn..aber egal.)
Man erstelle eine template.php die so aussieht:
PHP Code:
<!DOCTYPE HTML>
<
HTML>
<
HEAD>
<
titleUpload <!filename!></title>
</
HEAD>
<
BODY>
<
img src="<!filename!>" alt="Bild-Upload <!filename!>">
</
BODY>
</
HTML
Das gibt das Template, alles was sonst noch Design etc. technisch dabei sein muss einfach anpassen.
<!filename!> ist hierbei der Dateihalter Platzname
Dann noch folgenden Code in deine Upload Datei:
PHP Code:
<?php
//assuming $fileExtension = the file's respective extension, without the dot
//further assuming $newFileName is set.
$template file_get_contents('template.php');
$template str_replace('<!filename!>'$newFileName$template);
$htmlFileName rand(1,10000).str_shuffle('oaisndoi')'.html'
file_put_contents($htmlFileName$template);
echo 
"Cool beans, file ".$htmlFileName." created! :3";
?>
Der HTML Dateiname wird wie du siehst ganz einfach generiert aus 1-10.000 und ner zufälligen Anordnung der Buchstaben oaisndoi - nicht empfehlenswert, aber das kannste ja noch ändern.
05/12/2013 18:15 #SoNiice#5
Quote:
Originally Posted by Cooltek View Post
Hey,
ich empfehle: Zahl 1-10.000 "-" DD-MM-YYY "-" HH:mm:ss
Könnte so aussehen
Code:
//assuming $fileExtension = the file's respective extension, without the dot
$newFileName = rand(1,10000)." - ".date(d.m.Y)." - ".date(H:i:s).'.'.$fileExtension;
Was spricht dabei gegen eine UniqueID? Warum gerade Datum und Uhrzeit im Dateinamen? Soll keinerlei Angriff sein, würde mich nur gerne interessieren was deiner Meinung nach gegen eine UniqueID spricht.
05/12/2013 18:23 Cooltek#6
Quote:
Originally Posted by SoNiice View Post
Was spricht dabei gegen eine UniqueID? Warum gerade Datum und Uhrzeit im Dateinamen? Soll keinerlei Angriff sein, würde mich nur gerne interessieren was deiner Meinung nach gegen eine UniqueID spricht.
Hey,
Selbstverständlich spricht nichts gegen eine Unique-ID, aber eine strukturierte Benennung macht meiner Meinung nach mehr Sinn. Durch die Benennung der Unique ID entsteht kein Nachteil, aber ebensowenig ein Vorteil. Benennung nach Name ist hilfreich wenn man z.B.: alle Dateien aus Zeitraum X bis Zeitraum Y entfernen möchte, aber Dateisysteminformationen (last-modified) nicht ergiebig sein sollten. Wenn es nur darum geht, Duplikate im Dateinamen auszuschliessen finde ich oben genannte Lösung besser.
Und keine Angst, als Angriff fasse ich Kritik schon nicht auf :)
05/12/2013 18:27 #SoNiice#7
Aber gerade mit deiner Lösung ist die Chance auf eine Doppelbenennung doch höher oder irre ich mich? Selbst wenn am Anfang eine Zufallszahl eingefügt wird, besteht die Chance, dass diese doppelt vergeben wird - Natürlich müssten nun 2 Dateien in der selben Sekunde hochgeladen werden - Aber es wäre theoretisch möglich, was bei einer UniqueID unmöglich wäre :-)
05/12/2013 18:31 Cooltek#8
Hey SoNiice,
stimmt schon. Ich ging einfach mal nicht davon aus, dass ein Projekt, welches nicht einmal eine Datenbank nutzt, genug Nutzer hat, um in einer Sekunde 2 Bilduploads zu verursachen, die beide eine gleiche Zahl aus 10.000 ziehen (gigantische Warscheinlichkeit eigentlich).

Quote:
Originally Posted by SoNiice View Post
Aber gerade mit deiner Lösung ist die Chance auf eine Doppelbenennung doch höher oder irre ich mich? Selbst wenn am Anfang eine Zufallszahl eingefügt wird, besteht die Chance, dass diese doppelt vergeben wird - Natürlich müssten nun 2 Dateien in der selben Sekunde hochgeladen werden - Aber es wäre theoretisch möglich, was bei einer UniqueID unmöglich wäre :-)
05/13/2013 07:51 Synatex#9
Quote:
aber ebensowenig ein Vorteil. Benennung nach Name ist hilfreich wenn man z.B.: alle Dateien aus Zeitraum X bis Zeitraum Y entfernen möchte
Die Unique ID basiert auf den Mikrosekunden des Timestamps... Damit kann man sogar noch genauer in Zeitraum X suchen ohne sich Parser bauen zu müssen ;)
05/14/2013 19:04 Cooltek#10
Quote:
Originally Posted by Synatex View Post
Die Unique ID basiert auf den Mikrosekunden des Timestamps... Damit kann man sogar noch genauer in Zeitraum X suchen ohne sich Parser bauen zu müssen ;)
Hallo,
Standardmäßig zumindest nicht.
Folgendes Script:
PHP Code:
<?php
echo uniqid();
?>
generiert bei mir (PHP 5.4.7) Outputs wie diese hier:
Quote:
51926de2d2236
51926df266599
51926df5df833
51926df88d815
Das Präfix variiert also nach "51926d" woraufhin auch noch Buchstabe (1x e, 1x f), eine variable Menge Zahlen (mal 88, mal nur 5), dann wieder Buchstaben und letztlich nur Zahlen folgen.
1) will ich sehen wie du daraus einen Zeitraum abliest, ohne Parser o.Ä.
2) sehe ich keinen Vorteil in Uniqid gegenüber ausreichend zufälliger Zahlen in Verbindung mit dem Datum, abgesehen von Race Conditions die bei einem solchen Projekt eindeutig vernachlässigbar sind.
lg

P.S.: Bezweifle ausserdem, das man dort auch mit Parsern oder Ähnlichem die Zeit rausholen kann: wo sind die ganzen Daten gespeichert? Wenn man für eine Komplette Zeitangabe schon 10 Zeichen braucht, wie zum Beispiel:
1368551158 (Unix Timestamp)
und dort noch keine Milisekundenangabe dabei hat. Aber was das an geht, lass ich mich gerne eines Besseren belehren ;)
05/14/2013 19:16 #SoNiice#11
Hi Cooltek,

ich habe mir gerade die genaue Definition der UniqueID nochmals angeschaut, Synatex hat da soweit erstmal recht. Die UniqueID gibt eine eindeutige ID mit Präfix zurück, die auf der aktuellen Zeit in Mikrosekunden basiert.
05/14/2013 19:53 Cooltek#12
Quote:
Originally Posted by SoNiice View Post
Hi Cooltek,

ich habe mir gerade die genaue Definition der UniqueID nochmals angeschaut, Synatex hat da soweit erstmal recht. Die UniqueID gibt eine eindeutige ID mit Präfix zurück, die auf der aktuellen Zeit in Mikrosekunden basiert.
Hey,
auch ich hab die Docs bemüht, allerdings soweit auch nichts zur wirklichen "Rückwandlung" von einer Unique-ID in Zeit (die man, wenn man zB Bilder aus Zeitraum X bis Y löschen möchte benötigt ) gefunden
Deswegen würd' ich die Aussage
Quote:
Damit kann man sogar noch genauer in Zeitraum X suchen ohne sich Parser bauen zu müssen
nicht so stehen lassen. Lasse mich aber gerne eines Besseren belehren.
lg
05/14/2013 20:49 #SoNiice#13
Über eine "Rückwandlung" beziehungsweise eine Möglichkeit die Zeit wieder auszulesen konnte ich soweit auch erstmal nichts finden, schade eigentlich - Wäre interessant gewesen.
05/14/2013 21:32 Synatex#14
Nur weil es Buchstaben enthält, heißt es noch lange nicht, dass es kein Timestamp ist ;)

In dem Fall von uniqid() enthalten die ersten 8 Zeichen (HEX) den UNIX Timestamp und die letzten 5 Zeichen die Mikrosekunden um genau zu sein. Somit musst du nur die ersten 8 Zeichen auslesen und wieder in eine Dezimalzahl umwandeln und du hast deinen Timestamp:

PHP Code:
<?php

$uid 
uniqid();

// Timestamp
$uid substr($uid,0,8);

// Ausgabe
echo date('d-m-Y H:i:s',hexdec($uid));

?>
Keine Parser, keine extra Funktionen um Dateien zu benennen und exakte Werte durch PHP mitgelieferte Funktionen die dementsprechend um einiges schneller sind (klar, für kleine Projekte nicht unbedingt benötigt, aber immer noch gut zu wissen).

Wenn man weitere Daten haben will sollte man sich überlegen ob eine Datenbank nicht doch das richtige wäre.

Quote:
eindeutige ID mit Präfix zurück
Nur, wenn man das Präfix angibt.
05/15/2013 14:26 Cooltek#15
Hey Synatex,
auf jeden Fall interessante Funktion, danke dir auch für die Erklärung.
Ist dann denke ich je nach Anwendung aber auch wichtig, zu entscheiden was wichtiger ist:
Entweder Dateinamen die ohne Weiteres archiviert / weitergegeben / anderweitig genutzt werden können (will sagen: man erkennt sie mit bloßem Auge) oder die Vermeidung des Falles "2x die Gleiche Zahl aus 10.000 innerhalb einer Sekunde" - je nach Projekt ist sicher beides Möglich.
Danke für die Erklärung nochmal,
Cooltek