it-swarm.com.de

Speichern von vom Benutzer hochgeladenen Bildern

Was ist die übliche Vorgehensweise, um von Benutzern hochgeladene Fotos zu bearbeiten und in der Datenbank und auf dem Server zu speichern?

Für ein Benutzerprofilbild:

  1. Benennen Sie die Datei nach dem Empfang der Bilddatei vom Benutzer in <image_id>_<username> um.
  2. Bild nach /images/userprofile verschieben
  3. Füge den Dateinamen img zu einer Tabelle users hinzu, die ihre Profildetails wie first_name, last_name, age, gender, birthday enthält.

Für ein Bild für eine Überprüfung durch den Benutzer:

  1. Benennen Sie die Datei nach dem Empfang der Bilddatei vom Benutzer in <image_id>_<review_id> um.
  2. Bild nach /images/reviews verschieben
  3. Fügen Sie den Dateinamen img zu einer Tabelle reviews hinzu, deren Profildetails review_id, review_content, user_id, score lauten.

Frage 1: Wie soll ich vorgehen, um die Bilddateinamen zu speichern, wenn der Benutzer mehrere Fotos für eine bestimmte Überprüfung hochladen kann? Serialisieren?

Frage 2: Oder haben Sie eine andere Tabelle review_images mit Spalten review_id, image_id, image_filename nur zum Verfolgen von Bildern? Verlangsamt die Ausführung von JOIN beim Abrufen von image_filename aus dieser Tabelle die Leistung merklich?

Frage: Sollen alle Bilder in einem einzigen Ordner gespeichert werden? Wird es ein Problem geben, wenn sich 100.000 Fotos im selben Ordner befinden?

Gibt es einen effizienteren Weg, dies zu tun?

5
Nyxynyx

Kurze Antwort: Der Dateiname des Bildes muss nicht in der Datenbank gespeichert werden. Benennen Sie einfach die hochgeladene Datei in theirusername.jpg um und speichern Sie sie in /uploads/users/. Längere Antwort unten.


Frage 1: Wie kann ich die Bilddateinamen speichern, wenn der Benutzer mehrere Fotos für eine bestimmte Überprüfung hochladen kann? Serialisieren?

Du könntest:

  1. Trennen Sie die Dateinamen durch Kommas voneinander und speichern Sie sie in einem einzelnen Feld images in der Tabelle review. Wenn Sie Bilder zur Anzeige abrufen, teilen Sie die Zeichenfolge images durch Komma und durchlaufen Sie das Array, um die Bilder anzuordnen. (Wenn es nur ein Bild gibt, funktioniert dies immer noch.)

  2. Erstellen Sie eine separate Tabelle mit dem Namen images oder review_images und speichern Sie jedes Bild in einer eigenen Zeile, wie Sie in Ihrer zweiten Frage vorschlagen.

Frage 2: Oder lassen Sie eine andere Tabelle review_images mit den Spalten review_id, image_id, image_filename nur zum Verfolgen von Bildern anzeigen? Verlangsamt ein JOIN-Befehl beim Abrufen des Dateinamens image_filename aus dieser Tabelle die Leistung merklich?

Es ist unwahrscheinlich, dass Sie mit einem einfachen JOIN einen spürbaren Leistungseffekt erzielen. Alle geringfügigen Leistungseinbußen, die Sie erleiden, können durch Zwischenspeichern von Abfragen und Bereitstellen von statischem HTML negiert oder verringert werden.

Frage 3: Sollen alle Bilder in einem einzigen Ordner gespeichert werden?

Ich würde vorschlagen, dass Sie entweder:

  1. Erstellen Sie einen einzelnen Ordner für jeden Benutzer in Ihrem /uploads/ -Verzeichnis, wenn er seine erste Datei hochlädt.
  2. Erstellen Sie jeden Monat einen neuen Ordner (automatisch als Teil Ihres Upload-Skripts) und laden Sie dort Bilder hoch. Dies ist, was WordPress standardmäßig tut.

