Qual é o melhor lugar para armazenar imagens carregadas, banco de dados SQL ou sistema de arquivos do disco?

StackOverflow https://stackoverflow.com/questions/348363

Pergunta

Eu estou escrevendo um aplicativo que permite aos usuários fazer upload de imagens para o servidor. Espero que cerca de 20 imagens por dia todos jpeg e provavelmente não editado / redimensionadas. (Esta é uma outra questão, como redimensionar as imagens no lado do servidor antes de guardar. Talvez alguém pode por favor mande um recurso .NET para que no comentário ou algo assim). Pergunto-me agora o que o melhor lugar para armazenar imagens carregadas é.

  • armazenar as imagens como um arquivo no sistema de arquivos e criar um registro em uma tabela com o caminho exato para essa imagem.

  • Ou, guarde a própria imagem em uma tabela usando uma "imagem" ou "dados binários" tipo de dados do servidor de banco de dados.

Eu vejo vantagens e desvantagens em ambas. I como a) porque eu posso facilmente mudar os arquivos e apenas tem que mudar a entrada da tabela. Por outro lado eu não gosto de armazenar dados de negócios no servidor web e eu realmente não quero para se conectar ao servidor web a qualquer outra fonte de dados que contém dados de negócios (por razões de segurança) Gosto b) porque toda a informação está em um lugar e facilmente acessível por uma consulta. Por outro lado, o banco de dados vai ficar muito grande muito em breve. Terceirização de que os dados poderiam ser mais difícil.

Foi útil?

Solução

Eu geralmente armazenar arquivos no sistema de arquivos, já que é o seu lá para, embora haja exceções. Para arquivos, o arquivo do sistema é a solução mais flexível e performance (geralmente).

Existem alguns problemas com o armazenamento de arquivos em um banco de dados - arquivos são geralmente muito maior do que a sua linha média - Resultado conjuntos contendo muitos arquivos grandes vai consumir muita memória. Além disso, se você usar um mecanismo de armazenamento que emprega mesa de fechaduras para as gravações (ISAM, por exemplo), sua mesa de arquivos pode ser bloqueado, muitas vezes, dependendo do tamanho / taxa de arquivos que você está armazenando lá.

Em relação à segurança -. Eu costumo armazenar os arquivos em um diretório que está fora da raiz do documento (não acessível através de uma solicitação HTTP) e servi-los através de um script que verifica a devida autorização primeiros

Outras dicas

O único benefício para a opção B é ter todos os dados em um sistema, no entanto, é um falso benefício! Você pode argumentar que o seu código é também uma forma de dados e, portanto, também pode ser armazenado no banco de dados - como você gostaria que

A menos que você tenha algum caso único:

  • A lógica de negócios pertence no código.
  • de dados estruturado pertence na base de dados (relacional ou não-relacional).
  • de dados em massa em pertence armazenamento (sistema de ficheiros ou outro).

Files, código, de dados

Não é necessário o uso de sistema de arquivos para manter os arquivos. Em vez disso você pode usar armazenamento em nuvem (como Amazon S3 ) ou Infrastructure-as-a-service em cima dela (como Uploadcare ):

https://uploadcare.com/upload-api-cloud-storage-and-cdn/

Mas o armazenamento de arquivos no banco de dados é uma má idéia.

Flickr usar o sistema de arquivos -eles discutir as razões aqui

Temos tido clientes insistem em opção B (armazenamento de dados) algumas vezes em alguns backends diferentes, e nós sempre acabou de volta para a opção A (armazenamento do sistema de arquivos) vai eventualmente.

blobs grandes como essa simplesmente não ter sido tratado bem o suficiente até mesmo por SQL Server 2005, que é o mais recente, tentámos-lo por diante.

Especificamente, vimos grave inchaço e acho que talvez bloqueio problemas.

Uma outra nota: se você estiver usando NTFS armazenamento baseado (servidor de janelas, etc) que você pode considerar encontrar uma maneira de contornar colocando milhares e milhares de arquivos em um diretório. Eu não sou certo porque, mas às vezes o sistema de arquivos não lidar bem com essa situação. Se alguém souber mais sobre isso, eu gostaria de ouvi-lo.

