Ir para conteúdo

POWERED BY:

Arquivado

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

miqueiasrafael

[ Download de PDF ] por ID dinamicamente em PHP e mysql

Recommended Posts

Senhores, estou tendo dificuldades pra fazer o download de arquivos PDF cadastrados no banco dinamicamente por ID segue o código

 

$sql = "SELECT prod_pdf FROM form_produtos WHERE prod_id = 'id'";

$res = mysql_query($sql) or die('Erro ao selecionar arquivo: ' . mysql_error());

$conta = mysql_num_rows($res);

 

if ($conta == 1) {

$dados = mysql_fetch_object($res);

 

header("Content-disposition: attachment; filename=_Ficha-Tecnica.pdf"); //Nome do arquivo pdf

header("Content-type: application/pdf;"); //header("Content-type: application/pdf");

readfile("../../public/_metaDadosProdutos/_pdf-s/'. $conta->prod_id .'"); // Data download

} else {

echo '<script> alert("Arquivo não encontrado!");</script>';

}

 

alguém pode me ajudar?

 

 

Alguém tem alguma dica?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo não funcionou não olha aí a mensagem que o adobe gerou, sendo que se eu abrir o mesmo arquivo sem passar pela aplicação ele abre normalmente, mostrando assim que tá tudo certo com o programa e o arquivo.

 

Mas enfim o código que tá com erro mesmo!

 

olha aí a mensagem:

 

"O Adobe reader não pode abrir o 'arquivo_teste.pdf' porque não há suporte a esse tipo de arquivo ou ele foi danificado ( por exemplo, foi enviado como anexo de e-mail e não foi decodificado corretamente)."

Compartilhar este post


Link para o post
Compartilhar em outros sites

Em readfile você precisa informar um arquivo válido, pelo seu código o PDF que está sendo lido não tem a extensão... :assobiando:

readfile("../../public/_metaDadosProdutos/_pdf-s/'. $conta->prod_id .'[extensão?]");


Pode verificar também se o arquivo existe, com file_exists...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Paulo de Tarso F. M, sempre que removo o comentário do código aparece essa mensagem abaixo:

 

Notice: Array to string conversion na linha 266

 

// Segue a linha 266 apontando a conversão da variável $sendPDF, pois acho  que fiz errado!
$sql = mysql_query("INSERT INTO form_produtos VALUES ('', '" . $titulo . "', '" . $email . "', '" . $nome_imagem . "', '" . $sendPDF . "')");

e outra fiz o procedimento que você tinha dito, mas também não funcionou!

 

readfile("../../public/_metaDadosProdutos/_pdf-s/'. $conta->prod_id .'[.pdf]");

 

Gerou a seguinte mensagem:

 

===================== Mensagem do adobe ========================

"O Adobe reader não pode abrir o 'arquivo_teste.pdf' porque não há suporte a esse tipo de arquivo ou ele foi danificado ( por exemplo, foi enviado como anexo de e-mail e não foi decodificado corretamente)."

===============================================================

 

Porém tinha mencionado a extensão nessa linha abaixo:

 

header("Content-disposition: attachment; filename=_Ficha-Tecnica.pdf");

a código até baixa o arquivo PDF mas não abre!

 

 

Alguém teria um exemplo de UPLOAD e DOWNLOAD de arquivos PDF's? utilizando PHP e MYSQL?

 

Paulo de Tarso F. M, sempre que removo o comentário do código aparece essa mensagem abaixo:

 

Notice: Array to string conversion na linha 266

 

// Segue a linha 266 apontando a conversão da variável $sendPDF, pois acho  que fiz errado!
$sql = mysql_query("INSERT INTO form_produtos VALUES ('', '" . $titulo . "', '" . $email . "', '" . $nome_imagem . "', '" . $sendPDF . "')");

e outra fiz o procedimento que você tinha dito, mas também não funcionou!

 

readfile("../../public/_metaDadosProdutos/_pdf-s/'. $conta->prod_id .'[.pdf]");

 

Gerou a seguinte mensagem:

 

===================== Mensagem do adobe ========================

"O Adobe reader não pode abrir o 'arquivo_teste.pdf' porque não há suporte a esse tipo de arquivo ou ele foi danificado ( por exemplo, foi enviado como anexo de e-mail e não foi decodificado corretamente)."

===============================================================

 

Porém tinha mencionado a extensão nessa linha abaixo:

 

header("Content-disposition: attachment; filename=_Ficha-Tecnica.pdf");

