2010-09-22 2 views
2

Я хочу знать, как реализовать логику для моей кнопки загрузки в PHP. У меня есть файл на веб-сервере и есть страница с кнопкой загрузки. Я хочу начать загрузку файла, когда пользователь нажал кнопку загрузки. Как внедрить? СпасибоКак реализовать логику для моей кнопки загрузки

+4

Просто используйте простую ссылку вместо кнопки? – halfdan

+0

Проблема заключается в том, что я не хочу показывать пользователям путь, где находится файл dowloadable. Если я использую ссылку, пользователь может увидеть файл url, что неприемлемо –

+3

Вы вытаскиваете ресурс с веб-сервера. Этот ресурс всегда будет иметь адрес, и вы не можете скрыть это. – Welbog

ответ

3

Вот как вы начинаете загрузку, не позволяя пользователю увидеть реальный путь к файлу. Сделайте ссылку ссылкой на файл download.php? File = filename и убедитесь, что файл существует в папке загрузки. Затем используйте этот код для проверки наличия файла и его загрузки. При желании вы можете поместить в него регистрацию или другую проверку.

<?php 
//download.php 
$dir = '/path/to/file/'; 
if (isset($_GET['file']) && !is_dir($_GET['file']) && file_exists($dir . $_GET['file'] . '.zip')) 
{ 
    $file = $dir . $_GET['file'] . '.zip'; 
    header('Content-type: application/force-download'); 
    header('Content-Transfer-Encoding: Binary'); 
    header('Content-length: ' . filesize($file)); 
    header('Content-disposition: attachment; filename=' . basename($file)); 
    readfile($file); 
} 
else 
{ 
    echo 'No file selected'; 
} 
?> 

Кроме того, вы можете также блокировать доступ к папке с файлами в ней с помощью файла .htaccess. Если вы хотите, поместите следующий код в файл .htaccess в каталог файлов.

order allow, deny 
deny from all 
+0

Это довольно опасно. Что делать, если я решил запросить файл '../../../ home/user/something'? 'file_exists' будет соответствовать запросу, предполагая, что файл действительно существует, и' readfile' с радостью прочитает файл '/ path/to/file /../../../ home/user/something'. Вы * можете * защитить такой метод, но зачем рисковать? – Welbog

+0

@Welbog: спасибо! Я полностью забыл об этом. Я изменил сценарий так, чтобы он только загружал .zip-файл. Конечно, он может быть расширен, так что он позволяет больше расширений, например .pdf или что-то еще. – Evert

+0

Это немного лучше, но он по-прежнему позволяет вам захватывать zip-файлы из других каталогов. Было бы лучше не использовать пользовательские идентификаторы в реальных путях. – Welbog

1

В обеих предусмотренных sollutions (ReadFile или заголовок X-Sendfile) файл может быть сохранен вне каталога общего сервера (обычно называемый HTDOCS или WWW).

//page.php 
<form method="get" action="download.php"> 
    With button <input type="submit" value="Download file" /> 
</form> 
or 
With link <a href="download.php">Download file</a> 


<?php // download.php 
$file = '/path/to/file.zip'; 

if (file_exists($file)) { 
    // send headers that indicate file download 
    header('Content-Description: File Transfer'); 
    header('Content-Type: application/octet-stream'); 
    header('Content-Disposition: attachment; filename='.basename($file)); 
    header('Content-Transfer-Encoding: binary'); 
    header('Content-Length: ' . filesize($file)); 
    ob_clean(); 
    flush(); 
    // send file (must read comments): http://php.net/manual/en/function.readfile.php 
    readfile($file); 
    exit; 
} 

Лучше гуманного, если ваш сервер поддерживает заголовок X-Sendfile (mod_xsendfile) является:

<?php 
header('Content-Disposition: attachment;filename=hello.txt'); 
header('X-Sendfile: /path/to/file.zip'); 

http://codeutopia.net/blog/2009/03/06/sending-files-better-apache-mod_xsendfile-and-php/