Laravel 5.5: Загрузка файла FileNotFoundException? - PullRequest
0 голосов
/ 04 мая 2018

Я строю систему управления проектами, где пользователи могут загружать вложения файлов в задачи. Эти вложения хранятся в каталоге '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). Я, наверное, упускаю что-то логичное здесь, но я полностью потерян.

1 Ответ

0 голосов
/ 04 мая 2018

Функция public_path ссылается на ./public/, а не на диск «public», который можно найти в ./storage/app/public/

Один из способов решения этой проблемы - заменить public_path('/projects/' на storage_path('app/public/projects/'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...