#php #laravel #web-services #laravel-5 #laravel-4
#php #laravel #веб-сервисы #laravel-5 #laravel-4
Вопрос:
Мне было интересно, есть ли способ принудительно отправлять запросы пользователя на маршрут в приложении laravel, чтобы получить ответ на загрузку внешнего файла с этого маршрута, и если имя файла — name.type, он будет загружен в пользовательскую систему как customname.type
например,
это маршрут в web.php
Route::get('/testurl',function(){
//then some have here by some magic it will force the user to download file on an external server on the web and change the original name of the file when a user downloads it
});
Я знаю, что это сложная работа.
хорошо, любой эксперт и любой из вас, ребята, может мне помочь? и если это делается какой-либо техникой вне фреймворка (в моем случае laravel), я буду благодарен дать мне несколько советов. спасибо вам всем
Ответ №1:
В этом случае вы можете использовать
Вариант 1:
Функция streamDownload() из потоковых загрузок laravel
Route::get('/testurl',function(){
return response()->streamDownload(function () {
echo file_get_contents('google/images/125426ds2s.jpg');
}, 'pic1.jpg');
});
Однако имейте в виду, что это считывает весь файл из внешнего источника в память, и поэтому может быть не очень хорошей идеей, и в этом случае используйте второй вариант:
Вариант 2
// Fetch the file from the external path
$contents = file_get_contents('google/images/125426ds2s.jpg');
// Save the contents to disc
Storage::disk('local')->put('125426ds2s.jpg', $contents);
// Get the file path within you local filesystem
$path = Storage::url('125426ds2s.jpg');
// Use laravel's download() helper to fetch the file
return response()->download($path, 'pic1.jpg', $headers);
Вариант 3
// redirect the user to the absolute url of the file
return Redirect::to('google/images/125426ds2s.jpg');
Комментарии:
1. tanks.but public_path() получает имя файла на веб-сайте моего сервера в общей папке проекта laravel. но я хочу, чтобы пользователь загружал файлы с моего веб-сайта (например, URL-адрес изображения в Google), но с именем, которое я выбрал. допустим, пользователь отправляет запрос get на мой веб-сайт, например, mywebsite / externaldownload , но он загружает изображение в Google images с URL: google/images/125426ds2s.jpg но с именем, которое я выбираю (вместо 1245…. он будет загружен на диск пользователя как pic1.jpg ) для загрузки пользователем.
2. Я отредактировал свой ответ, чтобы включить извлечение содержимого и загрузку на стороне клиента
3. хорошо, насколько я понимаю, streamDownload загружает файл на мой сервер, а затем создает ссылку на него для моего клиента. но я не хочу загружать файл на мой сервер, потому что, поскольку размер файла становится больше, например, 5 гигабайт или более, пользователь должен дождаться первой загрузки файла на мой сайт, а затем может загрузить, и это так плохо для пользователя и трафика на моем website.is есть какой-либо способ изменить имя файла без предварительной загрузки его на мой сервер? спасибо
4. Первый вариант не сохраняет файл на диск, а скорее сохраняет его в памяти, вместо сохранения на вашем диске, и удаляет его из памяти, как только он отправляется клиенту. Но вы можете либо сохранить на свой диск, как во втором варианте, либо загрузить весь файл в память, как в первом варианте. Единственный другой вариант, который я вижу здесь, — это указать непосредственно на ресурс, который вы хотите, чтобы они загрузили, как в третьем варианте, который я предоставил.