Скачать любой файл с помощью PHP - PullRequest
0 голосов
/ 14 сентября 2010

Как я могу скачивать файлы (text / pdf / etc), используя php с всплывающим заголовком, чтобы пользователь мог выбрать Сохранить или Открыть?Файл хранится в (admin /)

Я использую это, но это не будет работать.Загруженный файл пуст!Вот мой код:

 //get the filename
$filename = $_GET['filename'];

//open the file based in filename and path
$fp = fopen('admin/'.$filename, 'w') or die("can't open file");


header("Content-type:  text/pdf");
header("Content-Disposition: attachment; filename=file.txt");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");        

//echo file_get_contents($filename);
exit;   

Ответы [ 5 ]

3 голосов
/ 14 сентября 2010
//echo file_get_contents($filename);

Это действительно должно быть закомментировано?

Отредактировано:

И использовать readfile

Причина, по которой вы можете видеть НИЧЕГО, заключается в том, что вы не видите НИЧЕГО после объявления заголовка.

1 голос
/ 14 сентября 2010

Это звучит как опасная вещь, которую вы пытаетесь. Почему вы хотите, чтобы пользователь мог скачать любой файл? Вы уверены, что не хотите, чтобы они могли загружать файлы в определенном каталоге? С вашим сценарием они могут иметь доступ ко всем вашим PHP-сценариям и потенциально находить лазейки безопасности на вашем сервере.

Кроме того, с закомментированной строкой вы можете подумать о ее замене на решение с меньшим объемом памяти

while ($fp !== false && ($file_contents_buffer = fgets($fp, 10000)) !== false) {
    echo $file_contents_buffer;
}
1 голос
/ 14 сентября 2010

Попробуйте

header("Content-type: application/octet-stream");
0 голосов
/ 14 сентября 2010

Я думаю, этот код решит вашу проблему.

<?php

     $allowed_files = array('filename1.pdf', 'filename2.pdf'); //list content allowed files
      $file = $_GET["file"];
        if(in_array($file , $allowed_files)) { 
                header("Content-type:  text/pdf");
                header("Content-Disposition: attachment; filename=file.txt");
                header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
                    readfile($file);
                        exit;
        }

        else die('you do not have permission to download this file');
?> 
0 голосов
/ 14 сентября 2010

Некоторые проблемы:

$filename = $_GET['filename'];
$fp = fopen('admin/'.$filename, 'w') or die("can't open file");

Что если я использую /page.php?filename=../../../../list_of_secret_passwords? Это называется атака обхода каталога , от которой нужно защищаться. Кроме того, вам не нужно открывать дескриптор файла (с доступом для записи не меньше), просто используйте file_exists или is_readable, чтобы проверить, файл существует.

//echo file_get_contents($filename);

Если эта строка закомментирована, конечно, ничего не произойдет. Вы должны в первую очередь использовать readfile. file_get_contents прочитает весь файл в память, затем echo как обычная строка. Это очень расточительно и может привести к падению вашего скрипта для больших файлов. readfile выводит файл непосредственно на вывод пользователя, почти не используя дополнительную память.

Это, вероятно, ваша настоящая проблема:

/* $fp = fopen( */ 'admin/'.$filename /* , 'w') or die("can't open file"); */
/* echo file_get_contents( */ $filename /* ); */

'admin/'.$filename против $filename

Какой это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...