PHP arquivo passe Handle para o usuário para que os downloads de arquivos e salva para sua máquina

StackOverflow https://stackoverflow.com/questions/539548

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();

Foi útil?

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']]);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top