Mas eu sempre tentar usar subdiretórios para quebrar um pouco as coisas. Data de criação, muitas vezes funciona bem para isso:

Imagens / 2008/12/17 / .jpg

... Isso proporciona um nível decente de separação, e também ajuda um pouco durante a depuração. clientes Explorer e FTP tanto pode engasgar um pouco quando há realmente enormes diretórios.

EDIT: Apenas uma nota rápida para 2017, em versões mais recentes do SQL Server, há novas opções para lidar com lotes de BLOBs que são supostamente para evitar os inconvenientes I discutidos.

Eu criei recentemente um aplicativo PHP / MySQL que armazena PDFs / arquivos do Word em uma tabela MySQL (tão grandes como 40MB por arquivo até agora).

Pros:

  • Arquivos enviados são replicados para o servidor de backup juntamente com tudo o resto, nenhuma estratégia de backup separado é necessário (paz de espírito).
  • Configurar o servidor web é um pouco mais simples, porque eu não precisa ter uma pasta / uploads e contar todos os meus aplicativos onde está.
  • eu começar a usar transações para edições para melhorar a integridade dos dados - Eu não precisa se preocupar com órfãos e arquivos ausentes

Contras:

  • mysqldump agora leva um tempo looooong porque há 500MB de dados de arquivo em uma das mesas.
  • Em geral, não muito memória / CPU eficiente quando comparado ao sistema de arquivos

Eu chamaria minha implementação um sucesso, ele cuida de requisitos de backup e simplifica o layout do projeto. O desempenho é bom para os 20-30 pessoas que usam o aplicativo.

Eu sei que este é um post antigo. Mas muitos visitantes a esta página está recebendo nada relacionado com a questão. Especialmente para um novato.

Como carregar e armazenar imagens ou arquivo no nosso site:

Para um site estático lá talvez nenhum problema uma vez que o armazenamento de arquivos para alguma quota de hospedagem ainda adequados. O problema vem de um site dinâmico quando fica maior. Bigger no banco de dados podem ser manipulados, mas maior em arquivo, como imagens é torna-se um problema. Existem dois tipos de imagens em um site:

  1. Imagens vêm do administrador para o blog dinâmico. Normalmente, essas imagens foram otimizados antes de upload.

  2. Imagens de usuários no caso de usuários tem permissão para fazer upload de imagens, tais como avatar. Ou os usuários podem criar conteúdo do blog e colocar algumas imagens do editor de texto. Este tipo de imagens é difícil prever o tamanho. Os usuários podem fazer upload de imagens grandes apenas para conteúdo pequeno por redimensionar o tamanho da vista, mas não redimensionar o tamanho da imagem.

Ao ignorar item não. 1 solução anterior, rápido para item não. 2 pode ser temporária resolvido pelos seguintes dicas se não temos a funcionalidade imagem otimizador em nosso site:

  1. Não permita que os usuários diretamente fazer o upload de editor de texto, redirecionando-os a galeria de imagens. Nesta página os usuários devem fazer o upload de arquivos com antecedência antes que eles possam embutidos no conteúdo. Este método é chamado como um gerenciador de arquivos.

  2. Use a função de cortar imagem para os usuários para upload de imagens. Isso irá limitar o tamanho da imagem até mesmo os usuários fazer upload muito grande arquivo. A imagem final é o resultado da imagem cortada. Podemos definir o tamanho no lado do servidor e aceitar somente por exemplo 500Kb ou diminuir.

Agora, que é apenas temporária. Para a solução final, a pergunta é repetida:

  • Como lidar com um armazenamento de imagens grande?
  • Redimensionar ou alterar a extensão.
  • Como um site grande ou médio ou pega o armazenamento de arquivos de e-commerce para suas imagens?

