[RESOLVIDO]Exibir Imagem de Banco de Dados

Pessoal

Estou com um problema. Estou gravando imagem em banco de dados.

Quando exibe através de uma aplicação Grid, o sistema exibe normalmente a imagem, mas quando tento jogar a imagem num campo criado manualmente o sistema está exibindo o código binário.

Eu tentei usar alguns exemplos postados aqui no fórum, mas sem sucesso. Continha exibindo o binário.

Na tabela é um campo BLOB e está gravando corretamente.
O campo manual na aplicação é do tipo “Imagem HTML”.
Segue abaixo o código que estou usando.
Outro detalhe. Estou exibindo um formulário “grid editável”, onde listo os produtos que estão sendo inseridos e o cliente deseja ver a imagem também.

Segue o código que estou usando.


$sql_img = " select imagem
               from produto
			  where codigo_barras = '{codigo_barras}'";
sc_lookup(ds_img, $sql_img);
if (isset({ds_img[0][0]}))
{
	if (!empty({ds_img[0][0]}))
	{
		$varImg = base64_encode({ds_img[0][0]});
		{cmp_imagem_produto} = "<img border=0 height='63px' src='data:image/png;base64,$varImg'>";
	}
	else
	{
		{cmp_imagem_produto} = "Imagem não disponível";
	}
}

Alguém sabe o que eu posso estar fazendo de errado?

Valeu!

Marcelo

1 Curtida

[size=12pt]Importante: funcionou para mim e quem sabe php irá adaptar e conseguirá fazer funcionar também.
Logo, não vou responder pedidos de ajuda posteriores neste tópico.
Somente respondo dúvidas fora do fórum (suporte) via faturamento.
Estude php e adapte para você.
[/size]


Vamos por partes.

mrcgomes,

O campo “imagem html” irá pegar uma imagem salva no hd onde o scriptcase esta instalado seja produção ou desenvolvimento.
Ela não pega uma imagem em memória.
Ele pega imagens que foram colocadas no scriptcase pelo icone escolher imagem.
Isto está no manual:
http://www.scriptcase.com.br/docs/pt_br/v8/manual_mp.htm#aplicacoes-de-consulta/consulta/campos/imagem-html

Então para mostar contéudo HTML o melhor campo é tipo texto:
http://www.scriptcase.com.br/docs/pt_br/v8/manual_mp.htm#aplicacoes-de-consulta/consulta/campos/texto
Porque ele tem a propriedade mostrar contéudo HTML.
E podemos usar a tag img para mostar a imagem neste tipo de campo.

