2010-09-14 2 views
0

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

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

//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; 

ответ

3
//echo file_get_contents($filename); 

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

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

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

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

+1

Кроме того, OP должен использовать ['readfile'] (http://php.net/readfile), что намного эффективнее. – deceze

+0

Я удалил комментарий, и он все еще пуст.Фактически я использую file_get_contents ($ filename); уже довольно давно, и он отлично работал, поэтому я думаю, что для этой части кода нет проблем. – anonymous123

+1

'file_get_contents()' заставит ваш скрипт умереть, если загружаемый файл больше, чем параметр PHP 'memory_limit' (он пытается разделить весь файл на память одним выстрелом). 'readfile()' избегает этого, внутренне считывая файл последовательно в небольших кусках и отправляя их по отдельности. –

1

Попробуйте

header("Content-type: application/octet-stream"); 
1

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

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

while ($fp !== false && ($file_contents_buffer = fgets($fp, 10000)) !== false) { 
    echo $file_contents_buffer; 
} 
+0

Да! Я имею в виду любой тип файла только из admin/folder. – anonymous123

0

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

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

Что делать, если я использую /page.php?filename=../../../../list_of_secret_passwords? Это называется directory traversal attack, что вам нужно защитить. Кроме того, вам не нужно открывать дескриптор файла (с разрешением ) не менее), просто используйте 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

Какой он?

0

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

<?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'); 
?> 
Смежные вопросы