web-dev-qa-db-fra.com

Quelle est la meilleure façon de télécharger et de stocker des photos sur le site?

Je ne sais pas comment les grands sites Web enregistrent les images sur leurs serveurs. Quelqu'un pourrait-il me dire comment enregistrer les images téléchargées par les utilisateurs dans leur base de données?

Je pensais, peut-être qu'ils enregistreraient simplement le fichier (l'image) dans un chemin et enregistreraient simplement ce chemin dans la base de données, n'est-ce pas?

Mais je veux le faire de cette façon. Est-ce correct? Par exemple, un site Web nommé www.photos.com. Lorsqu'un utilisateur télécharge une image, je crée un dossier du nom d'utilisateur et enregistre ces images dans ce dossier.

Je pense que nous pouvons créer un répertoire en utilisant php file concepts. Ainsi, lorsqu'un nouvel utilisateur télécharge sa photo ou son fichier, je souhaite créer un répertoire avec son nom.

Exemple: si le nom d'utilisateur est john, je créerais un répertoire comme celui-ci sur photos.com www.photos.com/john/, puis enregistrez toutes ses photos dans ce répertoire lorsqu'il télécharge une photo. Est-ce la bonne façon de procéder?

Je n'ai personne ici qui ait une bonne connaissance de l'enregistrement des fichiers sur les serveurs, veuillez donc me faire savoir comment procéder? Je veux le faire de manière correcte et sécurisée.

52
niko

Tous les grands sites Web n'enregistrent pas d'images dans la base de données ils les stockent sur le disque. Ils enregistrent une référence à la position de l'image dans un tableau. Et puis un lien à partir de là.

Pourquoi? Performance.

Extraire du contenu lourd d'une base de données est un énorme goulot d'étranglement des performances. Et les bases de données n'évoluent pas aussi bien horizontalement, cela signifierait donc un problème encore plus important. Tous les grands sites utilisent des fermes de contenu statique pour gérer le contenu statique tel que les images. Ce sont des serveurs qui ne se soucient pas moins de votre identité.

Comment gardent-ils les photos vraiment privées que vous pourriez demander? Ils ne le font pas.

Le lien de l'image est, en soi, l'adresse et le mot de passe. Prenons Facebook, par exemple. Si je stocke une image privée sur mon compte, vous ne devriez pas pouvoir l'ouvrir. Mais, tant que vous avez la bonne adresse, vous pouvez.

Cette image est privée . Notez le nom du fichier
10400121_87110566301_7482172_n.jpg
(Facebook change de temps en temps l'url pour que le lien soit rompu)

Ce n'est pas séquentiel. La seule façon d'obtenir l'image est de connaître son adresse.
Sur la base d'une photo d'utilisateur précédente, vous ne pouvez pas deviner la suivante.
. l'identité des propriétaires qui, en soi, est une protection dans l'anonymat.

Modifier (pourquoi vous ne devriez pas stocker d'images dans un dossier "nom d'utilisateur":
Après votre modification, il est devenu clair que vous avez l'intention de mettre des fichiers sur le disque et non dans la base de données. Cette modification couvre le nouveau scénario.

Même si votre logique (créer un dossier par utilisateur) semble plus organisée, cela crée des problèmes lorsque vous commencez à avoir de nombreux utilisateurs et de nombreuses images. Imaginez que vos serveurs disposent d'un espace disque de 1T. Et imaginons également que 1T est plus ou moins précis avec la charge que le serveur peut gérer.

Maintenant, vous avez 11 utilisateurs, supposons qu'ils commencent à télécharger en même temps et que chacun téléchargera plus de 100 Go de fichiers. Lorsqu'ils atteignent 91 Go chacun, le serveur est plein et vous devez commencer à stocker des images sur un autre serveur. Si cette structure utilisateur/dossier est respectée, vous devrez sélectionner l'un des utilisateurs et migrer toutes ses données vers un autre serveur. En outre, cela impose une limite stricte à un utilisateur qui ne peut pas télécharger plus de 1T de fichiers.

Dois-je alors stocker tous les fichiers dans le même dossier?
Non, les grands sites stockent généralement des fichiers dans des dossiers séquentiels (/ 000001 /,/000002 /, etc.) ayant un nombre x défini de fichiers par dossier. C'est principalement pour les problèmes de performances du système de fichiers.

En savoir plus sur combien de fichiers dans un répertoire est trop?

172
Frankie

C'est généralement une mauvaise idée de stocker des images dans votre base de données (si votre site est populaire). La base de données est, traditionnellement, l'un des principaux goulots d'étranglement dans la plupart des applications. Pas besoin de le charger plus que nécessaire. Si des images se trouvent dans le système de fichiers, de nombreux serveurs http ( nginx , par exemple) les serviront plus efficacement.

Le plus grand réseau social de Russie, Vkontakte fait exactement cela: stocker des images dans le système de fichiers.

Un autre grand réseau social a implémenté un stockage d'objets blob évolutif sophistiqué. Mais ce n'est pas accessible au public, AFAIK.

Résumé de cette réponse: ne stockez pas d'objets blob dans la base de données.

5
Sergio Tulentsev

est-ce la bonne façon de faire

Oui.
La seule chose que je suggérerais d'utiliser non pas un nom mais un identifiant.
www.photos.com/albums/1234/ serait bien pour commencer.

3
Your Common Sense

La gestion des images peut être mieux réalisée en téléchargeant physiquement des images sur le serveur, puis en enregistrant l'emplacement du fichier et les détails de l'image dans une base de données. Par la suite, un formulaire de recherche pourrait être configuré pour permettre à l'utilisateur d'effectuer une recherche de texte, une recherche de numéro de pièce ou d'autres requêtes. Un script PHP pourrait être écrit pour produire une balise d'image HTML valide basée sur les données trouvées dans le tableau.

le téléchargement d'images dans un champ BLOB MySQL ™ est une si mauvaise idée que ces données d'image sont généralement problématiques si les images sont beaucoup plus grandes que les vignettes. Si les images sont grandes, vous pouvez finir par devoir copier/coller une instruction SQL INSERT à la fois (dans phpMyAdmin). Si les images sont grandes et que l'instruction SQL INSERT est divisée en deux lignes par votre éditeur de texte, vous ne pourrez jamais restaurer l'image.

3
user319198