Хорошо, сначала извиниться, поскольку я понимаю, что это тема, которая была рассмотрена много раз раньше – поверь мне, я знаю, я прочитал все предыдущие вопросы и ответы и до сих пор не могу заставить это работать.
У меня есть папка, содержащая загружаемые файлы. В целях безопасности я нашел этот файл вне webroot. Однако, несмотря на все мои усилия, я не могу заставить свой php-скрипт загружать файл.
Я использую сервер VPS Apache Linux, используя Plesk 11.
Структура файла (упрощенная) выглядит следующим образом. Папка httpdocs
– это webroot. private/uploadedfiles
папку, где я хочу загрузить.
-var - www - vhosts - mydomain.org.uk - httpdocs (webroot) - private - uploadedfiles
Я использую jQuery ajax-вызов для передачи имени файла в PHP-скрипт под названием downloadscript.php
. Этот скрипт находится внутри httpdocs
узла httpdocs
. Сценарий выглядит следующим образом:
<?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
Я проверил, дважды проверял и triple проверял, и файл определенно существует внутри папки uploadedfiles
.
Я также проверял, что это не проблема ограничения open_basedir
– я уверен, что это не так.
Я уверен, что есть что-то очень простое, что мне не хватает – где я ошибаюсь?
В качестве дополнительной дополнительной, я еще не написал сценарий для загрузки файлов – есть ли что-нибудь, что я должен знать заранее, прежде чем продолжить это?
Благодаря!
Однажды у меня была эта проблема. Это не решение, а обходной путь для вас. То, что я сделал, – это загрузка моих файлов в папку tmp внутри webroot. Затем каждый час или день на сервере запускается задание cron (запланированное задание на Plesk), копируя все файлы из моей временной папки в другую папку вне webroot с помощью команды копирования linux.
Однако вы можете посмотреть здесь, что хотите:
Надеюсь, это может вам помочь.
После долгих проб и ошибок я, кажется, решил проблему.
Проблема заключалась в использовании jQuery / Ajax.
Когда я изменил способ обращения к файлу downloadscript.php
к прямому запросу $_GET
из ссылки на странице, это сработало.
В любом случае, спасибо за вашу помощь всем!
Крис