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