Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Tiago Souza Ribeiro

[Resolvido] Armazenar imagens em banco de dados ou diretórios?

Recommended Posts

hehehe, sabia que você ia dizer "glob", mas aí você não contradisse o que falou acima sobre consultar o diretório atrás dos path's das imagens ... ? lá no seu exemplo do corredor, se eu entendi direito.

 

Entretanto, os testes apesar de não terem exatamente o foco do tópico, provam e respondem outras perguntas sobre performance no armazenamento de dados nesses tipos de campo, como eu não conheço muito mongodb, teria algum tipo de campo em específico para esse tipo de armazenamento ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

hehehe, sabia que você ia dizer "glob", mas aí você não contradisse o que falou acima sobre consultar o diretório atrás dos path's das imagens ... ? lá no seu exemplo do corredor, se eu entendi direito.

 

loja.com/?produto=1

 

$fotos = glob($_GET['produto'] . '-*.jpg'); // array('1-capa.jpg','1-conteudo.jpg','1-contracapa.jpg');

 

Sem banco de dados ;)

 

A questão do corredor é que o tópico trata sobre passar o conteúdo da imagem via data-uri. Para isso precisaríamos ler o conteúdo. Para ler o conteúdo, ou ele já está no banco, ou vamos buscar o caminho no banco. Era esse o problema. Agora não tratamos mais do conteúdo, não precisamos chegar até a imagem. A ida ao corredor de arquivos é apenas uma. Devolvemos no final do corredor o caminho. Esse corredor será percorrido novamente, mas por uma nova requisição HTTP.

 

Entretanto, os testes apesar de não terem exatamente o foco do tópico, provam e respondem outras perguntas sobre performance no armazenamento de dados nesses tipos de campo, como eu não conheço muito mongodb, teria algum tipo de campo em específico para esse tipo de armazenamento ?

 

http://bsonspec.org/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pera ae, tá uma confusão danada isso aqui... está até interessante o debate ae, hehe, mas deixa só eu confirmar se entenderam exatamente o que eu pretendia fazer: era simples, apenas armazenar num campo de texto qualquer do banco de dados, o código base64, para usar como data-uri numa tag <img.... />.

Não entendi muito bem, mas parece que estão falando ae de criar o base64 da imagem pelo SQL... eu pretendia usar a função base64_encode() para criar o código, e esse seria armazenado normalmente no banco de dados, como qualquer texto comum...

 

Exemplo de tabela que iria usar [images]:

 

+---+----------+-------------------------------------------------+

| id | formato | base64 |

+---+----------+-------------------------------------------------+

| 1 | gif/jpg/png | código-base64-da-imagem-aqui |

+---+----------+-------------------------------------------------+

 

Aí criaria uma função assim:

 

function getimg($id) {
$select = mysqli_query($conexao, "SELECT formato,base64 FROM images WHERE id='".$id."'");
$get = mysqli_fetch_array($select, MYSQLI_ASSOC);
return array($get['formato'], $get['base64']);
}

 

Usaria assim:

 

<img src="data:image/<?php echo getimg(1)[0]; ?>;base64,<?php echo getimg(1)[1]; ?>" />

 

Apenas isto. E quando eu fosse salvar a imagem no db, codificaria ela com a função base64_encode() do PHP e armazenaria o resultado no campo "base64" da tabela.

 

Foi isso que entenderam?

 

Obs: já não pretendo mais usar esse método pelo tanto de desvantagens que me apontaram (33% a mais de uso do disco, query lentas...), mas a discussão ae tá boa, não conheço muita coisa de banco de dados, só o básico, então está sendo bem interessante :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pera ae, tá uma confusão danada isso aqui... está até interessante o debate ae, hehe, mas deixa só eu confirmar se entenderam exatamente o que eu pretendia fazer: era simples, apenas armazenar num campo de texto qualquer do banco de dados, o código base64, para usar como data-uri numa tag <img.... />.

Não entendi muito bem, mas parece que estão falando ae de criar o base64 da imagem pelo SQL... eu pretendia usar a função base64_encode() para criar o código, e esse seria armazenado normalmente no banco de dados, como qualquer texto comum...

 

Exemplo de tabela que iria usar [images]:

 

+---+----------+-------------------------------------------------+

| id | formato | base64 |

+---+----------+-------------------------------------------------+