Dies verringert die Wahrscheinlichkeit, dass die Anzahl der Dateien in einem Verzeichnis begrenzt wird.

Wird es ein Problem geben, wenn sich 100.000 Fotos im selben Ordner befinden?

Möglicherweise, abhängig von dem Dateisystem, das Ihr Server verwendet. Die Anzahl der Dateien in einem Verzeichnis ist begrenzt. FAT32 hat beispielsweise ein Limit von 65.535 Dateien pro Ordner. Siehe "Wie viele Dateien in einem Verzeichnis sind zu viele?" on Stack Overflow. Beachten Sie, dass die Verwendung von Ordnern, wie oben vorgeschlagen, die Gefahr verringert, dass Verzeichnislimits erreicht werden.

Gibt es einen effizienteren Weg, dies zu tun?

Sie müssen keine Bilddaten in Ihrer Datenbank speichern, wenn Sie einer einfachen Konvention folgen. Wenn ein Benutzer beispielsweise ein Profilbild hochlädt, können Sie es in profile.jpg umbenennen und dann in /uploads/users/username/ speichern. Jetzt benötigen Sie nur noch den Benutzernamen des Benutzers, um dessen Profilbild abzurufen. Sie müssen keinen Verweis auf das Bild mehr in der Datenbank speichern. (Oder Sie können das Bild einfach theirusername.jpg nennen und es in /uploads/users/ speichern - wählen Sie die Konvention aus, die für Sie sinnvoll ist.)

Wenn der Benutzer Bilder für eine Überprüfung hochlädt, können Sie diese Bilder in einem Ordner mit dem Namen /uploads/reviews/13/ speichern. Die Nummer 13 am Ende wäre die Überprüfungs-ID - die eindeutige ID dieser Überprüfung, wie sie in der Datenbanktabelle gespeichert ist. Um diese Bilder anzuzeigen, reicht die Überprüfungs-ID aus, um diese Bilder abzurufen. (Um herauszufinden, welche Bilder sich in einem Ordner befinden, können Sie das Verzeichnis durchsuchen. Mit PHP verwenden Sie beispielsweise scandir () .)

2
Nick

Speichern Sie die Informationen über das Bild in der Datenbank (Benutzername, Bild-ID, Dateiname) und greifen Sie mit einem JOIN darauf zu.

Dieser Thread bei Stack Overflow bespricht dieselbe Idee, obwohl ich den genauen Thread, auf den ich verweisen wollte, nicht finden konnte, der bessere Erklärungen gibt. Michael Andrews erklärt in seinem Blog einige der tatsächlichen Praktiken zur Implementierung eines solchen Schemas ...

Die Grundidee ist, dass Sie das Bild speichern, indem Sie den Bildinhalt haschen und diesen Hash als Dateinamen verwenden.

  • Angenommen, Ihr Benutzer lädt "LazyCat.jpg" als Bild hoch.
  • Der SHA1-Hash für dieses Bild könnte "ac17c9e81fc3789ab6b8c1f3325d789e9aa3daaf" sein.
  • Auf Ihrem Server befindet sich das Bildverzeichnis 'images'. Unter images befinden sich die Unterverzeichnisse für die ersten Ziffern der Hashes, z. '/ images/0000', '/ images/0001 /', ..., '/ images/a3df /', ..., '/ images/ffff /'
  • Folgen Sie diesem Muster (um die Anzahl der Dateien in einem Verzeichnis zu verringern) und speichern Sie Ihre Datei im entsprechenden Verzeichnis, in diesem Fall '/ images/ac17/ac17c9e81fc3789ab6b8c1f3325d789e9aa3daaf'.
  • Speichern Sie in Ihrer Datenbank die Benutzer-ID und den entsprechenden Dateinamen.

Wenn mehrere Personen dasselbe Bild hochladen, wird es nur einmal auf dem Server gespeichert. Wenn Sie in Ihrer Datenbank keine Verweise mehr auf diesen Dateinamen haben, können Sie ihn löschen.

2
dmsnell