Мне нужно загрузить несколько файлов для каждого пользователя, и эти файлы не должны быть общедоступными.
Когда пользователь создается, я создаю папку в каталоге хранилища, используя:
Storage::makeDirectory($user->ref_id);
Теперь у меня есть таблица файлов, в которой хранятся сведения о файлах. Вот код для загрузки файла и сохранения пути к базе данных.
$this->validate($request, [
'file' => 'required|mimetypes:image/png,image/jpeg,application/pdf',
]);
$user = Auth::user();
$filename = time() . '.' . $request->file->getClientOriginalExtension();
$path = $request->file('file')->storeAs($user->ref_id, $filename);
$user->files()->create(['file_name' => $path]);
Файл успешно сохраняется. Теперь, когда пользователь входит в систему, я хочу отобразить предварительный просмотр этого файла в представлении.
Любая помощь, как я могу это сделать?
По-прежнему не удается получить доступ к файлам, файл в настоящее время хранится в папке storage / app / {user-> ref_id}.
Покажите, как вы получаете доступ к файлам
<embed name = "plugin" src = "{{asset ($ file-> file_name)}}" type = "application / pdf">, src заменяется на [{{Storage :: get ($ file-> file_name)}}], [{{Storage :: url ($ file-> file_name)}}], [{{storage_path ($ file-> file_name)}}], [{{asset ('app /'.$ файл-> имя_файла)}}] и т. д.
попробуйте {{asset('app/public/'.$file->file_name)}}
Уже пробовал и не работает, результат - localhost / rupyz / public / app / public / STPF1807001 / 1532075487.pdf
удалите первую общедоступную, затем попробуйте еще раз
Все еще не работает. Это доступно для просмотра ??
да, вы можете получить прямой доступ к нему в поле зрения
Но он все еще недоступен для меня, я жестко запрограммировал это - «локальный / rupyz / хранилище / приложение / STPF1807001 / 1532075487.pdf», и к файлам осуществляется доступ.
нужно использовать file_get_content($file_path), используйте результат в src






Вот как вы обслуживаете файл с контроллера. Вместо того, чтобы возвращать представление, вы возвращаете файл следующим образом. В случае изображения вы не можете отобразить его напрямую в представлении, если вы не закодируете его base64 (что увеличивает размер файла).
return response()
->download($file_path, "file_name",
[
'Content-Type' => 'application/octet-stream'
]);
Создайте в своем контроллере функцию, содержащую приведенный выше код и некоторую логику для получения правильного пути к файлу и создания маршрута для него. После того, как вы это сделаете, вы можете (например) добавить в свое представление
<img src = "{{route('ROUTE_NAME')}}">
Разумеется, вам придется заполнить все переменные самостоятельно.
При использовании этого метода файлы всегда будут оставаться конфиденциальными и будут отображаться только после того, как вы предоставите пользователю доступ. Обратите внимание, что это БУДЕТ использовать больше ресурсов, поскольку вы позволяете PHP обрабатывать файл вместо apache. Надеюсь это поможет!
Какой будет путь к файлу ??
пытается с storage_path ('app /'. $ folder. '/'. $ name);, но не показывает предварительный просмотр. При прямом доступе к ссылке начинается загрузка файла без расширения.
Content-Type содержит Mimetype файла, когда это октет-поток, он инициирует загрузку. Вы можете узнать настоящий тип пантомимы, позвонив в mime_content_type($file_path).
Это решило мою проблему ...
https://stackoverflow.com/a/41322072/6792282
Я использовал это в своем коде, и предварительный просмотр отлично работает с файлами PDF.
<embed name = "plugin" src = "{{url('/')}}/{{ Storage::disk('local')->url($file->file_name)}}" type = "application/pdf">
запустить
php artisan storage:link