У меня есть область загрузки для моих клиентов, файлы которой должны быть личными, а не общедоступными. Как я могу получить эти файлы для предварительного просмотра в приложении из-за того, что они не являются общедоступными? Есть ли другой способ получить его прямо с сервера?






Да, вы можете обслуживать файлы, не делая их общедоступными.
Основная идея состоит в том, что вы добавляете маршрут, который авторизует запрос, а затем обслуживает файл.
Например:
Route::get('files/{file}', function () {
// authorize the request here
return response()->file();
});
Есть много встроенных способов обслуживания файлов. Вот четыре, на которые я бы порекомендовал посмотреть:
// For files on the local filesystem:
response()->file()
response()->download()
// For files that may be in an external storage system (SFTP, etc.)
Storage::response()
Storage::download()
Для файлов, хранящихся во внешней системе (например, Amazon S3), которая поддерживает временные URL-адреса, иногда лучше сгенерировать URL-адрес для файла, чем обслуживать его непосредственно из вашего приложения. Обычно это можно сделать с помощью Storage::temporaryUrl().
Если вы работаете с изображениями:
Route::get('/file/download', function() {
// get your filepath
$filepath = 'path/to/image/image.png';
return Response::download($filepath);
});
Тогда, на ваш взгляд:
<img src = "{{url('/file/download')}}" class = "rounded-circle" />
Для любого другого файла:
Route::get('/file/download', function() {
// get your filepath
$filepath = 'path/to/file/essay.docx';
return Response::download($filepath);
});
Ваше мнение:
<a href = "{{url('/file/download/')}}">Download</a>
При желании вы можете использовать контроллер:
namespace MyNamespace;
use Illuminate\Routing\Controller;
class FilesController extends Controller
{
public function downloadFile()
{
// get your filepath
$filepath = 'path/to/file/essay.docx';
return Response::download($filepath);
}
}
Тогда ваше определение маршрута будет выглядеть так:
Route::get('/file/download', ['as' => 'file.download', 'uses' => 'MyNamespace\FilesController@downloadFile']);
И ваш взгляд:
<a href = "{{route('file.download')}}">Download</a>
хранить вне webroot, обслуживать скриптом.