| 

.NET C# Java Javascript Exception

1
Hallo Leute,
habe mir heute mal Gedanken über PHP System gemacht, mit welchem ich Bilder hochladen kann und deren Pfad ich dann in der MySQL DB ablege. SQL Insert is klar, Bilderupload is klar. Vielmehr problematisch wird es wenn ich mir folgenden Fragen stelle:
- Wohin lade ich die Bilder? //Einfach einen Ordner anlegen?
- Welchendateinamen vergebe ich für jedes hochgeladene Bild? //Zufallsgenerator mit Bedingung if not exists?

Was meint ihr? Gibt es einfachere wege? Ich würde ungern eine Ablage der Bilder in der Datenbank umsetzen.

Danke im voraus.

Spicejam
03.08.2011
spicejam 853 2 6
2 Antworten
2
Also erst einmal hängt die Antwort auf Deine Frage stark davon ab, wie viele Bilder Du denn hosten willst. So 4-5 Tausend dürften, je nach Server, durchaus noch performant in einem Ordner zu handhaben sein. Bei 4-5 Million oder noch mehr, sieht die Sache schon anders aus.

Zum Dateinamen:
Ich würde, sofern die Bilder nicht allzu riesig sind, schlicht vom Bild (nicht vom ursprünglichen Bildnamen) den Hash nehmen. Z.B. mit sha1_file().
Hat zum einen den Vorteil das Du relativ nichtssagende und schwer zu erratende Dateinamen kriegst und der zweite Vorteil ist, Du kannst beim true == file_exists davon ausgehen, dass das Bild schon auf dem Server liegt und brauchst es nicht weiter bearbeiten. Die Uploads erzeugen also keine Redundanz.

Zum Speichern:
Wenn es jetzt wirklich beliebig viele Bilder werden können sollen, wär es sinnvoll mal vorab ein paar Testdaten zu erzeugen und zu gucken, bei wie viel Bildern in einem Ordner Dein Server noch performant das macht, was er mit den Bildern machen soll. Spricht, wie viel Bilder kann ich in einen Ordner schieben, bevor PHP/Apache anfängt signifikant mehr Zeit zum raussuchen eines Bildes zu brauchen. Wenn der Server nicht ganz der schlechteste ist, kannst Du auch z.B. einfach sagen ich nehm 4000 Bilder pro Ordner. Sobald ein Ordner die Anzahl Dateien erreicht hat, wird bei Upload 4001 ein neuer Ordner gemacht.
Wenn man jetzt noch zusätzlich irgendwelche Merkmale hat, kann man das baumstrukturmäßig natürlich noch beliebig aufdröseln. /benutzer_beginnend_mit_p/image5/*.bild oder /upload_jahr_2011/upload_monat_5/images7/*.bild ... lass Dir was einfallen :-)

In der Datenbank kannst Du Verzeichnis und Dateiname dann in getrennten Feldern speichern, so bleibt Dir die Redundanzprüfung über sämtliche Ordner hinweg erhalten. Um auch noch Platz in der Datenbank zu sparen, wär noch Normalisierung ein Stichwort.
04.08.2011
lunatigs 1,3k 2 8
Das sind sehr gute Anregungen, das mit dem Hash ist denk ich der beste Weg "Random-Dateinamen" zu generieren ohne duplikate zu erhalten, außer ich lade das gleiche Bild hoch. Danke :)
spicejam 04.08.2011
1
Ein weitere einfach Methode wäre Ordner einfach für einen bestimmten Zeitraum anzulegen, worin du deine Bilder ablegst, beispielsweise ein Ordner für jeden Monat. Bzgl. der Datennamen finde ich die Verwendung von Zeitstempeln sehr schön. Wenn du das Muster "timestamp_Originaldateiname" verwendest kannst du ziemlich sicher sein, dass du einen eindeutigen Namen hast.

Wenn du den Pfad/Dateiennamen der Bilder in der Datenbank speicherst, könntest du ebenfalls die ID des Bildes als Präfix für den Dateinamen verwenden. Auch dann ist dieser definitiv eindeutig.

Beide Varianten sollten meines Erachtens auch wesentlich performanter sein, als den Hash einer Datei zu erzeugen.
04.08.2011
DevConfusion 149 1 3
Und wie verhinderst Du Redundanz, wenn es beliebig viele Bilder werden können?
lunatigs 04.08.2011
Auch gute Anregungen besonders das mit dem timestamp, ich denke eine Kombinationen aus eueren Vorgängen wäre Optimal :) Danke
spicejam 04.08.2011
Was für eine Redundanz meinst du? Dass ein Bild mehrfach hochgeladen wird? Das würde ich überhaupt nicht verhindern, da ich nicht weiß, wozu das ganze genutzt werden soll. Redundante Dateiname sind mit diesem Verfahren ebenso unwahrscheinlich, wie die Hash-Variante.
DevConfusion 04.08.2011
Sorry DevConfusion, aber auch wenn man nicht weiß wofür das Ganze sein soll, ist es nie verkehrt Redundanz zu verhindern. Wenn man nämlich irgendwann die Komponenten Speicherplatz und Backup-Platz bezahlen muß ist man klar im Vorteil, wenn man nicht unnötig alles doppelt und dreifach abspeichert.
lunatigs 04.08.2011
@lunatigs: prinzipiell geb ich dir da natürlich absolut recht, Redundanzen sollen immer verhindert werden. Ich bin mal mit Idee rangegangen, dass es sich um eine Gallery oder so was handelt, wo mehrfache Bilder sehr unwahrscheinlich sind. Zumal Speicherplatz im Zweifel auch günstiger ist, als Rechenleistung. Aber wie gesagt, in Sachen Optimierung der Speichernutzung hast du absolut recht! Guter Einwand.
DevConfusion 05.08.2011
Es geht um einen "Dienst", der mir die Bilder, die ich hochlade auf einer anderen Seite unter beachtung von bestimmten Bedinungen postet. ;-)
spicejam 05.08.2011

Stelle deine Php-Frage jetzt!