2016-05-26 11 views
1

私は、人々が自分のファイルをuploadsディレクトリにアップロードできるLaravel Webアプリケーションを持っています。 私は任意のファイルの種類と名前を許可しますが(単なる静的ファイルのアップロード/ダウンロード)それらを実行できないようにしたいので、私は.htaccessファイル作成:php_flagエンジンがオフになっている静的ファイルにアクセスできない

/public_html/uploads/.htaccess:

php_flag engine off 

しかし、保存されたファイル(例:/uploads/photo.jpg)にアクセスしようとすると、LaravelはNotFoundHttpExceptionとなります。 私は#を行の前に置くとファイルにアクセスできますが、その後はPHPスクリプトが実行されます。

そしてここにはLaravelのhtaccessのファイル

/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ヘッダーを使用します。 Laravelを使用して

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

、あなたはいつもの方法で構築使用することもできます。参考のために

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ファイルを常に実行します。 –

関連する問題