У меня есть приложение Laravel.
По пути есть хранилище: \storage\app\reports\
Я попытался получить файл через URL-адрес GET, например:
http://localhost:8000/storage/app/reports/report_27-05-19_05.xlsx
Но это не работает для меня.
Также я попытался вернуть файл на стороне сервера:
$file = File::get(storage_path($path.$filename));
$type = File::mimeType($path.$filename);
$response = Response::make($file, 200);
$response->header("Content-Type", $type);
return $response;
Откройте файл system.php в папке конфигурации.
'reports' => [
'driver' => 'local',
'root' => storage_path('app/reports'),
'url' => env('APP_URL').'/storage/app/reports',
'visibility' => 'public',
],
добавьте это в дисковый массив.
Ведь симлинк наверное работает. Никогда не пробовал, но может сработать. Попробуйте.
Как хранить и получать?
Так? ` Storage::disk('reports')->put($path.$filename, $content);` ?
например, в блейд-файлах вы можете вызывать как => reports($file->filename) И да, Storage::disk('reports') можно назначить связанной папке.
Как получить файл по пути? \storage\app\reports\file.xml
?
да, 'url' => env('APP_URL').'/storage/app/reports' Вы можете изменить здесь то, что хотите.
Когда я передаю этот URL-адрес в браузер, он пытается применить маршрут
Попробуйте что-нибудь вроде этого.
Следующий пример относится к CSV-файлу, хранящемуся на виртуальном хостинге.
$filename
— имя сохраненного файла, который будет передан с get
запросом
public function download($filename)
{
$name = $filename;
$file = $file = '/home/USERNAME/storage/report/'.$name;
$header = array(
'Content-Type' => 'application/csv',
'Content-Disposition' => 'attachment',
'Content-lenght' => filesize($file),
'filename' => $name,
);
// auth code
return Response::download($file, $name, $header);
}
Использование абсолютных путей к каталогу — плохая практика + Content-Type
заставляет файл обслуживаться как application/csv
. Также нет необходимости отправлять эти дополнительные заголовки. связь
Да, я знаю, что это плохая практика. Я не смог скачать свой файл, не используя его на виртуальном хостинге. Кроме того, я хотел загружать только csv, когда пользователь вошел в систему. Вот почему я разместил здесь свой старый код. Он был закодирован на Laravel 5.4.
Ваши файлы находятся не в той папке, если вы хотите, чтобы они были общедоступны (без контроллера).
Если вы хотите, чтобы ваши файлы были общедоступными.
storage/app/public
, запустите php artisan storage:link
. Это будет символической ссылкой storage/app/public
на public/storage
. Теперь ваши файлы будут общедоступны на http://localhost:8000/storage/report_27-05-19_05.xlsx
Вы также можете использовать Laravel/PHP для обслуживания файла через ваш контроллер.
$filename = "Example.docx";
return response()->download(storage_path("app/reports/{$fileName}"));
Да, это работает, но я получаю бинарный файл в ответной сети вместо загрузки файла
Могу ли я получить двоичный ответ в клиенте и открыть его в новом окне с помощью js?
@OPV Если вы получаете двоичный поток вместо загрузки файла, это означает, что что-то не так с конфигурацией вашего веб-сервера. Laravel уже установил правильные заголовки по умолчанию при использовании ответа, функции загрузки.
И как его использовать?