Я строю систему управления проектами, где пользователи могут загружать вложения файлов в задачи. Эти вложения хранятся в каталоге 'storage / app / public / projects //'. Загрузка работает как надо, в нужную директорию под нужным ID.
Однако, когда я хочу скачать указанное вложение, файл не может быть найден. Я предоставил код из моих методов загрузки и загрузки, а также из своей «локальной» конфигурации драйвера.
Конфигурация драйвера:
'local' => [
'driver' => 'local',
'root' => storage_path('app/public'),
'url' => env('APP_URL').'storage'
],
Способ загрузки:
$sExt = $request->file('attachment')->getClientOriginalExtension();
$sHashedName = substr(
sha1(str_replace(' ', '', pathinfo($request->file('attachment')->getClientOriginalName(), PATHINFO_FILENAME))
), 0, 14);
if ( ! Storage::disk('local')->exists($sHashedName . '.' . $sExt)) {
$request->file('attachment')->storeAs(
'/projects/'.$oTask->project->id, $sHashedName . '.' . $sExt, 'local'
);
}
$oTask->attachments()->create([
'name' => $request->name,
'location' => $sHashedName . '.' . $sExt,
'user_id' => Auth::id()
]);
Текущий метод загрузки:
public function downloadAttachment(Project $project, Task $task, Attachment $attachment)
{
var_dump(rtrim(env('APP_URL'), '/') . public_path('/projects/' . $project->id . '/' . $attachment->location));
if (rtrim(env('APP_URL'), '/') . public_path('/projects/' . $project->id . '/' . $attachment->location)) {
return response()->download(rtrim(env('APP_URL'), '/') . public_path('/projects/' . $project->id . '/' . $attachment->location));
} else {
return $this->redirectWithAlert(
'error',
'download',
'attachment',
$attachment->name,
'/projects/'.$project->id.'/tasks/'.$task->id
);
}
}
Это была моя последняя попытка до публикации этого вопроса. Я также попробовал Storage::url('/projects/<project_id>/<filename>')
и ряд других вещей, но ничего не работает. Я связал каталог общего хранилища в соответствии с документами Laravel (с php artisan storage:link
). Я, наверное, упускаю что-то логичное здесь, но я полностью потерян.