a código até baixa o arquivo PDF mas não abre!

 

 

Alguém teria um exemplo de UPLOAD e DOWNLOAD de arquivos PDF's? utilizando PHP e MYSQL?

 

 

Aí galera código ainda está assim!

 

 

 

$sql = "SELECT prod_pdf FROM form_produtos WHERE  prod_id = 'id'";
$res = mysql_query($sql) or die('Erro ao selecionar arquivo: ' . mysql_error());
$conta = mysql_num_rows($res);

if ($conta == 1) {
    $dados = mysql_fetch_object($res);

    header("Content-disposition: attachment; filename=_Ficha-Tecnica.pdf"); //Nome do arquivo pdf
    header("Content-type: application/pdf;"); //header("Content-type: application/pdf");  header("Content-type: application/x-msdownload;");
    readfile("../../public/_metaDadosProdutos/_pdf-s/'. $conta->prod_id .'.pdf"); // Data download
} else {
    echo '<script> alert("Arquivo não encontrado!");</script>';
}
 

 

e gerou a seguinte mensagem:

 

===================== Mensagem do adobe ========================
"O Adobe reader não pode abrir o  'arquivo_teste.pdf' porque não há suporte a esse tipo de arquivo ou ele foi danificado ( por exemplo, foi enviado como anexo de e-mail e não foi decodificado corretamente)."
===============================================================

 

Alguém pode me ajudar?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Agora acho que o problema esteja relacionado com abertura de aspas... :assobiando: Tente trocar por isso (a ordem de alguns headers não interfere, apenas coloquei assim porque costumo deixar assim, ok?):

 

$sql = "SELECT prod_pdf FROM form_produtos WHERE  prod_id = '$id'";
$res = mysql_query($sql) or die('Erro ao selecionar arquivo: ' . mysql_error());
 
$conta = mysql_num_rows($res);
 
if ($conta == 1) {
    $dados = mysql_fetch_object($res);
    $arquivo = "../../public/_metaDadosProdutos/_pdf-s/". $dados->prod_id . ".pdf";
 
    if(!file_exists($arquivo)) {
        die("Arquivo ".$arquivo." não encontrado!");
    }
 
    header("Content-type: application/pdf");
 
    // Nome do arquivo PDF que será baixado, é assim que aparecerá para o usuário na caixa do "Salvar como..."
    header("Content-Disposition: attachment; filename=\"_Ficha-Tecnica.pdf\"");
 
    readfile($arquivo);
} else {
    echo '<script> alert("Arquivo não encontrado!");</script>';
}

 

Editado:

 

Outra coisa, na sua query está assim:

$sql = "SELECT prod_pdf FROM form_produtos WHERE  prod_id = 'id'";

Está sem um $ ali dentro das aspas simples, eu coloquei no meu exemplo, mas é assim mesmo? Ou você apenas esqueceu de colocar no exemplo mesmo, mas no código está correto?

 

Editado (de novo... rsrs):

 

Opa! Acabei de ver algo estranho aqui no seu código... Já corrigi no meu exemplo também. Estava assim:

 

$arquivo = "../../public/_metaDadosProdutos/_pdf-s/". $conta->prod_id . ".pdf";

Mas na verdade tem que ficar assim:

 

$arquivo = "../../public/_metaDadosProdutos/_pdf-s/". $dados->prod_id . ".pdf";

Afinal de contas, $conta contém apenas o total de resultados da consulta, e $dados é quem contém os valores da query...

 

:joia:

Compartilhar este post


Link para o post
Compartilhar em outros sites

thiagomngomes, precisa ver se ele está gerando esses PDFs dinamicamente com PHP e também, se ele estiver, qual é a classe que ele está usando, pois dependendo da classe, a configuração do método de saída pode ser diferente.

 

:joia:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Caros amigos Paulo de Tarso e thiagomngomes a aplicação é dinâmica sim, eu até poderia utilizar um framework como zend por exemplo ou outros, mas será outra pessoa dará continuidade desta aplicação que estou desenvolvendo, no entanto estou desenvolvendo o mais simples possível no contexto dinâmico! a estrutura que gera o PDF no MYSQL é o seguinte:

 

PROCEDIMENTOS:

------------------------------------------------------------------------

1º Tem um LOOPING no da tabela FROM_PROD metodo-> WHILE depois de um SELECT é claro,

 

assim:

// Na página de -->  relatórios.php
$query = mysql_query("SELECT * FROM form_produtos ORDER BY prod_id DESC, prod_imagem, prod_pdf");
while (($rel_user = mysql_fetch_array($query)) and ($prod = mysql_fetch_object($query)))
 
