Ir para conteúdo
Fórum Script Brasil
  • 0

Fazer download de um arquivo que está no banco de dados.


filipemattevi

Pergunta

Pessoal, estou com um problema que ainda não consegui resolver. Eu possuo uma Banco de dados e em uma tabela possuo uma coluna que quardo o arquivo propriamente dito lá, arquivos como pdf, doc, exe, entre outros. Eu já consegui resgatar o arquivo para o php em variaveis só que não imagino como fazer o download do arquivo. O arquivo está no banco de dados (MYSQL) e preciso fazer que meu cliente ao clicar em um link, vá ao banco, pegue o arquivo e baixe ele.

Espero uma resposta.

Obrigado

Link para o comentário
Compartilhar em outros sites

8 respostass a esta questão

Posts Recomendados

  • 0

Primeiro você deve definir qual é o formato do arquivo antes de regasta-lo, você pode fazer isso inserindo uma coluna no bd para definir o formato. Depois é só você muar o header de acordo com o MIME do seu arquivo e imprimir a o conteúdo logo abaixo

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

Link para o comentário
Compartilhar em outros sites

  • 0
Primeiro você deve definir qual é o formato do arquivo antes de regasta-lo, você pode fazer isso inserindo uma coluna no bd para definir o formato. Depois é só você muar o header de acordo com o MIME do seu arquivo e imprimir a o conteúdo logo abaixo

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

ok ! como eu pego o arquivo do banco de dados ?

Link para o comentário
Compartilhar em outros sites

  • 0
...Eu já consegui resgatar o arquivo para o php em variaveis...

ok ! como eu pego o arquivo do banco de dados ?

????

Se você já conseguiu resgatar o arquivo para uma variável no PHP, faça como o Norivan falou:

Primeiro você deve definir qual é o formato do arquivo antes de regasta-lo, você pode fazer isso inserindo uma coluna no bd para definir o formato. Depois é só você muar o header de acordo com o MIME do seu arquivo e imprimir a o conteúdo logo abaixo

header("Content-type: application/pdf");
Logo após o header você dá um:
echo $sua_variavel;

Link para o comentário
Compartilhar em outros sites

  • 0
...Eu já consegui resgatar o arquivo para o php em variaveis...

ok ! como eu pego o arquivo do banco de dados ?

????

Se você já conseguiu resgatar o arquivo para uma variável no PHP, faça como o Norivan falou:

Primeiro você deve definir qual é o formato do arquivo antes de regasta-lo, você pode fazer isso inserindo uma coluna no bd para definir o formato. Depois é só você muar o header de acordo com o MIME do seu arquivo e imprimir a o conteúdo logo abaixo

header("Content-type: application/pdf");
Logo após o header você dá um:
echo $sua_variavel;

consegui fazer o dowloads só que ele esta corrompendo , nos arquivos de word aparece esta menssagem

<br />

<b>Warning</b>: filesize() [<a href='function.filesize'>function.filesize</a>]: stat failed for downloadsdownloads/Anexo.doc in <b>/home/horizont/public_html/area_cliente/download.php</b> on line <b>12</b><br />

<br />

<b>Warning</b>: Cannot modify header information - headers already sent by (output started at /home/horizont/public_html/area_cliente/download.php:12) in <b>/home/horizont/public_html/area_cliente/download.php</b> on line <b>12</b><br />

<br />

<b>Warning</b>: readfile(downloadsdownloads/Anexo.doc) [<a href='function.readfile'>function.readfile</a>]: failed to open stream: No such file or directory in <b>/home/horizont/public_html/area_cliente/download.php</b> on line <b>13</b><br />

voce pode me ajudar ?

Link para o comentário
Compartilhar em outros sites

  • 0
consegui fazer o dowloads só que ele esta corrompendo , nos arquivos de word aparece esta menssagem

<br />

<b>Warning</b>: filesize() [<a href='function.filesize'>function.filesize</a>]: stat failed for downloadsdownloads/Anexo.doc in <b>/home/horizont/public_html/area_cliente/download.php</b> on line <b>12</b><br />

<br />

<b>Warning</b>: Cannot modify header information - headers already sent by (output started at /home/horizont/public_html/area_cliente/download.php:12) in <b>/home/horizont/public_html/area_cliente/download.php</b> on line <b>12</b><br />

<br />

<b>Warning</b>: readfile(downloadsdownloads/Anexo.doc) [<a href='function.readfile'>function.readfile</a>]: failed to open stream: No such file or directory in <b>/home/horizont/public_html/area_cliente/download.php</b> on line <b>13</b><br />

Bom amigão, é só para entender...

Seus arquivos estão no banco de dados em um campo "BLOB" ou no seu banco de dados você tem um "VARCHAR" contendo um caminho no disco para o arquivo ?

Pelas mensagens que você está recebendo, parece que você esta pegando uma string de um campo do banco de dados e lendo o arquivo em disco, porém o arquivo não está sendo encontrado.

Para te ajudar é necessário saber exatamente o que você quer, ler um arquivo de um campo "BLOB" do banco de dados ou pegar um caminho de um campo "VARCHAR" e usar esse caminho para ler um arquivo em disco.

Link para o comentário
Compartilhar em outros sites

  • 0
consegui fazer o dowloads só que ele esta corrompendo , nos arquivos de word aparece esta menssagem

<br />