O que podemos fazer então:

  1. Migrate da parte hospedagem VPS. Insuficiente? Em seguida, mais maior com a atualização para dedicado.

  2. Criar seu próprio servidor para armazenamento de arquivos. Pesquisando para fazê-lo. Isto não é tão difícil quanto você pensa. Algumas pessoas fazem isso para o seu site.

  3. A maneira mais fácil é usar o serviço de armazenamento de arquivos CDN.

Ok, 1 e 2 é um pouco caro. Mas não 3 eu acho que é a melhor solução.

Alguns serviços CDN permitem armazenar tantos arquivos da web que você quiser.

Pergunta, "como fazer o upload de arquivos para CDN do nosso site?"

Não se preocupe, uma vez que você se inscrever, geralmente livre, você receberá orientação como fazer upload de arquivos e obter o seu link de / para o seu site. Você vai ter uma API e muito mais. É fácil.

Alguns provedores de nos dar um serviço gratuito durante 14 dias com armazenamento limitado e largura de banda. Mas isso vai ser bom para o ponto de partida. O único problema é porque 'as pessoas nunca tentar'.

Hope ele vai ajudar para o novato.

Eu uso imagens no meu site carregado e eu definitivamente diria opção a).

Uma outra coisa que eu recomendo é imediatamente mudar o nome do arquivo que o usuário tem chamado a foto, para algo mais gerenciável. Por exemplo algo com a data e hora para identificar exclusivamente cada imagem.

Ele também ajuda a retirar o nome de ficheiros do utilizador de quaisquer caracteres estranhos para complicações futuras evitar.

Definitivamente redimensionar a imagem, e verificar formate-o de, se puder. Houve casos de arquivos maliciosos sendo carregado e servido por anfitriões- inconsciente por exemplo, o vulnerabilidade GIFAR lhe permitiu ocultar um applet Java malicioso em um arquivo GIF, que passaria então a ser capaz de ler os cookies no contexto atual e enviá-los para outro local para um cross-site scripting ataque. Redimensionando as imagens normalmente impede isso, pois munges o código incorporado. Embora este ataque tenha sido fixado por manchas JVM, ingenuamente, servindo-se arquivos binários sem esfregar-los lhe abre para toda uma gama de vulnerabilidades.

Lembre-se, a maioria dos scanners de vírus só pode ser executado contra a filesystem- se você armazenar seus binários no DB, você não será capaz de executar um scanner contra eles com muita facilidade.

A maioria das implementações são opção A.

Com a opção B, você abre um todo grande lata de whoop4ss quando você marshall esses bits do banco de dados em algo que podem ser exibidos em um navegador ... Além disso, se o db é baixo, as imagens não estão disponíveis.

Eu não acho que o espaço é muito de um problema ... unidades terabyte são algumas centenas de dólares agora.

Estamos implementando com a opção A, porque não tem tempo ou recursos para fazer a opção B.

Para auto redimensionamento, imagemagick tentativa ... ele é usado por muitos sistemas principais de conteúdo open source / gerenciamento de fotos ... e eu acredito que existem algumas extensões .net para isso.

Há uma espécie de uma abordagem híbrida no SQL Server 2008 chamado de filestream tipo de dados que foi falado em Rádio RunAs # 74 , que é mais ou menos como o melhor dos dois mundos. A maioria das pessoas não tem o 2008 otion, mas se o fizer, esta opção parece muito legal

Este é basicamente eu faço.

  1. armazenar uma imagem carregada no diretório temporário ou memória.
  2. Processo aquela imagem antes de armazená-lo permanentemente. 2.1. correções de cores 2.2. Comprimir 2.3. Criar várias cópias com base em dimensões de imagem 2.4. Rename com .xl, .lg, .MD, .sm etc. sufixos
  3. Pacote de todos os arquivos processados ??imagem (de um único arquivo) dentro de uma pasta com o nome da pasta como id que será armazenada em banco de dados para qualquer linha / documento juntamente com image file name (ou pode ser o nome aleatório como nome de imagem).
  4. Criar aaaa / mm / pasta d path que se não existir. Por exemplo 2016/08/21. Lembre-se que caminho e armazenar em banco de dados para mesmo documento e linha.
  5. pasta id
  6. imagem Mover para pasta path. (Pasta Path pode ser localizado na pasta / var / web-conteúdo.)
  7. buffer de memória embutida ou arquivo temporário de exclusão.

