PHP arquivo passe Handle para o usuário para que os downloads de arquivos e salva para sua máquina
-
22-08-2019 - |
Pergunta
Eu estou baixando um arquivo de outro servidor. Eu desejo para empurrar esse arquivo para meus usuários, em vez de guardá-lo para o meu servidor.
Em outras palavras, passar-lhes o identificador de arquivo por isso só passa através do meu servidor e salva para sua máquina. Como posso fazer isso? Eu tenho este até agora:
$handle = fopen($_GET['fileURL'], 'r');
$filename = stream_get_contents($handle);
Como faço para empurrar isso para o usuário, talvez usando cabeçalhos?
Obrigado por qualquer ajuda e direção.
Editar
Eu tenho os cabeçalhos:
header("Pragma: public"); // required
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false);
header("Content-Type: $ctype");
header("Content-Disposition: attachment; filename=\"".basename($filename)."\";" );
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($filename));
readfile("$filename");
Seu justo que ele não empurrar os cabeçalhos. Acabei de receber uma página em branco após cerca de 15 segundos, o que parece que o download do arquivo, mas não dando para mim.
Eu desejo para o script para enviar imediatamente os cabeçalhos para o usuário como um riacho. Saída();
Solução
Você pode tentar este
$filetype = mime_content_type($filename);
header('Content-type: '.$filetype);
header('Content-Disposition: attachment; filename="'.$filename.'"');
Atualização para o seu EDIT:
Você tem erros desativado, uma vez que isso soa como os cabeçalhos já enviados erro?
error_reporting(E_ALL | E_STRICT);
Outras dicas
Você não tem que usar fopen () ao usar readfile ();
Basta incluir o nome do arquivo dentro readfile () como este:
readfile($_GET['fileUrl']);
Embora esta seja em termos de segurança muito perigoso como o usuário pode especificar qualquer arquivo no servidor de arquivos. Se você tiver apenas alguns arquivos que você deseja que alguém seja capaz de baixar talvez você deve armazená-los em um array (ou banco de dados, preferebly)
Aqui está um exemplo array:
$files = array('file1.jpg', 'file2.png', 'file3.pdf');
//assume $_GET['file_id'] == 0, 1 or 2
if (file_exists($files[$_GET['file_id']]))
readfile($files[$_GET['file_id']]);