from - php base 64 image



Lentidão encontrada quando a imagem base 64 seleciona e codifica a partir do banco de dados (2)

Eu estou trabalhando em estrutura iônica. Atualmente projetando uma página de posts com texto e imagens. O usuário pode postar dados e imagens e todos são seguros.

Então, eu uso a codificação base 64 e salvei a imagem no banco de dados.

encodeURIComponent($scope.image)

Cada vez que solicito o usuário, seleciono as linhas da tabela e as exibo junto com o texto e decodifico-as.

decodeURIComponent($scope.image) 

com HTML "data:image/jpeg;base64,_______" conversão.

Funciona bem, mas leva tanto tempo que eu esperava. Assim, a imagem tem um tamanho 33% maior e parece totalmente suave.

Então eu decido mover o plugin de upload de arquivos de cordova. Mas eu percebo, manter o arquivo dessa maneira é muito arriscado e complicado. Eu também tento salvar dados binários em banco de dados. Mas falhou.

A seleção de texto sem dados de base64 reduz drasticamente o tempo. Se for possível selecionar a imagem individualmente em outra chamada http, após selecionar outra coluna e exibir. É um mecanismo correto para lidar com imagens seguras?


Answer #1

Como regra geral, não salve arquivos no banco de dados.

O que o manual do mysql tem a dizer sobre isso? http://dev.mysql.com/doc/refman/5.7/en/miscellaneous-optimization-tips.html

Com os servidores da Web, armazene imagens e outros ativos binários como arquivos, com o nome do caminho armazenado no banco de dados em vez do próprio arquivo. A maioria dos servidores da Web são melhores em armazenar arquivos em cache do que no conteúdo do banco de dados, portanto, o uso de arquivos geralmente é mais rápido. (Embora você tenha que lidar com backups e problemas de armazenamento nesse caso.)

Não salve arquivos codificados em base4 em um banco de dados

Funciona bem, mas leva tanto tempo que eu esperava. Assim, a imagem tem um tamanho 33% maior e parece totalmente suave.

Como você descobriu, sobrecarga indesejada em codificação / decoing + espaço extra usado o que significa transferência de dados extra e para trás também.

Como @ mike-m mencionou. A codificação Base64 não é um método de compactação. Por que usar a codificação Base64 também é respondida por um link que @ mike-m postou O que é a codificação base 64 usada para?

Em suma, não há nada a ganhar e muito a perder por codificação de imagens base64 antes de armazená-las no sistema de arquivos, seja S3 ou não.

E sobre o Gzip ou outras formas de compressão sem envolver a base64. Novamente a resposta é que não há nada a ganhar e muito a perder. Por exemplo, eu apenas gzipped uma imagem JPEG 1941980 e salvo 4000 bytes que é de 0,2% de economia.

A razão é que as imagens já estão em formatos compactados. Eles não podem ser mais compactados.

Quando você armazena imagens sem compactação, elas podem ser entregues diretamente aos navegadores e outros clientes e podem ser armazenadas em cache. Se eles estiverem compactados (ou codificados em base64), eles precisam ser descompactados pelo seu aplicativo.

Navegadores modernos são capazes de exibir imagens de base64 incorporadas ao HTML, mas não podem ser armazenadas em cache e os dados são cerca de 30% maiores do que precisam ser.

Isso é uma exceção à norma?

O usuário pode postar dados e imagens e todos são seguros.

Eu presumo que você queira dizer que um usuário pode baixar imagens que pertencem a ele ou compartilhadas com ele. Isso pode ser facilmente obtido economizando os arquivos do espaço da Web no sistema de arquivos e salvando apenas o caminho no banco de dados. Em seguida, o arquivo é enviado para o cliente (depois de fazer as verificações necessárias) com fpassthru

E quando eu crescer para 100000 usuários?

Como eles se preocupam com o arquivo de imagens. Em questão de desempenho, quando grande usuário envolvido, parece-me, eu preciso de 100000 pasta para 100.000 usuário e sua subpasta. Quando uma grande quantidade de usuários navega pela mesma pasta raiz, como o sistema de arquivos processa cada pasta única.

Use um CDN ou use um sistema de arquivos especialmente adequado para isso, como o BTRFS

Banco de dados tem boa facilidade de pesquisa, boa conexão segura thread, bom gerenciamento de sessão. Este cenário é alterado quando uma grande operação envolve

Sim, de fato. Use-o ao máximo salvando todas as informações sobre o arquivo e seu caminho de arquivo no banco de dados. Em seguida, salve o arquivo em si no sistema de arquivos. Você obtém o melhor dos dois mundos.


Answer #2

Como são apenas arquivos pessoais, você pode armazená-los no S3.

Para ter segurança sobre os uploads de arquivos, basta verificar o tipo de mime do arquivo antes de fazer o upload para qualquer armazenamento que você escolher.

http://php.net/manual/en/function.mime-content-type.php

basta executar uma verificação rápida no arquivo enviado:

$mime = mime_content_type($file_path);
if($mime == 'image/jpeg') return true;

nada demais!

Manter arquivos no banco de dados é uma má prática, deve ser seu último recurso. O S3 é ótimo para muitos casos de uso, mas é caro para usos altos e os arquivos locais devem ser usados ​​apenas para intranets e aplicativos não públicos disponíveis.

Na minha opinião, vai S3.

O sdk da Amazon é fácil de usar e você recebe um armazenamento gratuito de 1 gb para testes. Você também pode usar seu próprio servidor, apenas mantenha-o fora de seu banco de dados.

Solução para armazenar imagens no sistema de arquivos

Digamos que você tenha 100.000 usuários e cada um deles tenha 10 fotos. Como você lida com o armazenamento local? Problema: o sistema de arquivos do Linux quebra após algumas dezenas de milhares de imagens, portanto, você deve fazer com que a estrutura do arquivo evite

Solução: Torne o nome da pasta 'abs (userID / 1000) * 1000' / userID

Dessa forma, quando você tiver o usuário com o ID 989787, as imagens serão armazenadas na pasta 989000/989787 / img1.jpeg 989000/989787 / img2.jpeg 989000/989787 / img3.jpeg

e lá você tem, uma maneira de armazenar imagens para um milhão de usuários que não quebram o sistema de arquivos unix.

Como sobre tamanhos de armazenamento?

No mês passado, tive de compactar 1,3 milhão de jpegs para o comércio eletrônico em que estou trabalhando. Ao carregar imagens, comprima usando o imagick com sinalizadores sem perdas e com 80% de qualidade. Isso removerá os pixels invisíveis e otimizará seu armazenamento. Como nossas imagens variam de 40x40 (miniaturas) a 1500x1500 (imagens de zoom), temos uma média de 700x700 imagens, o que representa 1,3 milhão de imagens, o que encheu 120GB de armazenamento.

Então sim, é possível armazenar tudo em seu sistema de arquivos.

Quando as coisas começam a ficar lentas, você contrata um CDN.

Como isso funcionará?

O CDN fica na frente do seu servidor de imagem, sempre que o CDN é solicitado para um arquivo, se ele não encontrá-lo em seu armazenamento (cache miss) ele irá copiá-lo do seu servidor de imagem. Mais tarde, quando o CDN for solicitado novamente, ele entregará a imagem de seu próprio cache.

Desta forma, nenhum código é necessário para migrar para uma entrega de imagem CDN, tudo que você precisa fazer é alterar os URLs em seu site e contratar um CDN, o mesmo funciona para um bucket S3.

Não é um serviço barato, mas é mais barato que cloudfront e quando você chegar ao ponto de precisar, você provavelmente pode pagar.





base64