#php #laravel #file #video #download
Вопрос:
У меня есть 3 сервера: 1 для api, 1 для контента, 1 для интерфейса. Я хочу загрузить видеофайл mp4, когда я нажимаю на интерфейс. Основной поток — кнопка интерфейса нажмите, чтобы загрузить, затем вызовите api и в api загрузите файл. Вот то, что я уже пробовал-
Внешний интерфейс
<a role="button" class="btn btn-hover iq-button iq-btn-sm" download href="{{config('app.base_api_url').'/downloadAFile?url='.getsinglecontentvideobaseurl().$video->filename.'.'.$video->filetype.'amp;filetype=video/'.$video->filetype.'amp;filename='.$video->filename.'.'.$video->filetype.'"'}}">
Download
</a>
API
public function downloadAFile(Request $request)
{
$url = $request->url ?? '';
$filename = $request->filename ?? 'download.mp4';
$filetype = $request->filetype ?? 'video/mp4';
$file = $url;
$headers = array('Content-Type: '.$filetype);
return Response::download($file, $filename, $headers);
}
Когда я нажимаю «Загрузить», появляется эта ошибка-
SymfonyComponentHttpFoundationFileExceptionFileNotFoundException
Комментарии:
1. «Вот то, что я уже пробовал» — и? Что случилось? Какая проблема все еще нуждается в решении?
Ответ №1:
Этот код api работает только $url является внешним онлайн-сервером. Иначе это не сработает. Имя файла не может содержать пробел epmpty.
public function downloadAFile(Request $request)
{
ini_set('max_execution_time', 600);
$url = $request->url ?? '';
$filename = $request->filename ?? 'download.mp4';
$tempImage = tempnam(sys_get_temp_dir(), $filename);
copy($url, $tempImage);
return response()->download($tempImage, $filename);
}