Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Sei que muitos vai correr aqui e falar para fazer isso com um htaccess simplesmente usando o
AddType application/octet-stream .avi
Porém o arquivo que quero forçar o download está hospedado em outro site. Tentei fazer com PHP como abaixo porém mudando para a URL e não local do arquivo.
<?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
header('Content-type: octet/stream');
header('Content-disposition: attachment; filename="'.basename($arquivo).'";');
header('Content-Length: '.filesize($arquivo));
readfile($arquivo);
exit;
?>
Pergunta: como foçar o download de uma determinada extensão de arquivo, lembrando que ele será aberto de uma url externa.
Sera que uso um JS manipulando algum flash? ou uso um socket?
estou resolvendo com o uso de socket
olha o codigo:
<?php
set_time_limit(0);
header('Content-Type: application/x-download');
header('Content-Disposition: attachment; filename=eskute.mp3');
header('Cache-Control: private, max-age=0, must-revalidate');
header('Pragma: public');
if (isset($_GET['url'])) {
$url = $_GET['url'];
$url = base64_decode($url);
$url = parse_url($url);
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false){
echo "Erro na criação do socket";
die();
}
$result = socket_connect($socket, $url['host'], 80);
if ($result === false) {
echo socket_last_error($socket);
die();
}
$envio = 'GET '.$url['path'] .'?'. $url['query']." HTTP/1.1\r\n";
$envio .= 'Host: ' . $url['path'] . " \r\n";
$envio .= "User-Agent: Opera/9.00 (Windows NT 5.1; U; en)\r\n";
$envio .= "Connection: Close\r\n\r\n";
//Mandamos o pedido HTTP
socket_write($socket, $envio, strlen($envio));
//Lemos os primeiros 10000 bytes para retirarmos o cabeçário
$out = socket_read($socket, 10000);
$out = explode("\r\n\r\n", $out, 2);
echo $out[1];
flush();
//Lemos 2048 bytes de dados e enviamos pro cliente
while ($out = socket_read($socket, 2048)) {
echo $out;
flush();
}
}
?>
mesmo assim ao realizar o download do arquivo ele apresenta o seguinte erro:
Warning: socket_connect() [function.socket-connect]: Host lookup failed [-10003]: Unknown server error in /home/re/site.com/go.php on line 19 -10003
alguem ja viu isso?
Oi!
Informando esta linha voce esta removendo a URL do arquivo com basename():
header('Content-disposition: attachment; filename="'.basename($arquivo).'";');
Já experimentou trocar ela por:
header('Content-disposition: attachment; filename="'.$arquivo.'";');
E ai?