Master-X
Форум | Новости | Статьи
Главная » Форум » Программинг, Скрипты, Софт, Сервисы » 
Тема: Скачать файл средствами пхп
цитата
06/11/11 в 12:17
 Lexikon
Собственно хотел уточнить, у меня есть список файлов, которые находятся на удаленном сервере, мне нужно их перетянуть к себе на комп.
Это можно сделать функцией сору( ) или это только ей и делается???
цитата
06/11/11 в 12:24
 idk2045
да вроде пишут что можно copy юзать
но если на локальный комп и файлы большие то имхо проще список в флешгет забить icon_wink.gif
цитата
06/11/11 в 12:29
 Lexikon
не, тут задачу себе поставил что нужно тянуть изображения по списку, затем их переименовывать и сохранять у себя.
Т.е. там все по алгоритму, чтоб каждое изображение принадлехало своему хтмл файлу
цитата
06/11/11 в 12:36
 ibiz
как-то так trollface.png
Код:
$content = file_get_contents('http://master-x.com/img/1.jpg');
file_put_contents('img/html1.jpg', $content);
цитата
06/11/11 в 12:50
 idk2045
ibiz писал:
как-то так trollface.png
Код:
$content = file_get_contents('http://master-x.com/img/1.jpg');
file_put_contents('img/html1.jpg', $content);

я тоже сразу про file_get/put_contents подумал, но почитал мануал по copy, и собственно оно то же самое делает оказывается icon_smile.gif
хз как внутри копи работает, но возможно не держит весь файл в памяти в отличие от file_get_contents, надо будет как-нибудь самому воспользоваться.
цитата
06/11/11 в 12:59
 Lexikon
наткнуля на то что не рекомендуют file_get_contents()
читать тут
цитата
06/11/11 в 13:06
 ibiz
Lexikon писал:
наткнуля на то что не рекомендуют file_get_contents()
читать тут


не загружается ссылка, гугель выдал вот что:
Цитата:

Почему нельзя использовать fopen, file_get_contents при работе с HTTP
Как мы знаем, fopen, file, file_get_contents могут принимать в качестве параметра URL удаленного файла. НО использование этих функций не правильно, и вот почему:

1. Эти функции работают с удаленными хостами толдько при включенной директиве allow_url_fopen в php.ini (установить эту директиву в .htaccess или скрипте нельзя). Как правило хостеры ее отключают. По крайней мере умные.
2. fopen не имеет параметра тайм-аута, что самое важное,т.к. в случае если сайт не отвечает или тяжело отвечает, скрипт может легко "подвиснуть".
3. Если где-то используется fopen и случайно пропущена обработка возможности ошибочного входного параметра, то может быть XSS или переполнения буфера.
4. Нет возможности указать порт, по которому необходимо соединиться с сервером.
5. Лишние операции, т.к. тот же fopen вызывать будет сокеты. Зачем использовать сверх функции?

Что же использовать?

http://php.net/fsockopen
http://php.net/sockets


по всем пунктам для file_get_contents нашел только allow_url_fopen в php.ini
если уж совсем хочется, правильно-правильно сделать, то юзай curl trollface.png
цитата
06/11/11 в 13:15
 idk2045
Lexikon писал:
наткнуля на то что не рекомендуют file_get_contents()
читать тут

бред теоретиков, не читай такое smail101.gif
особенно умилило
Цитата:
5. Лишние операции, т.к. тот же fopen вызывать будет сокеты. Зачем использовать сверх функции?

ответ: потому что работа с сокетами требует 10 строк кода а file_get_contents - одну.

единственное толковое замечание про таймауты, но насколько я помню из опыта, они так же глючат и при работе с сокетами.
так что совсем правильно как заметил ibiz будет юзать curl.
но не надо стрелять из пушки по воробьям.
цитата
06/11/11 в 13:26
 ibiz
grozny писал:

единственное толковое замечание про таймауты, но насколько я помню из опыта, они так же глючат и при работе с сокетами.


вообщето file_get_contents поддерживает таймауты, про глюки это отдельная тема trollface.png

Код:
string file_get_contents ( string $filename [, bool $use_include_path = false [, resource $context [, int $offset = -1 [, int $maxlen ]]]] )


Код:

$ctx = stream_context_create(array(
     'http' => array(
         'timeout' => 1
         )
     )
);
file_get_contents("http://example.com/", 0, $ctx);
цитата
06/11/11 в 13:28
 idk2045
ibiz писал:
вообщето file_get_contents поддерживает таймауты, про глюки это отдельная тема trollface.png

и правда... я просто на них забил т.к. они у меня ни разу не работали icon_smile.gif
пробую с периодичностью раз в 3 года smail101.gif
цитата
06/11/11 в 13:38
 Lexikon
ясненько, мне собственно не на сервер ставить, а у себя на локалке работать чтоб облегчить некоторые замарочки.
цитата
06/11/11 в 13:42
 FXIX
