Jump to content

download de ficheiros em php/mysql


untz

Recommended Posts

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!

Link to comment
Share on other sites

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
Link to comment
Share on other sites

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);
}
?>
Link to comment
Share on other sites

Ó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
Link to comment
Share on other sites

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
Link to comment
Share on other sites

  • 1 month later...

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.