Intereting Posts
Есть ли способ автоматически обновить AppKernel в symfony2? Memcached :: getStats не работает с Couchbase SPL против массива: когда следует использовать SPL и когда мы должны использовать Array в PHP? Кнопка регистрации / регистрации не работает (PHP AND AJAX) Как установить cookie в wordpress? Как я могу определить, называется ли функция статическим в PHP? php implode (101) с кавычками Проблемы с кодировкой символов PHP Как заставить класс загрузки файлов CodeIgniter принимать все расширения? Почему debug_backtrace () использует столько памяти? Циклический код с использованием PHP Получение ошибок «Команды не синхронизированы, вы не можете запустить команду сейчас» при выполнении хранимой процедуры в mysql / PHP Doctrine 2: невозможно обновить DateTime coloumn на SQL Server 2008apm Доступ к локальному приложению Laravel 5 локально с внешнего устройства Laravel, не отслеживайте маршруты с помощью `antonioribeiro / tracker`

Загрузка файлов вне веб-сайта

Хорошо, сначала извиниться, поскольку я понимаю, что это тема, которая была рассмотрена много раз раньше – поверь мне, я знаю, я прочитал все предыдущие вопросы и ответы и до сих пор не могу заставить это работать.

У меня есть папка, содержащая загружаемые файлы. В целях безопасности я нашел этот файл вне 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 – я уверен, что это не так.

Я уверен, что есть что-то очень простое, что мне не хватает – где я ошибаюсь?

В качестве дополнительной дополнительной, я еще не написал сценарий для загрузки файлов – есть ли что-нибудь, что я должен знать заранее, прежде чем продолжить это?

Благодаря!

Related of "Загрузка файлов вне веб-сайта"

Однажды у меня была эта проблема. Это не решение, а обходной путь для вас. То, что я сделал, – это загрузка моих файлов в папку tmp внутри webroot. Затем каждый час или день на сервере запускается задание cron (запланированное задание на Plesk), копируя все файлы из моей временной папки в другую папку вне webroot с помощью команды копирования linux.

Однако вы можете посмотреть здесь, что хотите:

  • как получить доступ к файлу из внешнего корневого каталога в php
  • Как я могу разрешить пользователю загружать файл, который хранится за пределами webroot?
  • PHP отображает / загружает файлы каталога за пределами корня веб-сервера
  • [RESOLVED] скачать zip из-за пределов сети

Надеюсь, это может вам помочь.

После долгих проб и ошибок я, кажется, решил проблему.

Проблема заключалась в использовании jQuery / Ajax.

Когда я изменил способ обращения к файлу downloadscript.php к прямому запросу $_GET из ссылки на странице, это сработало.

В любом случае, спасибо за вашу помощь всем!

Крис