не придумывай лишнего. возьми Zend_Http

Zend_Loader::loadClass('Zend_Http_Client');

public function download_upload($url) {
$client = new Zend_Http_Client();
$client->setConfig($GLOBALS['proxy_setting']);
$client->setHeaders($GLOBALS['headers_setting']);
$client->setCookieJar();
try {
$client->setUri($url);
$response = $client->request();
} catch (Zend_Uri_Exception $exc) {
echo $exc->getMessage();
return;
} catch (Exception $exc) {
echo $exc->getMessage();
return;
}
$img_src = $response->getBody();

if(
$response->isSuccessful()
AND
preg_match("~image~is", $response->getHeader('Content-Type')) == 1
) {
$imagetype = $response->getHeader('Content-Type');
preg_match("~.*/(.*)~is", $imagetype, $type);
$filename = md5(uniqid('', TRUE)) . '.' . $type[1];
file_put_contents($filename, $img_src, FILE_USE_INCLUDE_PATH);
}
}

ну тут я с картинками работал. поправишь как тебе надо. глобальные массивы сделаешь локальными. они такого плана

$headers_setting = array(
'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language' => 'ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3',
'Accept-Encoding' => 'gzip,deflate',
'Accept-Charset' => 'windows-1251,utf-8;q=0.7,*;q=0.7',
);

$proxy_setting = array(
'useragent' => 'any random',
'keepalive' => TRUE,
'strictredirects' => TRUE,
'timeout' => 600,
'sslusecontext' => TRUE,
'adapter' => 'Zend_Http_Client_Adapter_Curl',
'curloptions' => array(
#CURLOPT_PROXY => '127.0.0.1',
#CURLOPT_PROXYPORT => 9050,
#CURLOPT_HTTPPROXYTUNNEL => TRUE,
#CURLOPT_SSL_VERIFYPEER => 0,
#CURLOPT_PROXYTYPE => CURLPROXY_SOCKS5,
),
);
цитата
06/11/11 в 13:53
 ibiz
FXIX писал:
не придумывай лишнего. возьми Zend_Http


smail101.gif trollface.png
цитата
06/11/11 в 14:05
 FXIX
смешного мало smail101.gif. пусть привыкает к хорошему
цитата
06/11/11 в 14:07
 Lexikon
Спасибо конечно, но куда я его приткну, зенда у меня нет. Апач стоит, и впринципе то что мне нужно на меньшее количество строк выйдет, я сейчас еще туда впихну изменение размера и попробую это всё прикрутить к прошлому скрипту чтоб я уже задание через форму давал. Посмтрим что выйдет. smail101.gif
И так же не интересно, icon_smile.gif сразу взять готовое, я сначала с малого, хоть поизучаю простые функции.
цитата
06/11/11 в 14:21
 idk2045
FXIX: отжог простотой smail101.gif
цитата
06/11/11 в 14:29
 Yacc
Код:
$remote = "http://remote-server.com/image.jpg";
$local  = "local-path/image.jpg";
if( get_file($remote, $local) ) {
    echo 'file saved.';
}
else {
    echo 'something went wrong.';
}


function get_file( $remote, $local ) {
   $host = parse_url( $remote, PHP_URL_HOST );
   $path = parse_url( $remote, PHP_URL_PATH );
   $file_pointer = fsockopen( $host, 80, $errno, $errmsg, 30 );
   if( !$file_pointer ) {
      echo "Can't connect to ".$host."\n";
      return false;
   }
   fwrite( $file_pointer, "GET ".$path." HTTP/1.1\r\nHost: ".$host."\r\nConnection: Close\r\n\r\n" );
   $response= "";
   while( ! feof( $file_pointer ) ) {
      $response.= fgets( $file_pointer, 4096 );
   }      
   fclose( $file_pointer );
   $neck = strpos( $response, "\r\n\r\n" );
   $head = substr( $response, 0, $neck );
   $body = substr( $response, $neck + 4 );
   $lines = explode( "\r\n", $head );
   preg_match( '/HTTP\/(\\d\\.\\d)\\s*(\\d+)\\s*(.*)/', $lines[ 0 ], $m );
   $status = $m[ 2 ];
   if( $status == 200 ) {
      file_put_contents( $local, $body );
      return( true );
   } else {
      return( false );
   }
}
цитата
06/11/11 в 14:33
 FXIX
Lexikon писал:
Спасибо конечно, но куда я его приткну, зенда у меня нет.

зенд скачай. там либ http://framework.zend.com/manual/en/reference.html под 100% твоих пхп задач. и на 10 лет вперед. ты все равно к нему придешь. лучше раньше.

Lexikon писал:

И так же не интересно, icon_smile.gif сразу взять готовое, я сначала с малого, хоть поизучаю простые функции.

ну можешь сокеты пописать и через wireshark заголовки поснифать smail101.gif. послушать что шепчет браузер апачу, и что в ответ апач говорит браузеру.