Quando você precisar acessar qualquer imagem mencionado em um documento, você tem o caminho e ID da pasta que contém imagens. Por exemplo /var/web-content/{{path}}/{{id}}/image-file-name.sm.jpg

Desta forma, se você tem que eliminar todos os arquivos de imagem processados, basta apagar a pasta e seu conteúdo de forma recursiva.

Nós usamos A. eu iria colocá-lo em uma unidade compartilhada (a menos que você não planeja executar mais de um servidor).

Se o tempo vem quando isso não irá escalar para você, então você pode investigar o cache mecanismos.

Absolutamente, positivamente a opção A. Outros, que os bancos de dados geralmente não lidar bem com BLOBs, se eles são projetados para fazê-lo ou não. Sistemas de arquivos, por outro lado, ao vivo para este material. Você tem a opção de usar RAID striping, espalhando as imagens em várias unidades, mesmo espalhá-las através de servidores geograficamente distintos.

Outra vantagem é o seu backups de banco de dados / replicação seria monstruoso.

Opção A.

Uma vez que a imagem é carregada você pode verificar o formato e redimensioná-lo antes de salvar. Há uma série de exemplos de código .Net para redimensionar imagens em http://www.codeproject.com . Por exemplo: http://www.codeproject.com/KB/cs/Photo_Resize.aspx

Por razões de segurança, também é melhor prática para problemas Evitar causadas por conteúdo Sniffing do IE que pode permitir que atacantes para carregar JavaScript dentro de arquivos de imagem, que pode ter executado no contexto do seu site. Então você pode querer transformar as imagens (cultura / redimensioná-las) de alguma forma antes de armazená-los para evitar este tipo de ataque. Esta resposta tem algumas outras idéias.

Bem, eu tenho um projeto semelhante, onde os usuários fazer upload de arquivos para o servidor. Sob meu ponto de vista, a opção a) é a melhor solução devido à sua mais flexível. O que você deve fazer é armazenar imagens em uma pasta protegida classificada pela subdiretórios. O diretório principal deve ser configurado pelo administrador como o conteúdo não deve executar scripts (muito importante) e (ler, escrever) protegido para não ser acessível em http pedido.

Espero que isso ajude você.

Se eles são pequenos arquivos que não precisam ser editadas em seguida, a opção B não é uma má opção. Eu prefiro este ao escrever a lógica para armazenar arquivos e lidar com questões de estrutura de diretório loucos. Tendo muito de arquivos em um diretório é ruim. Emkay?

Se os arquivos são grandes ou exigem edição constante, especialmente a partir de programas como o escritório, em seguida, a opção A é a sua melhor aposta.

Para a maioria dos casos, é uma questão de preferência, mas se você ir para a opção A, apenas fazer re os diretórios não tem muitos arquivos neles. Se escolher a opção B, em seguida, fazer a tabela com os dados BLOBed estar em seu próprio banco de dados e / ou grupo de arquivos. Isso vai ajudar com manutenção, especialmente backups / restaurações. Seus dados regular é provavelmente relativamente pequeno, enquanto os dados de imagem serão enorme ao longo do tempo.

Depende de suas necessidades, especialmente de volume, os usuários ea freqüência de pesquisa. Mas, para o escritório pequeno ou médio, a melhor opção é usar um aplicativo como o da Apple Fotos ou Adobe Lighroom. Eles são especializados para loja, catálogo, índice, e organizar este tipo de recurso. Mas, para grandes organizações, com fortes exigências de armazenamento e número elevado de usuários, é recomendável instanciar um plataforma de gerenciamento de conteúdo com um Digital Asset Management, como Nuxeo ou Alfresco; Ambas as ofertas recursos muito bons conseguem muito grandes volumes de dados com métodos simplificados para retrive eles. E, muito importante:., Há uma opção livre (open source) para ambas as plataformas

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top