{
 
//--> Na página --> baixapdf.php (Baixa o PDF dinamicamente por ID em uma página específica chamada pelos ECHOS )
echo "<a href='catalogados_pdf.php?&id=" . $rel_user['prod_id'] . "'>Baixar Ficha técnica</a>";
}

 

é mais ou menos isso que estou fazendo, espero que tenham entendido melhor agora!

Compartilhar este post


Link para o post
Compartilhar em outros sites

sim, e mudei a consulta dessa maneira:

 

$sql = "SELECT * FROM form_produtos ORDER BY prod_id, prod_pdf  LIMIT 1"; 

 

olha a mensagem que gerou:

 

Arquivo ../../public/_metaDadosProdutos/_pdf-s/8ca8baa657150c4628fd7dd20bb72f50.jpg.pdf não encontrado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Observe que a variável $arquivo está apontando para uma imagem JPEG na verdade, então tem que corrigir isso... Mas estranho é a variável prod_id estar retornando com um .jpg no final, não? Você está armazenando assim no banco de dados?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não estou armazenando assim não... a coluna que recebe o PDF é do tipo BLOB normal,

E também estava dizendo anteriormente na mensagem, que aquele ID que você estava perguntando se refere a esse link que coloquei pra toda vez que for clicado no botão, ele vai baixar o PDF por ID correspondente ao registro no BD! tudo bem até aí?

 

Dessa maneira:

 

//--> Na página --> pg_relatorio.php (Baixa o PDF dinamicamente por ID em uma página específica, chamada pelos ECHOS )
echo "<a href='catalogados_pdf.php?&id=" . $rel_user['prod_id'] . "'>Baixar Ficha técnica</a>";

 

Nessa atribuição dentro da URL do link: ==> ( id=" . $rel_user['prod_id'] . " ) e por sua vez, a página que recebe o código que vai gerar os DOWNLOADs tem receberá também essa variável para assim finalizar o processo por ID.

 

Era isso que estava tentando lhe dizer Paulo de Tarso!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, até aqui tudo bem, sua query vai buscar os dados de apenas um registro, o que é normal e esperado que aconteça...

 

De qualquer forma o caminho para o arquivo PDF está sendo gerado de maneira estranha, pois, conforme erro postado por você, o nome do arquivo parece estar errado...

Faz o seguinte, logo depois da linha abaixo:

 

$dados = mysql_fetch_object($res);

Coloca o seguinte:

 

$dados = mysql_fetch_object($res);
echo '<pre>';
print_r($dados);
exit;

E poste aqui o resultado, por favor...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Notice: Undefined offset: 2 na line 251

 

Segue a // --> linha 251 respectivamente:

 

 

// Gera nome único para o PDF
 $nome_pdf = md5(uniqid(time())) . "." . $ext[1];

 

Se mudar o $ext[1] para $ext[2] mostra a seguinte mensagem:

 

Erro ao selecionar arquivo: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' prod_pdf LIMIT 1' at line 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok, ok, vamos por partes então...

 

Primeiro passo: nesse select abaixo, o que você precisa/espera que seja retornado na variável prod_pdf?

 

SELECT prod_pdf FROM form_produtos WHERE  prod_id = 'id'

Me mostre um exemplo de o que deve ser retornado se o ID for igual a um número qualquer, não importa qual seja esse ID, me mostre o que é retornado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O Select vai fazer o filtro na coluna prod_pdf da tabela form_produtos apontando o (prod_id = 'id') que no caso será ou pode ser o ultimo resgistro cadastrado na tabela form_produtos.

 

para o teu exemplo ele traria a coluna prod_pd, com o id que eu fizer e se tiver cadastrado é claro!

mas veja essa caso que montei agora pouco:

 

 

SELECT prod_pdf FROM form_produtos WHERE  prod_id = '8';

Trouxe a coluna prod_pdf da linha 8, em outras palavras apenas a célula 8 ou célula E8 como conhecemos no excel

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, no banco de teste que estou utilizando não tá trazendo NADA até porque não tem registro nesse ID, mas se eu mudar para um outro com certeza traz o valor que vc quer ver, no ECHO por exemplo utilizei o 121 tem esse registro:

 

 

// Registro da linha 121 do Mysql, coluna prod_pdf mesmo com o BLOB
8ca8baa657150c4628fd7dd20bb72f50.jpg

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.