<b>Warning</b>: filesize() [<a href=function.filesize'>function.filesize</a>]: stat failed for downloadsdownloads/Anexo.doc in <b>/home/horizont/public_html/area_cliente/download.php</b> on line <b>12</b><br />

<br />

<b>Warning</b>: Cannot modify header information - headers already sent by (output started at /home/horizont/public_html/area_cliente/download.php:12) in <b>/home/horizont/public_html/area_cliente/download.php</b> on line <b>12</b><br />

<br />

<b>Warning</b>: readfile(downloadsdownloads/Anexo.doc) [<a href='function.readfile'>function.readfile</a>]: failed to open stream: No such file or directory in <b>/home/horizont/public_html/area_cliente/download.php</b> on line <b>13</b><br />

Bom amigão, é só para entender...

Seus arquivos estão no banco de dados em um campo "BLOB" ou no seu banco de dados você tem um "VARCHAR" contendo um caminho no disco para o arquivo ?

Pelas mensagens que você está recebendo, parece que você esta pegando uma string de um campo do banco de dados e lendo o arquivo em disco, porém o arquivo não está sendo encontrado.

Para te ajudar é necessário saber exatamente o que você quer, ler um arquivo de um campo "BLOB" do banco de dados ou pegar um caminho de um campo "VARCHAR" e usar esse caminho para ler um arquivo em disco.

ok

no banco de dadados eu tenho varchar(255)

e esse é o eu script de downloads

<?php

define('DIR_DOWNLOAD', 'downloads'); // Aqui vale qualquer coisa :)

$arquivo = $_GET['arquivo];

if (stripos($arquivo, './') !== false || stripos($arquivo, '../') !== false || !file_exists($arquivo))

exit('Operação não permitida.');

$arquivo = DIR_DOWNLOAD.$arquivo; // Aqui a gente só junta o diretório com o nome do arquivo

// Configuramos os headers que serão enviados para o browser

header('Content-Description: File Transfer');

header('Content-Disposition: attachment; filename="'.$novoNome.'"');

header('Content-Type: application/octet-stream');

header('Content-Transfer-Encoding: binary');

header('Content-Length: ' . filesize($targetFile));

header('Cache-Control: must-revalidate, post-check=0, pre-check=0');

header('Pragma: public');

header('Expires: 0');

// Envia o arquivo para o cliente

readfile($targetFile);

?>

o que será que esta acontecendo ?

Link para o comentário
Compartilhar em outros sites

  • 0

Melhor coisa que voce pode fazer pra solucionar isso e fazer upload do arquivo para uma pasta qualquer do servidor, e guardar na bd o caminho pro ficheiro..

e tão simples quanto isso:

depois de fazer o upload do ficheiro para uma pasta por exeplo "Ficheiros/word/document.doc", voce guarda isso na bd, num campo por exemplo chamado caminho.

depois e so voce colocar na pagina o link pra este ficheiro. e pronto.. download começa..

por exemplo:

<a href="$query['caminho']">Download</a>

Link para o comentário
Compartilhar em outros sites

  • 0
<?php 
    define('DIR_DOWNLOAD', 'downloads'); // Aqui vale qualquer coisa :) 
     
    $arquivo = $_GET['arquivo'];
    if (stripos($arquivo, './') !== false || stripos($arquivo, '../') !== false || !file_exists($arquivo))
        exit('Operação não permitida.');

    $arquivo = DIR_DOWNLOAD.$arquivo; // Aqui a gente só junta o diretório com o nome do arquivo

   // Configuramos os headers que serão enviados para o browser
header('Content-Description: File Transfer');
header('Content-Disposition: attachment; filename="'.$novoNome.'"');
header('Content-Type: application/octet-stream');
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . filesize($targetFile));
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Expires: 0');

// Envia o arquivo para o cliente
readfile($targetFile);
?>
o que será que esta acontecendo ?
Bom, primeiro vamos entender algumas coisas: 1.
$arquivo = $_GET['arquivo'];
if (stripos($arquivo, './') !== false || stripos($arquivo, '../') !== false || !file_exists($arquivo))
    exit('Operação não permitida.');
Se você fez isso ai por segurança, então não é necessário, basta utilizar basename( $filename )
$arquivo = basename( $_GET[ "arquivo" ] );

if ( !file_exists( $arquivo ) )
    exit( "Arquivo não encontrado" );
Isso aqui parece ser um problema:
$arquivo = DIR_DOWNLOAD.$arquivo;
Se o arquivo pode não estar na pasta de execução do seu script, então o primeiro if poderá ser sempre verdadeiro, interrompendo seu script sempre. Eu faria o seguinte:
$arquivo = sprintf( "downloads/%s" , basename( $_GET[ "arquivo" ] ) );

if ( !file_exists( $arquivo ) )
    exit( "Arquivo não encontrado" );
Aqui parece ter outro problema:
header('Content-Disposition: attachment; filename="'.$novoNome.'"');
header('Content-Type: application/octet-stream');
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . filesize($targetFile));
Você está utilizando uma variável chamada $novoNome e outra chamada $targetFile, mas você não definiu elas em lugar nenhum... Abaixo o seu código modificado:
if ( isset( $_GET[ "arquivo" ] ) && !empty( $_GET[ "arquivo" ] ) ){
    if ( file_exists( ( $arquivo = sprintf( "downloads/%s" , ( $nome = basename( $_GET[ "arquivo" ] ) ) ) ) ) ){
        header('Content-Description: File Transfer');
        header('Content-Disposition: attachment; filename="'.$nome.'"');
        header('Content-Type: application/octet-stream');
        header('Content-Transfer-Encoding: binary');
        header('Content-Length: ' . filesize( $arquivo ) );
        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
        header('Pragma: public');
        header('Expires: 0');

        readfile($arquivo);
    }
}

[]'s

J. Neto

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...