Was ist der beste Weg, um Bilder auf der Website hochzuladen und zu speichern?


73

Ich habe keine Ahnung, wie die großen Websites die Bilder auf ihren Servern speichern. Kann mir jemand sagen, wie sie die von den Benutzern hochgeladenen Bilder in ihrer Datenbank speichern?

Ich dachte, vielleicht würden sie einfach die Datei (das Bild) in einem Pfad speichern und diesen Pfad einfach in der Datenbank speichern, stimmt das?

Aber ich möchte es so machen. Ist das richtig? Zum Beispiel eine Website mit dem Namen www.photos.com. Wenn ein Benutzer ein Bild hochlädt, erstelle ich einen Ordner mit dem Benutzernamen und speichere diese Bilder in diesem Ordner.

Ich glaube, wir können ein Verzeichnis mit erstellen php file concepts. Wenn ein neuer Benutzer sein Bild oder seine Datei hochlädt, möchte ich ein Verzeichnis mit seinem Namen erstellen.

Beispiel: Wenn der Benutzername John ist, würde ich ein Verzeichnis wie dieses auf photos.com erstellen www.photos.com/john/und dann alle seine Bilder in diesem Verzeichnis speichern, wenn er ein Bild hochlädt. Ist das der richtige Weg, dies zu tun?

Ich habe hier niemanden, der gute Kenntnisse im Speichern der Dateien auf Servern hat. Bitte lassen Sie mich wissen, wie das geht. Ich möchte es richtig und sicher machen.


2
@AdrianCornish Kannst du mir sagen, was du mit dem meinst, was du versucht hast? Ich bitte Sie nicht, einen Code für mich zu schreiben, ich möchte nur den Algorithmus oder den Prozess, dem die meisten Leute folgen, damit ich weitermachen kann, wenn ich weiß, was zu tun ist
niko

Wieder was hast du versucht? Sie können einen Pfad zur Datei speichern, Sie können die Binärdaten in der Datenbank speichern. Was ist Ihre eigentliche Frage?
Adrian Cornish

Ihre Frage ist schlecht formuliert - Sie fragen, wie Sie Bilder hochladen sollen. Nicht, wie Bilder gespeichert werden, die auf Ihre Website hochgeladen wurden. Was tun Sie auch, um Benutzer vor dem Hochladen von schädlichem Code, Bildern mit versteckten Nutzdaten und dem Verhindern zu schützen, dass Benutzer nur alle Ihre Bilder von einer indexierbaren URL abrufen
Adrian Cornish

1
Das Wort "Datenbank" hat eine besondere Bedeutung. und Sie haben jeden in die Irre geführt, der versucht hat, Ihre Frage zu beantworten. Das ist jedoch schlecht, da sie die Frage nicht wirklich gelesen haben
Ihr gesunder Menschenverstand

1
@Frankie leid ich weiß nicht , aber ich akzeptierte Ihre Antwort und danke für mich wissen zu lassen, dass gut geschätzt ich Ihre Hilfe bei der Antwort Dank frankie
niko

Antworten:


211

Alle großen Websites speichern keine Bilder in der Datenbank , in der sie auf der Festplatte gespeichert sind. Sie speichern einen Verweis auf die Position des Bildes in einer Tabelle. Und dann von dort aus verlinken.

Warum? Performance.

Das Abrufen umfangreicher Inhalte aus einer Datenbank ist ein großer Leistungsengpass. Und Datenbanken lassen sich horizontal nicht so gut skalieren, sodass dies ein noch größeres Problem bedeuten würde. Alle großen Websites verwenden statische Inhaltsfarmen, um statische Inhalte wie Bilder zu verarbeiten. Das sind Server, denen Ihre Identität egal ist.

Wie halten sie die Bilder wirklich privat, könnte man fragen? Sie tun es nicht.

Der Link des Bildes ist an sich die Adresse und das Passwort. Nehmen wir zum Beispiel Facebook. Wenn ich ein privates Bild in meinem Konto speichere, sollten Sie es nicht öffnen können. Aber solange Sie die richtige Adresse haben, können Sie.

Dieses Bild ist privat . Beachten Sie den Dateinamen
10400121_87110566301_7482172_n.jpg
(Facebook ändert die URL von Zeit zu Zeit, sodass der Link möglicherweise unterbrochen wird).

Es ist nicht sequentiell. Die einzige Möglichkeit, sich ein Bild zu machen, besteht darin, die Adresse zu kennen.
Basierend auf einem vorherigen Benutzerfoto können Sie das nächste nicht erraten.
Es hat eine enorme Entropie, und selbst wenn Sie anfangen, zufällige wilde Vermutungen anzustellen, werden Sie eine große Anzahl von Fehlern haben, und wenn Sie zu einem Bild kommen, werden Sie von dort aus nicht in der Lage sein, die Identität des Besitzers zu erkennen, die, an sich ist Schutz in der Anonymität.

