如何在Laravel 8的ApplicationB中以Laravel风格访问ApplicationA存储文件
实现方案
方案1:让ApplicationB直接挂载ApplicationA的存储磁盘
在ApplicationB的config/filesystems.php中添加新的磁盘配置,直接指向ApplicationA的目标存储目录:
'repository' => [ 'driver' => 'local', // 替换为ApplicationA的repository目录绝对路径,根据实际服务器路径调整 'root' => '/var/www/mywebsite/applicationA/storage/app/repository', 'visibility' => 'public', ],
- 确保ApplicationB的运行用户(如
www-data)拥有读取ApplicationA该目录的权限 - 在ApplicationB中可通过
Storage::disk('repository')调用文件操作方法,比如获取文件内容:Storage::disk('repository')->get('demo.jpg') - 若要通过Web直接访问文件,可在ApplicationB的public目录下创建软链接指向ApplicationA的repository目录:
ln -s /var/www/mywebsite/applicationA/storage/app/repository /var/www/mywebsite/applicationB/public/repository
之后就能通过http://your-b-domain/repository/demo.jpg直接访问文件。
方案2:在ApplicationA中提供文件访问API
利用Laravel的路由与响应能力,在ApplicationA中开放文件访问接口:
- 在ApplicationA的
routes/api.php中添加路由:
use Illuminate\Support\Facades\Storage; Route::get('/files/{filename}', function ($filename) { if (!Storage::disk('repository')->exists($filename)) { abort(404); } // 返回文件响应,浏览器会自动处理预览或下载逻辑 return Storage::disk('repository')->response($filename); })->name('file.access');
- 如需权限控制,可添加认证中间件(如
auth:sanctum)限制访问:
Route::get('/files/{filename}', function ($filename) { // 同上逻辑 })->middleware('auth:sanctum')->name('file.access');
- 在ApplicationB中,可通过Laravel自带的Http客户端获取文件,或直接拼接URL给前端使用:
// 获取文件内容 $fileContent = Http::get('http://your-a-domain/api/files/demo.jpg')->body(); // 生成前端可直接访问的URL $fileUrl = 'http://your-a-domain/api/files/demo.jpg';
方案3:共享统一存储目录
将文件存储到两个项目都能访问的公共目录,替代各自的私有存储:
- 在服务器上创建共享目录,比如
/var/www/shared/repository,并设置好权限(ApplicationA需读写权限,ApplicationB至少需读权限) - 修改ApplicationA的
config/filesystems.php中repository磁盘配置:
'repository' => [ 'driver' => 'local', 'root' => '/var/www/shared/repository', 'visibility' => 'public', ],
- 在ApplicationB的
config/filesystems.php中添加完全相同的磁盘配置 - 可任选一个项目的public目录创建软链接到共享目录,实现Web直接访问
内容的提问来源于stack exchange,提问作者Switch88
相关产品推荐
相关产品推荐

