Laravel 5.7: 404 или 403 для хранилища / приложения / частного, тогда как он работает для хранилища / приложения / общего доступа - PullRequest
0 голосов
/ 22 ноября 2018

Я изо всех сил пытаюсь предложить пользователю ссылку на файл, который он может загрузить при входе в систему. Я прочитал this и , что (потому что в конечном итоге я хочу защитить файл от публичного доступа).

Итак, в папке app / storage я создал «приватный» каталог рядом с «public».Внутри него есть подпапка «A», содержащая «fileA.tar.gz» (я также попытался с простым test.txt без удачи).

MyLaravelApp/
├── storage/
│   ├── public/
│   ├── private/
│        └── A/
│            └──fileA.tar.gz 

В моем контроллере я делаю:

$softwarePath = "private/A/fileA.tar.gz";

$urlToArchive = \Storage::disk('local')->url(
                                $softwarePath);

$exists = \Storage::disk('local')->exists($softwarePath); // returns true

Но в представлении, когда я нажимаю на ссылку http://127.0.0.1:8000/storage/private/A/fileA.tar.gz, я получаю 404, хотя функция exists возвращает true.

Поэтому я попытался определить в / config / filesystems.php прямой «ярлык» к моей «личной» папке:

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

и внес следующие изменения в контроллер:

$softwarePath = "A/fileA.tar.gz";

$urlToArchive = \Storage::disk('private')->url($softwarePath);

$exists = \Storage::disk('private')->exists($softwarePath); // keeps returning true

Но теперь я получаю 403, когда нажимаюпо сгенерированной ссылке http://localhost/privateDownload/A/fileA.tar.gz (обратите внимание на localhost без адреса порта) и если я изменю адрес на localhost: 8000, я получу обратно 404.

Маршрут к вышеупомянутому контроллеру:

Route::get('/account', 'AccountController@showAccountDetails')->middleware('auth');

И я также безуспешно пытался удалить middleware('auth') и доступ к private/A/fileA.tar.gz (404).

Обратите внимание: если я сохраню ту же иерархию подкаталогов и перенесу ее в открытый доступ, как:

MyLaravelApp/
├── storage/
│   ├── public/
│        └── A/
│            └──fileA.tar.gz 
│   ├── private/

Нет проблем, и файл можно загрузить.Это не интересно, потому что я хочу предотвратить загрузку этого файла без входа в систему.

В соответствии с doc и другими ответами SO, возможно, есть доступ к каталогу, отличному от public.Как это можно сделать?Почему exists() возвращает true, тогда как я получаю 404?Какова моя ошибка установки / кода?

Любая помощь приветствуется!

Решение

Основываясь на ответе @ Namoshek, вот что я сделал (длязаписи):

В вышеупомянутом контроллере я просто проверил, имеет ли пользователь право загружать файл A.Если это так, то я возвращаю представление, которое имеет ссылку на маршрут с именем downloadFileA, который указывает на функцию downloadFileA, все еще в том же вышеупомянутом контроллере.

Наконец, в функции downloadFileA я возвращаю \Storage::disk('private')->download('fileA') после проверки, имеет ли пользователь право на скачивание файла.Поэтому я проверяю дважды, но это не проблема, потому что трафик очень низкий (раз в неделю или около того).

1 Ответ

0 голосов
/ 22 ноября 2018

Вы можете использовать Storage::download('filename.xyz') вместо генерации URL с Storage::url('filename.xyu').Это отправит файл как содержание ответа.Это может быть ресурсоемким для больших файлов, хотя.

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