| 1 | gif/jpg/png | código-base64-da-imagem-aqui |

+---+----------+-------------------------------------------------+

 

Aí criaria uma função assim:

 

function getimg($id) {
$select = mysqli_query($conexao, "SELECT formato,base64 FROM images WHERE id='".$id."'");
$get = mysqli_fetch_array($select, MYSQLI_ASSOC);
return array($get['formato'], $get['base64']);
}

 

Usaria assim:

 

<img src="data:image/<?php echo getimg(1)[0]; ?>;base64,<?php echo getimg(1)[1]; ?>" />

 

Apenas isto. E quando eu fosse salvar a imagem no db, codificaria ela com a função base64_encode() do PHP e armazenaria o resultado no campo "base64" da tabela.

 

Foi isso que entenderam?

 

Obs: já não pretendo mais usar esse método pelo tanto de desvantagens que me apontaram (33% a mais de uso do disco, query lentas...), mas a discussão ae tá boa, não conheço muita coisa de banco de dados, só o básico, então está sendo bem interessante :)

 

Sim, entendemos perfeitamente. A minha opinião se resume a esse parágrafo:

Escrever as imagens como data-uri está fora de cogitação. Nunca sacrificaria as várias formas de caching e compressão nesse cenário.

data-uri pra mim seria uma saída pra um fundo degradê, por exemplo. Não imagens complexas. Às vezes o base64 gerado consegue ser maior que a imagem! Sem contar que eu teria que embutir isso no markup, atrasando a exibição do conteúdo textual.

 

Acredito que odebate se "acalorou" porque armazenar a imagem encoded no banco é similar a armazenar o conteúdo dela. Para isso temos outras formas.

 

O equivalente, seria você armazenar a imagem como um blob e, depois do select, imprimir o base64_encode dela.

 

Mas dá na mesma, todas as desvantagens já citadas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ah, ok...

Mas segundo o que Andrey me falou por private, nem pra elementos do layout, como o background que você citou, vale a pena usar o data-uri :(

O css vai ficar muito grande, demorar de carregar, e fazer uma bagunça.

Sendo assim, até hoje não vi utilidade do uso de imagens por esse modo, hehe

 

Vlw a todo ae;

Dúvida resolvida *-*

Compartilhar este post


Link para o post
Compartilhar em outros sites

Taí... uma maneira de armazenar as imagens no FS sem precisar ter os caminhos para elas armazenados no banco de dados seria simplesmente coloca-las numa pasta cujo nome identifique o produto e usar glob para pegá-las.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ah, ok...

Mas segundo o que Andrey me falou por private, nem pra elementos do layout, como o background que você citou, vale a pena usar o data-uri :(

O css vai ficar muito grande, demorar de carregar, e fazer uma bagunça.

Sendo assim, até hoje não vi utilidade do uso de imagens por esse modo, hehe

 

Vlw a todo ae;

Dúvida resolvida *-*

 

Eu usaria.

Fiz um teste aqui, os downloads dentro de url(''), no css, são assíncronos, não impedindo o prosseguimento de processamento nenhum.

Mesmo assim, a maior vantagem de colocar conteúdo como data-uri dentro de arquivos CSS, então, seria diminuir a quantidade de requisições HTTP, que é o primeiro tópico do guia de boas práticas do Yahoo!

 

Aqui entram todas as vantagens que podem ser aplicadas numa imagem não encodada: Caching, compactação, CDN. Data-URI seria uma saída quando, por exemplo, sua equipe se recusa a montar um sprite com os ícones de interface. Como disse, preferiria uma faixa degradê usada no background. Isso normalmente não entra no sprite e seria uma requisição a menos. Quando você também não tem a seu dispor um domínio sem cookies, começa a ganhar alguns décimos de segundo que podem ser importantes.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Caraca, não conhecia ainda esta página...

As dicas de lá são muito valiosas. Eu não sabia que era pior usar @import... '-'

 

Voltando o assunto ae: pelo que entendi do que o Andrey me falou, se usar data-uri no css, o arquivo css vai ficar muito grande, vai demorar de carregar, e quando o site começar a carregar vai estar feio, sem layout, pois ele será carregado só depois. Eu vejo esse problema quase sempre no Twitter, eu entro lá, a página fica toda feia, horrível, só o html e depois de um tempo carrega o css... outras vezes nem carrega.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.