Premissas pra solução do caso.

  1. Saber as variávies do seu servidor como por exemplo onde fica os arquivos temporários.
    Isto ajuda porque vamos gravar a imagem em disco para ser mostrada no navegador. Igualzinho a netmake faz.
    Alguns servidores tem rotinas de limpeza do diretório temporário.
    Isto elimina o risco do seu hd ficar cheio de imagens temporárias após algum tempo.
    Se não houver rotinas de limpeza do temporário aconselho a criar uma.

  2. A netmake gosta de codificar tudo e por vezes colocar nm na frente de algumas coisas.
    É bom aprender isto rápido.
    As imagens são gravadas no banco “codificadas” pela netmake.
    Aprenda verificar o código gerado para pegar estes “macetes”.

  3. Vou usar o exemplo do próprio scriptcase -> sc_album instalado com sqlite para demonstrar como pegar imagens gravadas no banco pelo scriptcase.

  4. Não vou ensinar como fazer o tratamento para saber se a imagem guardada no banco é jpg, gif e etc.
    Isto tem aos montes na internet e é necessário para saber a extensão da imagen guardada no banco.
    De forma a salvar a imagem em disco com a extensão correta.
    Por padrão irei usar um arquivo guardado no banco como jpg.
    O banco sqlite fica no diretório da instalação do scriptcase: \devel\conf\scriptcase\sc_album.db e pode ser aberto com “Sqlite Administrador” (http://sqliteadmin.orbmu2k.de/).

Primeiro teste:

Crie um blank no projeto sc_album.
No evento onexecute coloque este código comentado:

/* Parte padrão onde seleciono os campos arquivo e id_foto.
Seleciono o id_foto para fazer o nome do arquivo.
Mas você pode criar uma rotina para randomizar o nome.
*/

$sql_img = “select arquivo, id_foto from sc_fotos where id_foto = ‘486’”;
sc_lookup(ds_img, $sql_img);
$imagem= {ds_img[0][0]};

/* Esta parte do código é como a netmake decodifica o arquivo.
Modifiquei as váriaveis originais por motivo de segurança.
Ninguém quer injeção de código
*/

$temp = nm_conv_img_access(substr($imagem, 0, 12));
if (substr($temp, 0, 4) == “nm”)
{
$imagem = nm_conv_img_access($imagem);
}

if (substr($imagem, 0, 4) == “nm”)
{
$imagem = substr($imagem, 4) ;
$imagem = base64_decode($imagem) ;
}
$img_bm = strpos($imagem, “BM”) ;
if (!$img_bm === FALSE && $img_bm == 78)
{
$imagem = substr($imagem, $img_bm) ;
}

// E finalmente mostramos a imagem após ser decodificada.

header(“Content-type: image/jpeg”);
echo $imagem;

mrcgomes notou o macete?

Segundo teste.

Agora vamos fazer um teste numa grid.
No projeto sc_album abra a grid: con_fotos_slide.

Crie um campo chamdo teste no sc. Não precisa criar na base de dados.

No evento onrecord coloque este código abaixo de M_php_legenda(); :

/* Parte padrão seleciono o arquivo e id_foto.
Seleciono o id_foto para fazer o nome do arquivo.
Mas você pode criar uma rotina para randomizar o nome.
*/

$sql_img = “select arquivo, id_foto
from sc_fotos
where id_foto = ‘486’”;
sc_lookup(ds_img, $sql_img);
$imagem= {ds_img[0][0]};

/* Esta parte do código é como a netmake decodifica o arquivo.
Modifiquei as váriaveis originais por motivo de segurança.
Ninguém quer injeção de código
*/

$temp = nm_conv_img_access(substr($imagem, 0, 12));
if (substr($temp, 0, 4) == “nm”)
{
$imagem = nm_conv_img_access($imagem);
}

if (substr($imagem, 0, 4) == “nm”)
{
$imagem = substr($imagem, 4) ;
$imagem = base64_decode($imagem) ;
}
$img_bm = strpos($imagem, “BM”) ;
if (!$img_bm === FALSE && $img_bm == 78)
{
$imagem = substr($imagem, $img_bm) ;
}

/* E finalmente mostramos a imagem após ser decodificada.
salvo ela no hd e chamo no campo criado {teste}
Aqui é importante saber o diretório temporário para colocar na variável $temporário.
rode a app e veja se a imagem sc486.jpg é criada no diretório temporário.
use nas variávies que irão aparecer:

var_id_album: 199
var_id_usuario: user
depois clique em con_fotos_slide

Se foi criado o arquivo na pasta temporária basta ajustar a tag img conforme as variávies do seu servidor.
Deverão aparece duas fotos de um macaco.
Uma do campo imagem html pré-existente e outra do campo texto (teste) que criamos
As minhas variáveis eu irei omitir por motivo de segurança colocando XXXXXXXXXXXX
*/

$temporario=“xxxxxxxxxx/tmp”;
$imagem=imagecreatefromstring($imagem);
imagejpeg($imagem,$temporario."/sc".{ds_img[0][1]}.".jpg");
{teste}= “<img src=http://xxxxxxxxxxx/tmp/sc”.{ds_img[0][1]}.".jpg />";

Dica importante: no campo teste você pode ativar e desativar a propriedade Mostrar conteúdo HTML
não: mostra a foto
sim: mosta o códido html. No caso a tag img.
Assim fica fácil ver onde errou no caminho para a foto.

Fantástico Alexandre. Uma excelente aula!!! Obrigado por compartilhar.

Alexandre, bom dia.

Obrigado pela ajuda. Vou implementar.

Mas eu achava ser algo mais simples uma vez que o SC tem rotina já implementadas, como por exemplo a exibição automática quando um campo já está definido como imagem do BD.

Também sei que muitas rotinas devem ser implementadas na mão. E essa é uma delas.

Obrigado

Abraços

Marcelo

Alexandre, boa tarde!
A dica funcionou e vou guardá-la.
Mas por recomendação geral, vou armazenar as imagens em “filesystem”.
Valeu e um Feliz Natal!

Abraços

Estou tentando no ReportPDF

[code]sc_lookup(logomarca,"SELECT
logo

FROM tblEmpresa
WHERE idEmpre = [glo_empresa]");

$imagem = {logomarca[0][0]};

$temp = nm_conv_img_access(substr($imagem, 0, 12));
if (substr($temp, 0, 4) == “nm”)
{
$imagem = nm_conv_img_access($imagem);
}

if (substr($imagem, 0, 4) == “nm”)
{
$imagem = substr($imagem, 4) ;
$imagem = base64_decode($imagem) ;
}
$img_bm = strpos($imagem, “BM”) ;
if (!$img_bm === FALSE && $img_bm == 78)
{
$imagem = substr($imagem, $img_bm) ;
}

// E finalmente mostramos a imagem após ser decodificada.

header(“Content-type: image/png”);
{logo} = $imagem;[/code]

Mas dá o seguinte erro:

A imagem "http://192.168.254.2:88/scriptcase/app/MAM_Gestao_ISO_PBQPH/imprimir_View_fatura_locacao/"   contem erros e não pode ser exibida

Vixe Jean… Nesta você me pegou.
Isto: nm_conv_img_access. Já trás a imagem decodificada do banco?

HEHEHEHEhehEHeheheheheheheh kkkkkkkkkkkkk
Agora que vi, eu mesmo postei isto.
Seguinte: o final -> header(“Content-type: image/png”);
So vai funcionar no navegador. Para usar no report pdf terá que fazer outro tipo de chamada.

pois é…como chamar isso é um mistério… :frowning:

http://www.tcpdf.org/examples/example_009.phps

cito:
"
// Example of Image from data stream (‘PHP rules’)
$imgdata = base64_decode(‘iVBORw0KGgoAAAANSUhEUgAAABwAAAASCAMAAAB/2U7WAAAABlBMVEUAAAD///+l2Z/dAAAASUlEQVR4XqWQUQoAIAxC2/0vXZDrEX4IJTRkb7lobNUStXsB0jIXIAMSsQnWlsV+wULF4Avk9fLq2r8a5HSE35Q3eO2XP1A1wQkZSgETvDtKdQAAAABJRU5ErkJggg==’);

// The ‘@’ character is used to indicate that follows an image data stream and not an image file name
$pdf->Image(’@’.$imgdata);
"

Olá pessoal, sei q este post é antigo, mas tentei utilizar o código de vcs e não deu certo.

Tenho uma grid de modelos de envio de emails

Quando quero enviar um email basta clicar na cx de email e depois irá para esta outra página:
image
Onde posso enviar o email para um ou todos os clientes.
No campo em vermelho, abaixo da Categoria, deveria estar aparecendo a imagem que eu cadastrei no modelo de email, mas mostra uma tela preta e não mostra o form Controle que eu fiz ara enviar o email com a imagem.

A imagem do logo que esta na Editor HTML q mostra o form Controle só aparece se tiver com o endereço da imagem

Mas tem muito usuário que não sabe incluir no Servidor e apenas quer incluir a imagem e a mesma ser enviada com o email.

Gostaria que quando inserisse a imagem no cadastro/Alteração do Modelo de Email, o mesmo aparecesse para o usuário ver a imagem e também q quando enviasse o email, a mesma aparecesse na tela do Form Controle para ser visualizado e a imagem recebida no e-mail do cliente.

Como posso resolver esta questão?
O Scriptcase já atualizou para uma forma mais fácil para o desenvolvedor e usuário?

Agradeço desde já a todos.