- Armazenar normalmente em diretórios
- Codificar em URI Base64 e salvar em banco de dados MySQL
Qual método me recomendam? Qual a vantagem do mesmo sobre o outro?
Até mais.
Editado por Tiago Souza Ribeiro, 17 julho 2012 - 02:30 .
Postado 17 julho 2012 - 02:30
Editado por Tiago Souza Ribeiro, 17 julho 2012 - 02:30 .
Postado 17 julho 2012 - 02:39
function trocar_acentos ($imagem)
{
$imagem = str_replace(' ','_',$imagem);
$imagem = str_replace('á','a',$imagem);
$imagem = str_replace('ã','a',$imagem);
$imagem = str_replace('â','a',$imagem);
$imagem = str_replace('ä','a',$imagem);
$imagem = str_replace('à','a',$imagem);
$imagem = str_replace('Á','a',$imagem);
$imagem = str_replace('À','a',$imagem);
$imagem = str_replace('Ã','a',$imagem);
$imagem = str_replace('Â','a',$imagem);
$imagem = str_replace('Ä','a',$imagem);
$imagem = str_replace('ç','c',$imagem);
$imagem = str_replace('Ç','c',$imagem);
$imagem = str_replace('é','e',$imagem);
$imagem = str_replace('É','e',$imagem);
$imagem = str_replace('í','i',$imagem);
$imagem = str_replace('Í','i',$imagem);
$imagem = str_replace('ó','o',$imagem);
$imagem = str_replace('Ó','o',$imagem);
$imagem = str_replace('ú','u',$imagem);
$imagem = str_replace('Ú','u',$imagem);
$imagem = strtolower($imagem);
return $imagem;
}
$imagem = trocar_acentos ($_FILES['imagem']['name']);
$imagem_extensao = substr($imagem,strpos($imagem,'.')+1,strlen($imagem)-strpos($imagem,'.'));
$imagem_tamanho = $_FILES['imagem']['size'];
$imagem_descricao = $_POST['imagem_descricao'];
$imagem_data = date_default_timezone_set('America/Sao_Paulo');
$uploaddir = "/uploads/";
$data = time();
if ($imagem != ""){
if (file_exists($uploaddir.$imagem))
{
$imagem = $data."_".$imagem;
}
}
move_uploaded_file($_FILES['imagem']['tmp_name'], $uploaddir . $imagem);
$query = "insert into uploads (imagem) values ('$imagem')";
$rs = mysql_query($query);
Editado por lightfox, 17 julho 2012 - 02:41 .
Postado 17 julho 2012 - 02:49
Postado 17 julho 2012 - 03:05
Postado 17 julho 2012 - 03:29
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_FILENAME} \.(gif|jpe?g?|png)$ [NC]
RewriteCond %{HTTP_REFERER} !^https?://([^.]+\.)?seu-dominio\.com\.br [NC]
RewriteRule \.(gif|jpe?g?|png)$
Postado 17 julho 2012 - 04:15
Editado por Tiago Souza Ribeiro, 17 julho 2012 - 04:16 .
Postado 17 julho 2012 - 04:55
Pois é, mas desse jeito ae, vou estar impedindo de todas imagens ao mesmo tempo. E se eu quiser bloquear apenas algumas? Não posso ficar editando htaccess direto, tem que ser tudo automático.
# As primeiras três linhas do meu exemplo anterior aqui...
RewriteCond %{REQUEST_FILENAME} /([A-Z0-9\-_])\.(gif|jpe?g|png)$ [NC]
RewriteCond %{HTTP_REFERER} !^https?://(?:[^.]+\.)?seu-dominio\.com\.br [NC]
RewriteRule . imagem.php?filename=%1&extension=%2
Ah, aproveitando que tamo falando de hotlink (que nem é bem o foco do tópico): se eu bloquear, vai impedir indexação pelo Google por exemplo?
Postado 17 julho 2012 - 17:39
Postado 17 julho 2012 - 19:01
Editado por Andrey Knupp, 17 julho 2012 - 19:15 .
Postado 17 julho 2012 - 21:58
Postado 18 julho 2012 - 00:43
Obrigado a todos pelas respostas.
Bom, eu apenas pensei em salvar o conteúdo da imagem no banco de dados por ser muito mais fácil... eu apenas codificaria ele em base64 e pronto, salvaria no db, porém notei que assim usa 33% a mais de espaço em disco, segundo a página da função base64_encode no php.net.
Olhando o script do lightfox dei uma pesquisada sobre a variável $_FILES e a função move_uploaded_file e deu pra entender como fazer o upload normal, eu nunca precisei usar isso, então achei que era mais complicado, kkk.
Então, vou usar o método normal mesmo, até porque vocês crucificaram ae o outro, hehe.
Só mais uma coisa: o Evandro falou ae que seria melhor no Postgree ou algum NoSQL... porque eles sim, e o MySQL não? MySQL só serve para pequenas strings? Se for, vou ter que migrar para Postgree... estava pretendendo salvar o código fonte das postagens no banco de dados, e isso poderia ser bem grande...
Postado 18 julho 2012 - 10:43
Editado por Andrey Knupp, 18 julho 2012 - 10:43 .
Postado 18 julho 2012 - 10:57
@Evandro Oliveira, independente disso kra, eu acho errado.
Me diz um motivo pra gravar imagens no banco de dados.
Postado 18 julho 2012 - 12:04
<?php
$m = new Mongo();
$db = $m->bench ;
/*$content = file_get_contents('jQuery.jpg');
$content = base64_encode($content);
for($i = 0 ; $i < 1000 ; ++$i){
$db->images->insert(array(
"i" => $i,
"contentEncoded" => $content
));
}*/
$s = microtime(true);
foreach($db->images->find() as $image){
var_dump($image);
}
$e = (microtime(true) - $s);
var_dump($e);
float(70.329179048538)
<?php
$content = file_get_contents('jQuery.jpg');
$content = base64_encode($content);
$s = microtime(true);
for($i = 0; $i < 1000; ++$i){
echo $content ;
}
$e = (microtime(true) - $s);
var_dump($e);
Editado por Andrey Knupp, 18 julho 2012 - 12:21 .
Adicionar informação
Postado 18 julho 2012 - 19:53
Certo, agora um bench que eu fiz:
Spoiler
Esse resultado para 1000 copias de uma imagem de 128KB (nem todas terão 128KB, talvez você faça resize, talvez guarde a original e o thumb).
Daí depois tenta apertar CTRL+U.
Não vale apena ... sinceramente, você gasta alguns segundos levando em consideração o que o Evandro falou, é mais em conta do que gravar isso no banco (eu acho).
Se quiser fazer o bench sem usar o DB, simples, pega uma imagem de 128KB codifica o base 64, depois faz o looping exibindo o conteúdo..Spoiler
Informe o resultado e o que você acha.
E ainda leva em consideração o tamanho do trafego de dados entre o servidor php e o banco de dados.
E lembre da concorrência, suponha uns 20 - 30 usuários, claro que você não vai trazer 1000 imagens, pode limitar sua busca a 10 (talvez uma lista), ou coisa assim.
Para testar a concorrência, pode usar o apache benchmark.
Não dá pra fazer todos esses testes agora, mas....
Lembrando também, que isso também vai aumentar o tamanho do arquivo (caso o armazenamento das imagens for no banco), e como você citou um "caching", se você guarda por 5 minutos, e exibe pra 30 usuários, você vai ler um arquivo de no mínimo 3-4 MB a cada requisição.
E provavelmente, qualquer consulta a nodes do documento com jQuery, ou JS Puro, irá demorar (não tenho crtz, não fiz o teste)
phpunit PsqlTest.php
@Evandro, uma pergunta pessoal minha agora, suponha que você tenha que desenvolver um eCommerce, e na página de detalhes do produto, você mostra aquele slide com imagens do produto, normalmente essas imagens são referenciadas, e você tem (200-300) produtos, e 5 imagens em cada, você guardaria isso tudo em um banco de dados (base64 encoded) e mostraria como data-uri ? ou guardaria a referencia delas no banco ? (MySQL/MongoDB ou Cassandra)
Editado por Evandro Oliveira, 18 julho 2012 - 19:54 .
Postado 18 julho 2012 - 20:10
Editado por Andrey Knupp, 19 julho 2012 - 12:04 .
Postado 18 julho 2012 - 21:12
[...] o que eu faço nesse caso de várias imagens, é simplesmente uma coluna TEXT que vai ficar os paths delimitados por ';', na hora eu apenas quebro a string e exibo.
[...]
Postado 18 julho 2012 - 21:55
Certo, da mesma forma que você vai precisar da consulta pra montar o formulário de update, você vai ter essa coluna já com ele.Isso pode até ser mais rápido em termos de benchmark (não testei...), mas eu acho muito deselegante e pouco profissional. Eu crio logo um relacionamento (1hasMany) entre a tabela 'produtos' e a tabela 'imagens'. Só de pensar que na hora de adicionar uma imagem onde já haviam umas 20 eu terei que fazer a consulta e depois concatenar a string e por fim enviar de volta ao banco de dados para que o campo seja sobrescrito eu já fico agoniado.
Editado por Andrey Knupp, 18 julho 2012 - 21:58 .
Postado 19 julho 2012 - 14:04
E Evandro, seu teste tá meio errado aí não ? eu não falei sobre tipos de campo, e sim sobre o conteúdo no banco que no final das contas resume-se a exibição dele (de qualquer forma referência ou não, vai cair na tag img).
$ php -d xdebug.profiler_enable=1 /usr/local/bin/phpunit --repeat 5 PsqlTest.php

Sobre o acesso das informações do produto, veja bem, você sabe o ID do produto, mas não sabe quantas fotos são, ali eu e você afirmamos que são 5, mas e se não forem ? de qualquer forma você vai consultar o banco pra pegar as informações, o que eu faço nesse caso de várias imagens, é simplesmente uma coluna TEXT que vai ficar os paths delimitados por ';', na hora eu apenas quebro a string e exibo.
1 membro(s), 0 visitante(s) e 0 membros anônimo(s)
Relatório da empresa prevê que, nos próximos dois anos, aproximadamente 70% das organizações irão aumentar os investimentos em tecnologias móveis.
Ver mais notícias