ты или пишешь код, или юзаешь инструмент. инструмент выглядит так:

подключаем класс Zend_Http_Client через автолоадер. к автолоадерам ты придешь
Zend_Loader::loadClass('Zend_Http_Client');

пишем конфиг браузера. к этому ты придешь когда начнешь писать парсеры и грабилки
$client->setConfig(
юзерагент
авторедирект
прокси
);

$client->setHeaders(
кодировки
чарсеты
тип контента
итд
);

ставим "липкие" куки. к этому ты придешь сразу же на любом первом вебсервисе. или регалке. когда сквозь 6 редиректов через js будет прилетать 33 куки
$client->setCookieJar();

выставляем сам урл
$client->setUri($url);

отправляем и перехватываем ошибки
$response = $client->request();

этим ловим неправильные\несуществующие урлы и вообще любую блевотину и отрыжку апача (коды и слова ответа может покурить. надоест тебе)
Zend_Uri_Exception $exc

это сам файл. в переменной.
$img_src = $response->getBody();

если сервер ответил 200 Ok (он может все что угодно ответить. у бога дней много. невозбраняется ебаться вручную)
$response->isSuccessful()

ну остальное там по картинке.
парсим полученный заголовок Content-Type
$response->getHeader('Content-Type')

получаем расширение картинки. например .png
preg_match("~.*/(.*)~is", $imagetype, $type);

генерим уникальное имя файла в каталоге
$filename = md5(uniqid('', TRUE)) . '.' . $type[1];

пишем файл
file_put_contents($filename, $img_src, FILE_USE_INCLUDE_PATH);

Сложного тут ничего нет. зато 50вмз-шные скрипты ты будешь писать за 5 минут. вместо 50 smail101.gif. Т.к. зенд пишут люди гораздо умнее всех нас вместе взятых - ты получаешь возможность просто писать, а не ебаться
цитата
06/11/11 в 14:39
 Lexikon
так зенд платный ведь, или я немного не понял что именно мне сделать.
Кстати для работы зенда апач ведь тоже нужен???
Нашел у себя на старом бесплатном диске icon_smile.gif , зенд 5.5.1.282 незнаю как он будет правда работать. Или проще последнюю купить, я смотрю ее сейчас везде рекламят.
цитата
06/11/11 в 14:57
 idk2045
имеется в виду бесплатный Zend Framework - пхпшный фреймворк, к которому конечно нужен апач и собственно пхп)
есть еще Zend Server - виндовая софтина, которая инсталит тебе сразу и Zend Framework, и апач и пхп.
но она вроде тоже бесплатная.

но я по прежнему думаю что это мазохистский геморой для задач такого уровня smail101.gif
цитата
06/11/11 в 15:30
 Alexandur
Zend Framework и жаваскриптовые куки читает?

Хотя, даже и если - нафига такой трактор?
То же на курле ($url, $ref, $dest - адрес картинки, реф сайта - можно тот же что и адрес, путь для сохранения):
Код:

function refcopy($url, $ref, $dest)
{
   $user_agent = 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)';
   $headers = array('Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-excel, application/msword, application/x-matrix, */*', 'Accept-Language: en-us', 'Connection: keep-alive');

   $ch = curl_init();   
   curl_setopt($ch, CURLOPT_URL, $url);
   curl_setopt($ch, CURLOPT_REFERER, $ref);
   curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
   curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
   curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
   $result = curl_exec($ch);     
   curl_close ($ch);

   file_put_contents($dest, $result);

   return true;
}


Конечно, заголовки не проверяет, но для 95% случаев достаточно.
цитата
06/11/11 в 15:38
 FXIX
grozny писал:

но я по прежнему думаю что это мазохистский геморой для задач такого уровня smail101.gif

гемороя нет. в 99% случаев можно все оставить по-умолчанию.

require_once 'Zend_Http_Client';
$client = new Zend_Http_Client($url);
$response = $client->request();
$img = $response->getBody();
file_put_contents('filename', $img);

смысл то в другом совсем.
цитата
06/11/11 в 15:45
 idk2045
FXIX писал:
гемороя нет. в 99% случаев можно все оставить по-умолчанию.

require_once 'Zend_Http_Client';
$client = new Zend_Http_Client($url);
$response = $client->request();
$img = $response->getBody();
file_put_contents('filename', $img);


о чем я и говорю, в 99% случаев это заменяется на copy($url, 'filename');
чья-то умная мысль - все вещи надо делать настолько просто, насколько это возможно, но не проще icon_wink.gif
цитата
06/11/11 в 16:07
 ibiz
ТС надо перекидать самосвал песка, а ему предлагают использовать грейдер для карьеров вместо лопаты... уверен даже ошибка на таймаут не пригодится, ну не пиздец ли trollface.png
цитата
06/11/11 в 16:21
 FXIX
таймаут пригодится если работа идет через цепочку. к примеру через TOR trollface.png
Стр. 1, 2  >  последняя »


Эта страница в полной версии