Скачивание файла php curl
Скачивание файлов с сайтов при помощи PHP и CURL
CURL является отличным инструментом, для подключения к удаленным сайтам, что упрощает возможность отправки форм, загрузку целых страниц, или, как в нашем случае, загрузку файлов.
CURL является отличным инструментом, для подключения к удаленным сайтам, что упрощает возможность отправки форм, загрузку целых страниц, или, как в нашем случае, загрузку файлов. В этом сниппете я покажу вам, как вы можете скачать файл прямо на диск с помощью CURL.
Примечание: чтобы упростить пример, в этой статье мы не будем выполнять проверку CURL запросов на ошибки. Вы же всегда должны делать это, функция curl_getinfo() главное подспорье в этом деле.
Вы можете прочитать ответ и записать его на диск, как показано в следующем листинге. $path место на сервере, где вы хотите, чтобы записать файл.
Существует, однако, проблема с этим кодом. В данном примере, файл пишеться на диск не напрямую, а сперва целиком загружается в оперативную память. Я думаю здесь понятно, что можно запросто умереться в предел памяти для исполнения скрипта и схлопотать fatal error. Так что данный способ годиться если вы скачиваете маленькие файлы, мегабайт до 20-30.
Примечание: Даже если ваш лимит памяти установлен очень высоко, грузить сервер лишний раз тоже не хорошо.
В таком случае опять возложим всю черную работу на CURL и заставим его писать данные прямо в файловый поток. Сделать это можно с помощью директивы CURLOPT_FILE.
Для этого вы должны сначала создать новый указатель файла с помощью fореn(). Далее мы передаем этот указатель на файл для выполнения запроса. Наконец, мы закрываем файл.
Вот и все, что нужно сделать, теперь можно не бояться о превышение лимита памяти для исполнения скрипта.
Многопоточное скачивание в cURL на PHP
В данном топике представлена на мой взгляд удобная и функциональная реализация многопоточного скачивания на cURL для PHP. Возможно кому-то она будет полезна, а мне принесёт инвайт 😉
Скачиванием через cURL не пользовался пусть даже из интереса только ленивый. Будь-то из консоли, либо реализуя код на каком-либо ЯП. Решения блокирующего скачивания одной ссылки валяются на каждом углу сети, к примеру на php.net. Однако, если рассматривать реализации на PHP, то такой подход подчас не подходит ввиду высоких временных затрат на вспомогательные операции ( dns lookup, request waiting и подобные ). Для скачивания большого числа страниц последовательный вариант не приемлем. Если устраивает — дальше можно не читать 🙂
В Perl, к примеру, можно применять fork() либо нити (use threads) для распараллеливания однопоточных скачиваний. Это не считая богатых возможностей библиотек данного языка. Я лично применял нити и LWP. Однако, речь идёт о PHP, и тут с распараллеливанием большие проблемы ввиду отсутствия данной возможности в принципе. Если кто знает, как создавать нити, сообщите, но я не нашел пока достойных решений. Да, в cURL есть функции curl_multi_*, но вот примеры реализаций на их основе меня не устроили. И, в итоге, решил собрать свой велосипед.
Первоначально отсылаю к простейшему примеру из офф. справочника. Позволю себе привести его тут 🙂
// create both cURL resources
$ch1 = curl_init ();
$ch2 = curl_init ();
// set URL and other appropriate options
//create the multiple cURL handle
$mh = curl_multi_init ();
// тут какая-то обработка текста страницы
Вот такая функция. Еще можно было бы написать про работу с куками и POST-запросами, но это уж если получу инвайт. И так понаписал много, многие ли осилили? 😉
Downloading a large file using curl
I need to download remote file using curl.
Here’s the sample code I have:
But it can’t handle big files, because it reads to memory first.
Is it possible to stream the file directly to disk?
5 Answers 5
yes you dont need the fwrite
I use this handy function:
By downloading it with a 4094 byte step it will not full your memory
You can then check if everything is ok with:
Find below code if you want to download the contents of the specified URL also want to saves it to a file.
If you want to downloads file from the FTP server you can use php FTP extension. Please find below code:
when curl is used to download a large file then CURLOPT_TIMEOUT is the main option you have to set for.
CURLOPT_RETURNTRANSFER has to be true in case you are getting file like pdf/csv/image etc.
You may find the further detail over here(correct url) Curl Doc
You can use this function, which creates a tempfile in the filesystem and returns the path to the downloaded file if everything worked fine:
Not the answer you’re looking for? Browse other questions tagged php curl download or ask your own question.
Linked
Related
Hot Network Questions
Subscribe to RSS
To subscribe to this RSS feed, copy and paste this URL into your RSS reader.
site design / logo © 2021 Stack Exchange Inc; user contributions licensed under cc by-sa. rev 2021.9.17.40238
By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.
Скачивание файла с помощью CURL
Доброго дня. Пытаюсь при помощи curl и библиотеки simple html dom скачать файл со страницы сайта nnm-club.me. С авторизацией и получением целевой страницы проблем не возникло, сделал это с помощью следующего кода:
Далее нахожу на странице ссылку вида «домен/forum/download.php?id=766709», и вот как раз по ней хочу скачать файл. Запуск нового сеанса curl по данному адресу с настройкой CURLOPT_FILE не дает должного результата, поскольку, если я всё правильно понимаю, там происходит несколько редиректов и присваивание каких-то дополнительных ID. Мой скудный опыт работы с curl и в целом с php не позволяет мне более грамотно изложить проблему.
1 ответ 1
У меня был подобный вопрос когда-то. Можно после загрузки первой страницы, парсить с помощью RegExp полученную страницу вместе с хедером curl_setopt($ch,CURLOPT_HEADER,true); выбирать оттуда referer и т.д., Так же можно в браузере посмотреть, через например, FireBug(Firefox) Какие заголовки добавляет и что отправляет серверу для скачивания. И потом выбирать эти данные с помощью CURL и добавлять их к Запросу на скачивание. Тоесть, грубо говоря, получил данные с первой страницы, отпарсил например регекспами, нашёл линк нужный добавил новые заголовки, вызвал CURL, получил опять заголовки отпарсил, вызвал уже CURL для файла. Сохранил, в твоем случае нужно CURL вызывать три раза с новыми параметрами. Или если там есть именно редирект ( я вижу ты тут его включил curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);), то тогда два запуска CURL
PHP class для скачки и закачки файлов на сервер
Предисловие
В интернете есть много информации о том как скачивать файлы с сервера и загружать файлы на сервер, а также между серверами. Но нигде нет простого решения которое было бы более ли менее универсально.
И лишь благодаря единичным статьям, кусочкам информации с форумов и всяким комментариям удалось собрать пазл воедино. Я не утверждаю что мое решение полностью универсально, но очень удобное во многих случаях, хотя это вам решать.
Если у кого-либо возникнет желание улучшить мое решение этого вопроса и хватает знаний в этом направлении, то я буду рад, если вы сделаете какие-либо исправления или добавления к коду который лежит в открытом доступе на GitHub.
А теперь к делу, функции класса CargaDes:
Для начала нужно скачать и подключить класс CargaDes:
1. Отдача файла через браузер без показа его места хранения с возможностью докачки и регулирования скорости
Этот метод очень похож на Drupal и иже с ним:
Я добавил еще отдачу с помощью Apache, но должна быть включена директива XSendFile On
Сразу после выполнения метода браузер выдаст окно для сохранения файла
2. Загрузка файла/ов на сервер через браузер с индикатором прогресса
После выполнения метода появится кнопка для выбора файлов и кнопка для загрузки файлов. Индикатор будет появляться для каждого выбранного файла в отдельности.
3. Скачивание файлов с удаленного сервера на свой сервер
4. Отдаем файл на удаленный сервер со своего сервера
По итогу хочу сказать
Если этот класс поможет хотя бы одному человеку я буду очень рад этому. Как я уже говорил в начале буду рад конструктивной критике и дополнениям которые могут привести к улучшению класса. Ссылка на CargaDes.class.
Изменил в статье способы использования класса. И добавил описание того что изменилось в классе.
Вот закончил работу над ошибками, если это можно так назвать.
Что было не сделано:
В целом я постарался исправить, то о чем говорили в комментариях, если будут найдены еще какие либо недочеты или ошибки — пишите постараюсь исправить.
Благодарю за конструктивную критику webdevium и alutskevich, если бы мог, то плюсанул бы вам обязательно.
Так же благодарю всех остальных т.к. у меня появилось понимание моей главной ошибки и родилось пару идей.