Quel est le meilleur endroit pour stocker des images téléchargées, base de données SQL ou système de fichiers de disque?
j'écris une application qui permet aux utilisateurs de télécharger des images sur le serveur. Je m'attends à environ 20 images par jour tous les jpeg et probablement pas édité/redimensionné. (C'est une autre question, comment redimensionner les images du côté du serveur avant de les stocker. Peut-être que quelqu'un peut s'il vous plaît laisser tomber une ressource .NET pour cela dans le commentaire ou ainsi). Je me demande maintenant quel est le meilleur endroit pour stocker des images téléchargées.
-
stocker les images sous forme de fichier dans le système de fichiers et créer un enregistrement dans une table avec le chemin exact de l'image.
-
Ou, stocker l'image elle-même dans une table en utilisant une "image" ou "données binaires" type de données du serveur de base de données.
je vois des avantages et des inconvénients dans les deux. J'aime pas) parce que je peux les déplacer facilement les fichiers et juste à changer l'entrée de la table. D'un autre côté, je n'aime pas stocker des données d'affaires sur le serveur web et je ne voulez vraiment connecter le serveur web à toute autre source de données qui détient des données d'affaires (pour des raisons de sécurité) J'aime b) parce que toutes les informations en un seul endroit et est facilement accessible par une requête. D'un autre côté, la base de données va devenir très grande très bientôt. Externaliser ces données pourrait être plus difficile.
19 réponses
je stocke généralement des fichiers sur le système de fichiers, puisque c'est ce qu'il est là pour, bien qu'il y ait des exceptions. Pour les fichiers, le système de fichiers est la solution la plus flexible et performante (généralement).
il y a quelques problèmes avec le stockage des fichiers sur une base de données - les fichiers sont généralement beaucoup plus grands que votre ligne moyenne - résultat-ensembles contenant de nombreux fichiers de grande taille consommera beaucoup de mémoire. En outre, si vous utilisez un moteur de stockage qui utilise des serrures de table pour les Écritures (ISAM pour exemple), votre table de fichiers peuvent être verrouillés en fonction de la taille / taux des fichiers que vous stockez.
en ce qui concerne la sécurité - je stocke habituellement les fichiers dans un répertoire qui est en dehors de la racine du document (non accessible par une demande http) et je les sers par un script qui vérifie d'abord l'autorisation appropriée.
Le seul avantage pour l'option B est d'avoir toutes les données dans un seul système, mais c'est un faux! Vous pouvez faire valoir que votre code est également une forme de données, et donc aussi peut être stocké dans la base de données - comment le souhaitez-vous?
sauf si vous avez un cas unique:
- logique d'Entreprise appartient dans le code.
- les données structurées appartiennent à la base de données (relationnelle ou non relationnelle).
- données en vrac appartient au stockage (système de fichiers ou autres).
il n'est pas nécessaire d'utiliser le système de fichiers pour conserver les fichiers. Au lieu de cela, vous pouvez utiliser le stockage en nuage (comme Amazon S3 ) ou L'Infrastructure-comme-un-service sur elle (comme Uploadcare ):
https://uploadcare.com/upload-api-cloud-storage-and-cdn /
mais stocker des fichiers dans la base de données est une mauvaise idée.
Flickr utiliser le système de fichiers-ils discutent des raisons ici
nous avons eu des clients insister sur l'option B (stockage de base de données) à quelques reprises sur quelques backends différents, et nous toujours fini par retourner à l'option A (stockage de système de fichiers) éventuellement.
les gros BLOBs comme celui-là n'ont tout simplement pas été traités assez bien même par SQL Server 2005, qui est le dernier que nous avons essayé.
en particulier, nous avons vu de graves gonflements et je pense que peut-être des problèmes de verrouillage.
Une autre remarque: si vous utilisez un stockage basé sur NTFS (Windows server, etc), vous pourriez envisager de trouver un moyen de mettre des milliers et des milliers de fichiers dans un répertoire. Je ne sais pas pourquoi, mais parfois le système de fichiers ne s'adapte pas bien à cette situation. Si quelqu'un en sait plus, j'aimerais l'entendre.
Mais j'essaie toujours d'utiliser des sous-répertoires pour casser un peu les choses. La date de création fonctionne souvent bien pour cela:
Images/2008/12/17/.jpg
...Cela fournit un niveau décent de séparation, et aide aussi un peu pendant le débogage. Les clients Explorer et FTP peuvent s'étouffer un peu quand il y a vraiment d'énormes répertoires.
EDIT: Juste une note rapide pour 2017, dans les plus récentes versions de SQL Server, il y a de nouvelles options pour la manipulation de beaucoup de Gouttes qui sont censés éviter les inconvénients que j'ai discuté.
j'ai récemment créé une application PHP/MySQL qui stocke des fichiers Pdf/Word dans une table MySQL (aussi grande que 40 Mo par fichier jusqu'à présent).
Pour:
- les fichiers téléchargés sont répliqués sur le serveur de sauvegarde avec tout le reste, aucune stratégie de sauvegarde séparée n'est nécessaire (tranquillité d'esprit).
- configurer le serveur web est légèrement plus simple parce que je n'ai pas besoin d'avoir un téléchargement/ dossier et dire à tous mes les applications où il est.
- je peux utiliser transactions for edits pour améliorer l'intégrité des données - je n'ai pas à me soucier des fichiers orphelins et manquants
Inconvénients:
- mysqldump prend maintenant un looooong temps parce qu'il y a 500 Mo de données de fichier dans l'une des tables.
- globalement pas très efficace mémoire / cpu par rapport au système de fichiers
j'appellerais ma mise en œuvre un succès, il prend en charge les besoins de sauvegarde et simplifie la mise en page du projet. Le rendement est très bien pour les 20-30 personnes qui utilisent l'application.
j'utilise des images téléchargées sur mon site web et je dirais certainement l'option a).
une autre chose que je recommande fortement est de changer immédiatement le nom du fichier de ce que l'Utilisateur a appelé la photo, à quelque chose de plus gérable. Par exemple quelque chose avec la date et l'heure pour identifier chaque image.
il aide également à dépouiller le nom de fichier de l'utilisateur de tout caractère étrange pour éviter des complications futures.
redimensionnez définitivement l'image, et vérifiez son format si vous le pouvez. Il y a eu des cas où des fichiers malveillants ont été téléchargés et servis par des hôtes involontaires - par exemple, la vulnérabilité GIFAR vous a permis de cacher un applet java malveillant dans un fichier GIF, qui serait alors en mesure de lire des cookies dans le contexte actuel et de les envoyer à un autre site pour une attaque de script intersite. Le redimensionnement des images empêche généralement cela, car il munge le code intégré. Alors cette attaque a été corrigée par JVM patches, en servant naïvement des fichiers binaires sans les effacer, vous ouvre à toute une gamme de vulnérabilités.
rappelez - vous, la plupart des scanners de virus ne peuvent fonctionner que contre le système de fichiers-si vous stockez vos binaires dans la base de données, vous ne pourrez pas exécuter un scanner contre eux très facilement.
je sais que c'est un vieux post. Mais beaucoup de visiteurs de cette page n'obtiennent rien liés à la question. Surtout pour un débutant.
comment télécharger et stocker des images ou des fichiers sur notre site web:
pour un site Web statique il n'y a peut-être pas de problème puisque le stockage de fichiers pour un certain hébergement de partage encore adéquat. Le problème vient d'un site web dynamique quand il est plus grand. Plus grand dans la base de données peut être manipulé, mais plus grand dans le fichier tels que les images est devient un problème. Il y a deux types d'images dans un site web:
-
les Images proviennent de l'administrateur du blog dynamique. Habituellement, ces images ont été optimisées avant le téléchargement.
-
Images des utilisateurs en cas d'utilisateurs est autorisé à télécharger des images telles que avatar. Ou les utilisateurs peuvent créer du contenu de blog et mettre quelques images de l'éditeur de texte. Ce genre d'images est difficile à prédire. Les utilisateurs peuvent télécharger les grandes images juste pour le petit contenu en redimensionnant la taille de la vue mais pas redimensionner la taille de l'image.
by ignoring item No. 1 ci-dessus, solution rapide pour l'article no. 2 peut être temporairement résolu par les conseils suivants si nous n'avons pas la fonctionnalité d'optimisation d'image dans notre site web:
-
ne permettent pas aux utilisateurs de télécharger directement depuis l'éditeur de texte en les redirigeant vers la galerie d'images. Sur cette page les utilisateurs doivent télécharger le fichier l'avance avant qu'ils puissent intégrés dans le contenu. Cette méthode est appelée Gestionnaire de fichiers.
-
utilisez une fonction d'image de récolte pour les utilisateurs de télécharger des images. Cela limitera la taille de l'image même les utilisateurs téléchargent de très gros fichiers. L'image finale est le résultat de l'image recadrée. Nous pouvons définir la taille côté serveur et n'accepter que par exemple 500Kb ou moins.
maintenant, c'est temporaire. Pour la solution finale, la question est répétée:
- Comment gérer un grand images de stockage?
- redimensionnez ou changez l'extension.
- comment un grand ou moyen site web ou e-commerce manipule le stockage de fichiers pour leurs images?
Ce que nous pouvons faire ensuite :
-
Migrer de partager hébergement VPS. Pas assez? Puis plus haut en passant à Dedicated.
-
créez votre propre serveur pour le stockage de fichiers. Googler pour le faire. Ce n'est pas aussi difficile que vous le pensez. Certaines personnes le font pour leur site web.
-
la solution la plus simple est d'utiliser le service de stockage de fichiers CDN.
OK, 1 et 2 est un peu cher. Mais le N ° 3 est la meilleure solution.
certains services CDN vous permettent de stocker autant de fichiers web que vous voulez.
Question, " comment télécharger un fichier en CDN à partir de notre site web?"
ne vous inquiétez pas, une fois que vous vous inscrivez, généralement gratuit, vous obtiendrez des conseils sur la façon de télécharger le fichier et d'obtenir leur lien à partir de/vers votre site web. Vous obtiendrez une API et plus encore. Il est facile.
certains fournisseurs nous offrent un service gratuit pendant 14 jours avec un stockage et une bande passante limités. Mais ça ira pour le point de départ. Le seul problème est que "les gens n'essayez jamais'.
J'espère que ça aidera le débutant.
la plupart des implémentations sont l'option A.
avec l'option B, vous ouvrez une boîte entière de whoop4ss quand vous marshall ces bits de la base de données dans quelque chose qui peut être affiché sur un navigateur... De plus, si la base de données est en panne, les images ne sont pas disponibles.
Je ne pense pas que l'espace soit un problème... Les disques teraoctet coûtent 200 dollars maintenant.
nous sommes en train de mettre en œuvre l'option A parce que nous n'avons pas le temps ou les ressources pour faire l'option B.
pour le redimensionnement automatique, essayez imagemagick... il est utilisé pour de nombreux systèmes de gestion de contenu/photo open source majeurs... et je crois qu'il y a quelques .net extensions.
il y a une sorte d'approche hybride dans SQL Server 2008 appelé le filestream datatype qui a été parlé sur RunAs Radio #74 , qui est un peu comme le meilleur des deux mondes. La plupart des gens n'ont pas l'option 2008, mais si vous le faites, cette option semble assez cool
nous utilisons A. je le mettrais sur un lecteur partagé (à moins que vous n'ayez pas l'intention d'exécuter plus d'un serveur).
si le temps vient où ce ne sera pas ÉCHELLE POUR VOUS, alors vous pouvez étudier les mécanismes de mise en cache.
absolument, positivement option A. D'autres ont mentionné que les bases de données ne fonctionnent généralement pas bien avec les BLOBs, qu'ils soient conçus pour le faire ou non. Filesystems, d'un autre côté, vit pour ce genre de choses. Vous avez la possibilité d'utiliser le stripage RAID, de diffuser des images sur plusieurs disques, et même de les diffuser sur des serveurs géographiquement disparates.
un autre avantage est que les sauvegardes/réplications de votre base de données seraient monstrueuses.
Option A.
une Fois l'image chargée, vous pouvez vérifier le format et la redimensionner avant de les enregistrer. Il y a un certain nombre d'échantillons de code .Net pour redimensionner les images sur http://www.codeproject.com . Par exemple: http://www.codeproject.com/KB/cs/Photo_Resize.aspx
pour des raisons de sécurité, il est également de la meilleure pratique d'éviter les problèmes causés par contenu D'IE reniflant qui peut permettre aux attaquants de télécharger des fichiers image JavaScript à l'intérieur, qui pourrait être exécuté dans le contexte de votre site. Donc, vous pourriez vouloir transformer les images (recadrer/redimensionner) d'une façon ou d'une autre avant de les stocker pour empêcher ce genre d'attaque. Cette réponse a d'autres idées.
Eh bien, j'ai un projet similaire où les utilisateurs téléchargent des fichiers sur le serveur. De mon point de vue, l'option a) est la meilleure solution en raison de sa plus grande flexibilité. Ce que vous devez faire est de stocker des images dans un dossier protégé classé par sous-répertoires. Le répertoire principal doit être configuré par l'administrateur car le contenu ne doit pas exécuter de scripts (très important) et (lire, écrire) protégés pour ne pas être accessible dans la requête http.
j'espère que cela vous aide.
c'est fondamentalement ce que je fais.
- stocker une image téléchargée dans un répertoire temporaire ou en mémoire.
- traite cette image avant de la stocker en permanence. 2.1. Corrections de couleur 2.2. Compresser 2.3. Créer plusieurs copies en fonction des dimensions de l'image 2.4. Renommer .xl,.lg, .md,.sm etc. suffixes
- Pack tous les fichiers image traités (à partir d'un seul fichier) à l'intérieur d'un dossier avec le nom de dossier comme
id
qui sera stocké dans la base de données pour n'importe quelle ligne/document avecimage file name
(ou peut être nom aléatoire comme nom d'image). - créer aaaa/mm/d
path
si le dossier n'existe pas. Par exemple 2016/08/21. Souvenez-vous de ce chemin et stockez-le dans la base de données pour le même document et la même rangée. - Déplacement de l'image
id
dossierpath
le dossier. (Le dossier de chemin peut être situé dans /var / web-content dossier.) - tampon mémoire Flush ou supprimer le fichier temporaire.
lorsque vous avez besoin d'accéder à n'importe quelle image mentionnée dans un document, vous avez le chemin et l'id du dossier qui contient les images. Par exemple /var/web-content/{{path}}/{{id}}/image-file-name.sm.jpg
de cette façon si vous devez supprimer tous les fichiers image traités, supprimez simplement le dossier et son contenu de façon récursive.
Si elles sont de petits fichiers qui n'auront pas besoin d'être modifié ensuite l'option B n'est pas une mauvaise option. Je préfère cela à écrire de la logique pour stocker des fichiers et traiter des problèmes de structure de répertoires fous. Avoir beaucoup de fichiers dans un répertoire est mauvais. emkay?
si les fichiers sont volumineux ou nécessitent une édition constante, en particulier à partir de programmes comme office, alors l'option A est votre meilleure option.
dans la plupart des cas, il s'agit de préférence, mais si vous choisissez l'option A, faites simplement re les répertoires n'ont pas trop de fichiers. Si vous choisissez l'option B, alors faites la table avec les données Blobées être dans sa propre base de données et/ou le groupe de fichiers. Cela aidera à l'entretien, en particulier les sauvegardes/restaurations. Vos données régulières sont probablement assez petites, alors que vos données d'image seront énorme au fil du temps.
cela dépend de vos besoins, spécialement le volume, les utilisateurs et la fréquence de la recherche. Mais, pour les petits ou moyens bureaux, la meilleure option est d'utiliser une application comme Apple Photos ou Adobe Lighroom. Ils sont spécialisés pour stocker, Cataloguer, indexer et organiser ce genre de ressource. Mais, pour les grandes organisations, avec des exigences fortes de stockage et un nombre élevé d'utilisateurs, il est recommandé instantiate une plateforme de gestion de contenu avec une gestion D'actifs numériques, comme Nuxeo ou Alfresco; les deux offres de très bonnes ressources gèrent de très grands volumes de données avec des méthodes simplifiées pour les récupérer. Et, très important: il y a une option libre (open source) pour les deux plateformes.