У меня есть файл, который пользователи будут покупать через paypal, clickbank и paydotcom. Мне нужно разместить страницу загрузки файла на моем сервере.
Я поместил файл в каталог за пределами моей папки public_html. Папка находится на том же уровне, что и public_html и называется «загрузка», например.
Предполагается, что этот сценарий должен сделать это, но у меня есть две проблемы с ним …
1) Это не кажется слишком надежным. просто проверьте токен подтверждения платежа на querystring?
2) Я не могу переменную $ path указывать на папку загрузки, не включая мою общую папку site.com в пути. Например, когда я возвращаю $ path, я получаю
/home/myuser/public_html/mysite.com
Но мне нужно, чтобы
/home/myuser/download/myprotectedfile.zip
Я уверен, что есть более безопасный или умный способ сделать это, поэтому я спрашиваю …
<?php // place this code inside a php file and call it fe "download.php" $path = $_SERVER['DOCUMENT_ROOT']."/path2file/"; // change the path to fit your websites document structure $fullPath = $path.$_GET['download_file']; if ($fd = fopen ($fullPath, "r")) { $fsize = filesize($fullPath); $path_parts = pathinfo($fullPath); $ext = strtolower($path_parts["extension"]); switch ($ext) { case "pdf": header("Content-type: application/pdf"); // add here more headers for diff. extensions header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\""); // use 'attachment' to force a download break; default; header("Content-type: application/octet-stream"); header("Content-Disposition: filename=\"".$path_parts["basename"]."\""); } header("Content-length: $fsize"); header("Cache-control: private"); //use this to open files directly while(!feof($fd)) { $buffer = fread($fd, 2048); echo $buffer; } } fclose ($fd); exit; // example: place this kind of link into the document where the file download is offered: // <a href="download.php?download_file=some_file.pdf">Download here</a> ?>
Проблема, с которой я столкнулась, заключается в том, что значение $ path включает мою ссылку на site.com, но каталог загрузки находится за пределами site.com. Мне нужно получить ссылку на уровень, чтобы указать на каталог, в котором хранится файл загрузки.
Кроме того, как я уже говорил ранее, я не уверен, как это сделать (кроме проверки ожидаемого значения querystring таким образом, чтобы это было безопасно)
Заранее спасибо!
Вы можете использовать ярлык родительского каталога ../
в вашей $path
или функции dirname
например:
$parent_dir = dirname( dirname( __FILE__ ) ); // first dirname is the directory of this file, second goes up one level, etc.
BTW, остерегайтесь указания пути в вашем URL-адресе, можно было бы прочитать другие файлы (например, файлы конфигурации или личные файлы ohter), изменив его на download.php?download_file=../../private/bank_certificate.pem
. Вы должны использовать realpath
чтобы получить абсолютный путь к файлу и сравнить его с списком файлов «Разрешенные для загрузки».
Вам просто нужно рассмотреть путь, как обычный путь к каталогу, а не веб-интерфейс. поэтому подниматься на уровень просто «../», например
если вы структурируете, как это
/path2file/inhere.pdf /public_html/download.php
путь к файлу будет просто из download.php "../path2file/inhere.pdf"
хорошо, если public_html
является вашим корнем вашего doc, тогда вы должны иметь возможность получить путь для загрузки, будет
realpath($_SERVER[DOCUMENT_ROOT].'/../download');
В настоящее время пользовательское кодирование не может быть лучшим решением для сценария загрузки файлов. Посмотрите Drupal, у которого есть модули загрузки файлов, которые также могут быть интегрированы с его модулем Clickbank: http://drupal.org/project/clickbank_ipn