Хорошо, во-первых, я прошу прощения, поскольку я понимаю, что это тема, которая была рассмотрена много раз прежде — поверьте мне, я знаю, я прочитал все предыдущие вопросы и ответы и до сих пор не могу заставить это работать.
У меня есть папка, содержащая загружаемые файлы. В целях безопасности я разместил этот файл за пределами webroot. Однако, несмотря на все мои усилия, я не могу заставить свой php-скрипт загрузить файл.
Я использую Linux VPS Apache Server с использованием Plesk 11.
(Упрощенная) файловая структура выглядит следующим образом. httpdocs
папка — это рут. private/uploadedfiles
папка, из которой я хочу скачать.
-var
- www
- vhosts
- mydomain.org.uk
- httpdocs (webroot)
- private
- uploadedfiles
Я использую jQuery-вызов ajax, чтобы передать имя файла в скрипт PHP с именем downloadscript.php
, Этот скрипт находится внутри httpdocs
Webroot. Сценарий выглядит следующим образом:
<?php
$filename = $_POST['fbpath'];
$path = '/var/www/vhosts/mydomain.org.uk/private/uploadedfiles/' . $filename;
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($path));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($path));
ob_clean();
flush();
readfile($path);
exit;
?>
Вызов ajax работает без проблем, но я получаю следующее сообщение об ошибке в моих журналах PHP:
PHP Warning: readfile(/var/www/vhosts/mydomain.org.uk/private/uploadedfiles/filename.docx): failed to open stream: No such file or directory
Я проверил, дважды проверил и трижды проверил, и файл определенно существует внутри uploadedfiles
папка.
Я также проверил, что это не open_basedir
проблема ограничения — я почти уверен, что это не так.
Я уверен, что есть кое-что действительно простое, что я пропускаю — где я иду не так?
В качестве дополнительного дополнения, я еще не написал сценарий для загрузки файлов — есть ли что-то, что я должен знать заранее, прежде чем продолжить это?
Спасибо!
У меня была эта проблема однажды. На самом деле это не решение, а обходной путь для вас. Я загружал свои файлы в папку tmp внутри webroot. Затем каждый час или день на сервере запускается задание cron (запланированное задание в Plesk), копирующее все файлы из моей временной папки в другую папку вне webroot с помощью команды linux copy.
Тем не менее, вы можете посмотреть здесь, что вы хотите:
Надеюсь, это поможет вам.
После долгих проб и ошибок я, кажется, решил проблему.
Проблема заключалась в использовании jQuery / Ajax.
Когда я изменил способ downloadscript.php
доступ к файлу напрямую $_GET
Запрос по ссылке на странице, это работало удовольствие.
В любом случае, спасибо всем за помощь!
Крис