Jump to content
untz

download de ficheiros em php/mysql

Recommended Posts

untz

boa tarde,

tenho um problema em fazer o download de um ficheiro que introduzi na base de dados, mas não estou a conseguir se alguem me pudesse ajudar ficaria agradecido

no ficheiro download.php tenho

<?php
if(isset($_GET['id']))
{
include (config/config.php);
// query the server for the file
$id = $_GET['id_ficheiro'];
$query = "SELECT Ficheiro FROM ficherio WHERE id_ficheiro = '$id'";
$result = mysql_query($query) or die(mysql_error());
// define results into variables
$name=mysql_result($result,0,"Ficheiro");

header("Content-disposition: attachment; filename=$Ficheiro");

mysql_close();
}
else{
die("No file ID given...");
}
?>

e no index.php:

<td><a href='index.php?mod=download&id=$row->id_ficheiro'><button class='btn btn-success'> Download </button></a></td>

com isto, ao carregar no button ele faz download do ficheiro index.php, não é o pretendido, se pudessem ajudar ficaria agradecido

obrigado!

Share this post


Link to post
Share on other sites
tiago.f

Olá,

falta-te ler o ficheiro $name do disco e "imprimi-lo"

o php permite fazer isso directamente com o comando 'readfile' (lê a documentação).

Já agora, nos meu projectos, coloca sempre estes header no download de ficheiros:

$res['Content-Description'] = 'File Transfer';
$res['Content-Type'] = $mimetype;
$res['Content-Disposition'] = 'attachment; filename=' . basename($file);
$res['Content-Transfer-Encoding'] = 'binary';
$res['Expires'] = '0';
$res['Cache-Control'] = 'must-revalidate';
$res['Pragma'] = 'public';
$res['Content-Length'] = filesize($file);

Edited by apocsantos

Share this post


Link to post
Share on other sites
tiago.f

não percebi.

qual é a linha do teu codigo que eniva o ficheiro para o cliente/browser?

Share this post


Link to post
Share on other sites
tiago.f

nao está! é por isso.

A segiur ao(s)

header("Content-disposition: attachment; filename=$Ficheiro");

falta-te

readfile($name);

o meu 2º comentario é que so tens uma instrucao "header", devias ter mais. Vê o meu exemplo e adapta..

Share this post


Link to post
Share on other sites
tiago.f

eu altero os headers que tenho pelos que me enviaste no 2º comentário ?

adaptando, claro.

o meu "header"

$res['Content-Disposition'] = 'attachment; filename=' . basename($file);

é o equivalente ao teu único que tens.

Sugiro criares os outro que te faltam, por exemplo:

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

Share this post


Link to post
Share on other sites
ruicosta.web

Como não funcionou? Deu erro? Qual?

Tens os erros e avisos, ligados para poder fazer debug de erros?

Share this post


Link to post
Share on other sites
untz

bom dia, eu já resolvi parte do download, já faz download de ficheiros em pdf, excel e powerpoint e word

no ficheiro download.php tenho o seguinte:

<?php
include(config/config.php);
if (isset($_GET['id'])){
$query = mysql_query("SELECT * FROM ficherio WHERE id_ficheiro = '".$_GET['id']."' limit 0,1");
$data = mysql_fetch_array($query);
$file = $data['Ficheiro'];
$name = "img/".$file;
header("Content-Disposition:attachment; filename=". urlencode($file));
header("content-type: application/octet-stream");
header("content-type: aplication/download");
header("content-description: File Transfer");
header("content-length: ". filesize($name));
flush();
$fp = fopen($name, "r");
while(!feof($fp)){
echo fread($fp, 65536);
flush();

}
fclose($fp);
}
?>

Share this post


Link to post
Share on other sites
tiago.f

Óptimo :)

Só algumas notas para melhorar o código.

- tens 2 vezes "content-type". Mantém o octet-stream

- podes substituir todo o código de leitura do ficheiro (incluindo e para baixo do 1o flush), por

readfile($name)

- se fores usar este código e, produção, lembra-te que tens falhas de segurança (lê os tópicos "sticky" do sub-forum php)

Bom trabalho!

  • Vote 1

Share this post


Link to post
Share on other sites
ruicosta.web

mysql_query é deprecated a partir da versão 5.5

Literatura: http://php.net/manual/en/function.mysql-query.php

Já que estás no início, começa por recorrer ao PDO. http://php.net/manual/en/ref.pdo-mysql.php

Nunca confies no utilizador. Sempre que necessitas de ler uma variável, faz uma "limpeza" antes de a leres:

Se a variável $_GET['id'] receber numeros inteiros, utiliza (int)$_GET['id'].

No mínimo dos mínimos segue estas "regras".

  • Vote 1

Share this post


Link to post
Share on other sites
untz

alguém me pode ajudar num problema aqui mesmo, eu tento fazer download de ficheiros protegidos e dá erro, diz que está danificado o ficheiro

Share this post


Link to post
Share on other sites
ruicosta.web

Define: Ficheiros protegidos. Na minha definição e vendo o teu código eles são tudo menos protegidos, inclusive a base de dados.

Aproveita e troca a utilização do mysql_ por PDO.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.