Bearbeiten (warum Sie Bilder nicht in einem Ordner "Benutzername" speichern sollten:
Nach Ihrer Bearbeitung wurde klar, dass Sie beabsichtigen, Dateien auf der Festplatte und nicht in der Datenbank abzulegen. Diese Bearbeitung deckt das neue Szenario ab.

Obwohl Ihre Logik (Ordner pro Benutzer erstellen) besser organisiert ist, treten Probleme auf, wenn Sie viele Benutzer und viele Bilder haben. Stellen Sie sich vor, Ihre Server verfügen über 1T Speicherplatz. Stellen wir uns auch vor, dass 1T mit der Last, die der Server bewältigen kann, mehr oder weniger genau ist.

Jetzt haben Sie 11 Benutzer. Nehmen Sie an, dass sie gleichzeitig mit dem Hochladen beginnen und jeder mehr als 100 GB Dateien hochlädt. Wenn sie jeweils 91 GB erreichen, ist der Server voll und Sie müssen Bilder auf einem anderen Server speichern. Wenn diese Benutzer- / Ordnerstruktur befolgt wird, müssen Sie einen der Benutzer auswählen und alle seine Daten auf einen anderen Server migrieren. Außerdem ist ein Benutzer, der nicht mehr als 1 TB in Dateien hochladen kann, stark eingeschränkt.

Soll ich dann alle Dateien im selben Ordner speichern?
Nein, große Websites speichern Dateien im Allgemeinen in sequentiellen Ordnern (/ 000001 /, / 000002 / usw.) mit einer x-definierten Anzahl von Dateien pro Ordner. Dies betrifft hauptsächlich Leistungsprobleme im Dateisystem.

Mehr darüber, wie viele Dateien in einem Verzeichnis zu viele sind?


21
Geniale Erklärung. Genau das, wonach ich gesucht habe, danke.
CyberJunkie

2
Danke Frankie, das ist in der Tat sehr klar. Aber es gibt noch einen anderen Weg, der mich interessanter machen sollte: Speichern Sie die Bilder bei einem bestimmten Bildspeicheranbieter.
Fred

1
@Fred absolut wahr. Diese Antwort wurde speziell entwickelt, um jemandem die richtige Einstellung zu geben, der keine Ahnung hat, wie die Dinge funktionieren. Sobald Sie anfangen, ein paar Millionen Bilder auf Ihrer Website zu hosten, möchten Sie wahrscheinlich das Problem aufteilen und / oder das Hosten dieser Assets auslagern. Die Denkweise bleibt jedoch gleich. In der Datenbank verweisen Sie nur auf den Bildspeicherort. Danke für den Kommentar.
Frankie

8

Es ist normalerweise eine schlechte Idee, Bilder in Ihrer Datenbank zu speichern (wenn Ihre Website beliebt ist). Die Datenbank ist traditionell einer der größten Engpässe in den meisten Anwendungen. Sie müssen es nicht mehr als nötig laden. Wenn sich Bilder im Dateisystem befinden, werden sie von vielen http-Servern ( z. B. nginx ) am effizientesten bereitgestellt.

Vkontakte, das größte soziale Netzwerk in Russland, macht genau das: Speichern Sie Bilder im Dateisystem.

Ein weiteres großes soziales Netzwerk implementierte einen hoch entwickelten skalierbaren Blob-Speicher. Aber es ist nicht für die Öffentlichkeit zugänglich, AFAIK.

Zusammenfassung dieser Antwort: Speichern Sie keine Blobs in der Datenbank.


3

Die Bildverwaltung kann am besten erreicht werden, indem Bilder physisch auf den Server hochgeladen und anschließend der Speicherort der Datei und die Bilddetails in einer Datenbank aufgezeichnet werden. Anschließend könnte ein Suchformular konfiguriert werden, damit der Benutzer eine Textsuche, eine Teilenummernsuche oder andere Abfragen durchführen kann. Ein PHP-Skript könnte geschrieben werden, um ein gültiges HTML-Bild-Tag basierend auf den in der Tabelle gefundenen Daten zu erstellen.

Das Hochladen von Bildern in ein MySQL ™ BLOB-Feld ist eine so schlechte Idee. Solche Bilddaten sind im Allgemeinen problematisch, wenn die Bilder viel größer als Miniaturansichten sind. Wenn die Bilder groß sind, müssen Sie möglicherweise jeweils eine SQL INSERT-Anweisung kopieren / einfügen (in phpMyAdmin). Wenn die Bilder groß sind und die SQL INSERT-Anweisung von Ihrem Texteditor in zwei Zeilen unterteilt wird, können Sie das Bild niemals wiederherstellen.


3

Ist das der richtige Weg?

Ja.
Das einzige, was ich vorschlagen würde, nicht Name, sondern ID zu verwenden.
www.photos.com/albums/1234/wäre für den Anfang okay.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.