storePubliclyAs не сохраняется в общей папке

Я не знаю, может я что-то неправильно понял, но я вызываю следующий метод во время загрузки файла:

$cover->storePubliclyAs($coverAsset->dir, $coverAsset->preview_name);

$coverAsset->dir возвращает businesses/2, а $coverAsset->preview_name возвращает хешированное имя файла.

После загрузки я получаю файл по адресу: storage/app/businesses/1/pre-AxDMVlSN.jpeg

Я запутался, почему файл не сохраняется в storage/app/public/businesses/...? Я ожидаю, что «общедоступная» часть поместит его в общую папку структуры каталогов хранилища, предоставленную Laravel.

Я посмотрел на свою конфигурацию файловых систем:

'disks' => [

    'local' => [
        'driver' => 'local',
        'root' => storage_path('app'),
    ],

    'public' => [
        'driver' => 'local',
        'root' => storage_path('app/public'),
        'url' => env('APP_URL').'/storage',
        'visibility' => 'public',
    ],
    ...

Такое ощущение, что диск local используется вместо диска public? Как узнать, какой из них используется методом UploadedFile->storePubliclyAs?


person Patrick.SE    schedule 10.01.2018    source источник


Ответы (1)


Функция storePubliclyAs основана на этом: https://github.com/laravel/framework/blob/5.5/src/Illuminate/Http/UploadedFile.php#L61

Он просто устанавливает видимость файла в общедоступный, вопреки тому, что вы предполагали, что он будет перемещать/сохранять файл в общая папка.

Фактически выбрать диск, на котором вы хотите его сохранить. Просто используйте третий необязательный параметр storePubliclyAs, который является параметром $options.

Обратите внимание: если вы не выбрали диск (путем передачи параметра $options), Laravel будет использовать выбранный по умолчанию диск на основе вашего файла конфигурации filesystems.php.

Согласно тому, что я читал о коде, вы можете просто передать имя диска в качестве третьего параметра.

Итак, вместо этого:

$cover->storePubliclyAs($coverAsset->dir, $coverAsset->preview_name);

Используйте это (мы будем использовать public, так как вы хотите сохранить его на диске с именем public):

$cover->storePubliclyAs($coverAsset->dir, $coverAsset->preview_name, 'public');


Кроме того, взгляните на filesystems.php по умолчанию в Laravel: https://github.com/laravel/laravel/blob/master/config/filesystems.php#L16

Эта строка ищет запись FILESYSTEM_DRIVER в файле .env, однако, если она не нашла ее, она будет использовать второй параметр; по умолчанию это local.

Я думаю, что ваша конфигурация по умолчанию находится на диске local. Вы можете попытаться либо добавить FILESYSTEM_DRIVER=public в файл .env, либо изменить второй параметр в filesystems.php на public.

Пожалуйста, дайте мне знать, если есть какие-либо ошибки, так как я ничего не пробовал, я только что прочитал код.

Если вы хотите отследить код самостоятельно, вы можете посмотреть его здесь: https://github.com/laravel/framework/blob/5.5/src/Illuminate/Http/UploadedFile.php

person Wreigh    schedule 10.01.2018