版权声明:转载请注明博主地址 https://blog.csdn.net/weixin_43885417/article/details/85017991
我们写项目的时候,前台想要访问后台资源,一般直接是把public文件夹下的文件路径返回给前台。
但是,需要把一些重要的,对外不可见的私密文件,需要放到laravel的storage文件夹里。但是这个时候就需要,后台给前台获取后台资源的接口。让前台可以访问。
你会看到,我的代码里有判断,主要是为了避免前台请求不存在的资源。并且,我在后台把前台传来的请求资源路径,进行拆分。然后,下载资源,返回给前台。
第一个方法,是展示资源给用户,第二个方法,直接让用户直接下载到本地。
注意:文件路径,一定要是绝对路径
下面直接上代码:
<?php
namespace App\Http\Controllers\ScientificController;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
class AccessFileController extends Controller
{
/**请求laravel/storage/app/data/下的文件资源
* @param Request $request
* @return BinaryFileResponse
*/
public function showFile(Request $request){
$disk = $request->disk;
$subjection = $request->subjection;
//把传来的数据用'/'分割
$fileName = explode('/',$subjection);
if(count($fileName) != 2) return redirect('showemptyview');
//取出文件的名字
$fileName = $fileName[1];
//判断请求的文件是否存在
if(!file_exists(storage_path('app/data/'.$disk.'/'.$subjection))){
//返回给用户空资源的视图
return redirect('showemptyview');
}
$temp_path = tempnam(sys_get_temp_dir(), $fileName);
file_put_contents($temp_path, Storage::disk($disk)->get($subjection));
$downResponse = new BinaryFileResponse($temp_path);
return $downResponse;
}
/**从Storage文件下,下载文件
* @param Request $request
* @return BinaryFileResponse
*/
public function downloadFile(Request $request){
//拼接自己文件的绝对路径
$file = 'app/data/'.$request->file;
//判断文件是否存在
if(!file_exists(storage_path($file))) return redirect('showemptyview');
return response()->download(storage_path($file));
}
}