2016-05-26 1 views
1

У меня есть веб-приложение Laravel, которое позволяет людям загружать свои файлы в каталог uploads. Я хочу, чтобы любые типы файлов и имен, но запретить их выполнение (только статический файл загрузки/выгрузки), поэтому я создал .htaccess файл:Не удается получить доступ к статическим файлам, где php_flag engine выключен

/public_html/uploads/.htaccess:

php_flag engine off 

Но когда Я пытаюсь получить доступ к сохраненным файлам (например, /uploads/photo.jpg), Laravel - с NotFoundHttpException. Если я поместил # перед строкой, я могу получить доступ к файлам, но затем выполняются скрипты php.

А вот файл Htaccess в Laravel в

/public_html/uploads/.htaccess:

<IfModule mod_rewrite.c> 
    <IfModule mod_negotiation.c> 
     Options -MultiViews 
    </IfModule> 

    RewriteEngine On 

    # Redirect Trailing Slashes If Not A Folder... 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteRule ^(.*)/$ /$1 [L,R=301] 

    # Handle Front Controller... 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteRule^index.php [L] 

    # Handle Authorization Header 
    RewriteCond %{HTTP:Authorization} . 
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] 
</IfModule> 

ответ

0

Вы можете использовать file_get_contents($filename), чтобы получить содержимое файла, а затем отправить файл в качестве прямого статического скачивания используя заголовок application\octect-stream.

$fileContent = file_get_contents($fullPathToFile); 
header('Content-Type: application/octet-stream'); 
echo $fileContent; 

Использование Laravel, вы всегда можете использовать встроенный метод:

https://laravel.com/docs/master/responses#file-downloads

Справочно:

$name = 'theFileName.txt'; 
// You can override the name of the downloaded file 

$headers = ['Content-Type'=>'application/octet-stream',]; 
// Sends a header saying the type is binary and should be accepted as such 

// Fires off PSR-7 compatible response from Laravel 
return response()->download($pathToFile, $name, $headers); 

Я надеюсь, что это помогает!

+0

Спасибо, не добавляет ли он дополнительные накладные расходы на сервере? потому что процесс php должен продолжать работать, пока клиент не получит последний бит. А также на больших файлах максимальное время выполнения php может быть недостаточным – Webinan

+0

Хотя то, что вы говорите, является истинным @Webinan, вы можете использовать 'set_time_limit (int)' вокруг области с требуемой функциональностью. Накладные расходы на отправку файла минимальны с помощью встроенного помощника Laravel. Apache всегда будет выполнять PHP-файлы, которые запрашиваются через него, если PHP не отключен, или вы отправляете файл в виде двоичного содержимого после первого чтения содержимого файла в буфер. –

Смежные вопросы