ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > PHP, PERL, MySQL, JavaScript
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

CURL POST отправка файла
  #1  
Старый 26.11.2009, 08:27
slva2000
Новичок
Регистрация: 20.11.2009
Сообщений: 17
Провел на форуме:
23696

Репутация: -4
Question CURL POST отправка файла

Есть форма на сайта:

PHP код:
бла бла

<form method="post" action="/profileedit/" enctype="multipart/form-data">
<
input name="avatar" type="file" size="22" />  

бла бла 
Пытаюсь методом CURL отправить данные, в т.ч. файл. Данные улетают, сохраняются, как положено, а файл нет.

Вот результат снифера если отправлять форму браузером:

Код:
icq=748852941
бла, бла
skype=...
avatar=filename="photo.jpg" Content-Type: image/jpeg
Вот код php отправки:

PHP код:

function post($url,$data$refer='') { 

$process curl_init($url); 
if (!
$refer==''curl_setopt($processCURLOPT_REFERER$refer);
curl_setopt($processCURLOPT_HTTPHEADER$this->headers); 
curl_setopt($processCURLOPT_HEADER1); 
curl_setopt($processCURLOPT_USERAGENT$this->user_agent); 
if (
$this->cookies == TRUEcurl_setopt($processCURLOPT_COOKIEFILE$this->cookie_file); 
if (
$this->cookies == TRUEcurl_setopt($processCURLOPT_COOKIEJAR$this->cookie_file); 
curl_setopt($processCURLOPT_ENCODING $this->compression); 
curl_setopt($processCURLOPT_TIMEOUT30); 
if (
$this->proxycurl_setopt($processCURLOPT_PROXY$this->proxy); 
curl_setopt($processCURLOPT_POSTFIELDS$data); 
curl_setopt($processCURLOPT_RETURNTRANSFER1); 
curl_setopt($processCURLOPT_FOLLOWLOCATION1); 
curl_setopt($processCURLOPT_POST1); 
$return curl_exec($process); 
curl_close($process); 
return 
$return



$avatar 'filename="c://photo.jpg" Content-Type: image/jpeg';
$post_data "icq=".mt_rand(587964257797964257)."&skype=&avatar=".$avatar;

echo 
post ("http://site.com/profile/"$post_data"http://site.com/profileediter/"); 

Данные в форме сохраняются (редактирование профиля), а аватор нет!

Помогите разобратся в том, где ошибка
 
Ответить с цитированием

  #2  
Старый 26.11.2009, 15:00
slva2000
Новичок
Регистрация: 20.11.2009
Сообщений: 17
Провел на форуме:
23696

Репутация: -4
Angry

Уф, ну и не разбериха с этим курлом... Нашёл две детали (только с отладочными скриптами):

1. CURLOPT_POST должна идти обязательно перед CURLOPT_POSTFIELDS (иначе не принимает файл)
2. Заголовки я формировал для своей функции классические:

PHP код:
$this->headers[] = 'Accept: image/gif, image/x-bitmap, image/jpeg, image/pjpeg'
$this->headers[] = 'Connection: Keep-Alive'
$this->headers[] = 'Content-type: application/x-www-form-urlencoded;charset=UTF-8'
$this->user_agent 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.0.3705; .NET CLR 1.1.4322; Media Center PC 4.0)'
С ними отправить файл не удавалось. Что ж, решил скопировать заголовки со снифера (реальный пост на сайте):

PHP код:
$head[] = "Content-Type: image/gif";

$head[] = "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10";
$head[] = "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
$head[] = "Accept-Language: ru,en-us;q=0.7,en;q=0.3";
$head[] = "Accept-Encoding: gzip,deflate";
$head[] = "Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7";
$head[] = "Keep-Alive: 300";
$head[] = "Connection: keep-alive";
$head[] = "Referer: http:/xxx.ru/";
$head[] = "Content-Type: multipart/form-data"
Тоже не принимал такие. Удалил CURLOPT_HTTPHEADER с функции, всё заработало. Файл был принят сервером.
В голове не осталось ничего полезного :wacko
 
Ответить с цитированием

  #3  
Старый 26.11.2009, 15:07
slva2000
Новичок
Регистрация: 20.11.2009
Сообщений: 17
Провел на форуме:
23696

Репутация: -4
По умолчанию

Забыл добавить:

CURLOPT_POSTFIELDS должен быть массивом:

array("name_input" => "value");
 
Ответить с цитированием

  #4  
Старый 26.11.2009, 15:17
m0Hze
Он хакер.
Регистрация: 01.11.2008
Сообщений: 1,756
Провел на форуме:
6462214

Репутация: 3171


По умолчанию

Цитата:
Сообщение от slva2000  
Уф, ну и не разбериха с этим курлом... Нашёл две детали (только с отладочными скриптами):

1. CURLOPT_POST должна идти обязательно перед CURLOPT_POSTFIELDS (иначе не принимает файл)
2. Заголовки я формировал для своей функции классические:

PHP код:
$this->headers[] = 'Accept: image/gif, image/x-bitmap, image/jpeg, image/pjpeg'
$this->headers[] = 'Connection: Keep-Alive'
$this->headers[] = 'Content-type: application/x-www-form-urlencoded;charset=UTF-8'
$this->user_agent 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.0.3705; .NET CLR 1.1.4322; Media Center PC 4.0)'
С ними отправить файл не удавалось. Что ж, решил скопировать заголовки со снифера (реальный пост на сайте):

PHP код:
$head[] = "Content-Type: image/gif";

$head[] = "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10";
$head[] = "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
$head[] = "Accept-Language: ru,en-us;q=0.7,en;q=0.3";
$head[] = "Accept-Encoding: gzip,deflate";
$head[] = "Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7";
$head[] = "Keep-Alive: 300";
$head[] = "Connection: keep-alive";
$head[] = "Referer: http:/xxx.ru/";
$head[] = "Content-Type: multipart/form-data"
Тоже не принимал такие. Удалил CURLOPT_HTTPHEADER с функции, всё заработало. Файл был принят сервером.
В голове не осталось ничего полезного :wacko
Это какие то бредни.Ве отлично работает,при любом раскладе.Просто руки нужно воткнуть в туловище,ога.
POSTFIELDS не обязательно должен быть массив,проходит обычная строка:
PHP код:
$post 'text=34234&log=2442'
 
Ответить с цитированием

  #5  
Старый 26.11.2009, 15:19
svesve
Постоянный
Регистрация: 15.06.2007
Сообщений: 527
Провел на форуме:
1734541

Репутация: 214


По умолчанию

поидеи поститься файл так

PHP код:
<?php
    $ch 
curl_init();
    
curl_setopt($chCURLOPT_HEADER0);
    
curl_setopt($chCURLOPT_VERBOSE0);
    
curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
    
curl_setopt($chCURLOPT_USERAGENT"Mozilla/4.0 (compatible;)");
    
curl_setopt($chCURLOPT_URL$url);
    
curl_setopt($chCURLOPT_POSTtrue);
    
// same as <input type="file" name="file_box">
    
$post = array(
        
"file_box"=>"@/path/to/myfile.jpg",
    );
    
curl_setopt($chCURLOPT_POSTFIELDS$post); 
    
$response curl_exec($ch);
?>
 
Ответить с цитированием

  #6  
Старый 26.11.2009, 15:35
b3
Постоянный
Регистрация: 05.12.2004
Сообщений: 647
Провел на форуме:
1698585

Репутация: 818


Отправить сообщение для b3 с помощью ICQ
По умолчанию

Цитата:
Сообщение от slva2000  
Уф, ну и не разбериха с этим курлом... Нашёл две детали (только с отладочными скриптами):

1. CURLOPT_POST должна идти обязательно перед CURLOPT_POSTFIELDS (иначе не принимает файл)
2. Заголовки я формировал для своей функции классические:

PHP код:
$this->headers[] = 'Accept: image/gif, image/x-bitmap, image/jpeg, image/pjpeg'
$this->headers[] = 'Connection: Keep-Alive'
$this->headers[] = 'Content-type: application/x-www-form-urlencoded;charset=UTF-8'
$this->user_agent 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.0.3705; .NET CLR 1.1.4322; Media Center PC 4.0)'
С ними отправить файл не удавалось. Что ж, решил скопировать заголовки со снифера (реальный пост на сайте):

PHP код:
$head[] = "Content-Type: image/gif";

$head[] = "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10";
$head[] = "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
$head[] = "Accept-Language: ru,en-us;q=0.7,en;q=0.3";
$head[] = "Accept-Encoding: gzip,deflate";
$head[] = "Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7";
$head[] = "Keep-Alive: 300";
$head[] = "Connection: keep-alive";
$head[] = "Referer: http:/xxx.ru/";
$head[] = "Content-Type: multipart/form-data"
Тоже не принимал такие. Удалил CURLOPT_HTTPHEADER с функции, всё заработало. Файл был принят сервером.
В голове не осталось ничего полезного :wacko
Объясни одну вещь, нафига слать все эти заголовки если ты используеш cURL ? Разве не для этого был создан cURL, что б те кто поленился изучать протоколы мог юзать Константы?

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

PHP код:
<?php  
/***********************************************************************************************************************  
*    Скрипт предназначен для автоматической смены аватарки на сайте vkontakte.ru. Замена аватарки происходит 1 раз в 24 часа.  
*    Имена аватарок:  
*    ponedelnik,  
*    vtornik,  
*    sreda,  
*    chetverg,  
*    pjatniza,  
*    subbota,  
*    woskresenje  
*    Формат файлов .png  
*    Запускать скрипт можно с сайта CronJob.ru рекомендую ставить промежуток 12 часов. Запуск производится по ссылке:  
*    http://www.example.com/SCRIPT_FILENAME.php?start  
************************************************************************************************************************/  
if(!@function_exists(curl_init))    
{    
    echo 
'<center><b>cURL not Supported</b></center><br>';    
    exit;    
}  
###  
if(file_exists('ponedelnik.png') && file_exists('vtornik.png') && file_exists('sreda.png') && file_exists('chetverg.png') && file_exists('pjatniza.png') && file_exists('subbota.png') && file_exists('woskresenje.png'))  
{  
    echo 
'<a href="?start">START</a>';  
}  
else  
{  
echo 
'<b>Нехватает файлов изображений</b>';  
###  
}  
if(!isset(
$_GET['start']))  
{  
    exit;  
}  
###########################################  
###########################################  
##############[CONFIG]#####################  
$id '123';                          ###    <=== Your ID  
$login '123@rambler.ru';      ###    <=== Your email for login  
$pass '123';                     ###    <=== Your password  
###########################################  
###########################################  
$pass md5($pass);  
$login str_replace('@','%40',$login);  
$cookie "remixmid=$id; remixemail=$login; remixpass=$pass";  
###############################################################################################  
$date =  date('w');  
$arr = array(  
'1' => 'ponedelnik',  
'2' => 'vtornik',  
'3' => 'sreda',  
'4' => 'chetverg',  
'5' => 'pjatniza',  
'6' => 'subbota',  
'0' => 'woskresenje'  
);  
$foto $arr[$date].'.png';  
###############################################################################################  
$ch curl_init('http://vkontakte.ru/profileEdit.php?page=photo');    
      
curl_setopt($chCURLOPT_RETURNTRANSFER1);    
      
curl_setopt($chCURLOPT_TIMEOUT60);    
      
curl_setopt($chCURLOPT_USERAGENT'Opera/9.62 (Windows NT 6.0; U; ru) Presto/2.1.1');    
      
curl_setopt($chCURLOPT_COOKIE$cookie);   
      
curl_setopt($chCURLOPT_FOLLOWLOCATION1);   
      
$res curl_exec($ch);    
      
curl_close($ch);    
###############################################################################################  
if(preg_match_all('#action="(.*?)"#',$res$url2))  
    {  
        
$action_url $url2[1][1];   
        
$data = array(   
        
'photo' => "@".$_SERVER['DOCUMENT_ROOT'].$foto,   
        
'subm' => '1'   
        
);   
###############################################################################################  
$ch curl_init($action_url);    
    
curl_setopt($chCURLOPT_RETURNTRANSFER1);    
    
curl_setopt($chCURLOPT_TIMEOUT60);    
    
curl_setopt($chCURLOPT_POSTtrue);    
    
curl_setopt($chCURLOPT_POSTFIELDS$data);  
    
curl_setopt($chCURLOPT_USERAGENT'Opera/9.62 (Windows NT 6.0; U; ru) Presto/2.1.1');    
    
curl_setopt($chCURLOPT_COOKIE$cookie);   
    
curl_setopt($chCURLOPT_FOLLOWLOCATION1);   
$res curl_exec($ch);    
    
curl_close($ch);  
###############################################################################################    
    
}  
?>
 
Ответить с цитированием

  #7  
Старый 26.11.2009, 15:58
slva2000
Новичок
Регистрация: 20.11.2009
Сообщений: 17
Провел на форуме:
23696

Репутация: -4
По умолчанию

Цитата:
Сообщение от m0Hze  
Это какие то бредни.Ве отлично работает,при любом раскладе.Просто руки нужно воткнуть в туловище,ога.
POSTFIELDS не обязательно должен быть массив,проходит обычная строка:
PHP код:
$post 'text=34234&log=2442'
Да, я часто вижу таких, которым лиш бы брякнуть. Открывай нотепад и вперёд:


upload.php:

PHP код:
<?
print_r
($_POST);
echo 
"<br><br>";
print_r($_FILES);
?>

(не забудь положить 0.gif в ./home/localhost/)

Варинат 1. (единственный рабочий из предложеных)

index.php:

PHP код:
<?php
$ch 
curl_init();
$data = array('name' => 'Foo''file' => '@'.$_SERVER['DOCUMENT_ROOT'].'/0.gif');

curl_setopt($chCURLOPT_URL'http://localhost/upload.php');
curl_setopt($chCURLOPT_POST1);
curl_setopt($chCURLOPT_POSTFIELDS$data);
curl_exec($ch);
?>

Варинат 2. (Стройка вместо массива. НЕ рабочий)

index.php:

PHP код:
<?php
$ch 
curl_init();
$data "name=Foo&file=@".$_SERVER['DOCUMENT_ROOT']."/0.gif";

curl_setopt($chCURLOPT_URL'http://localhost/upload.php');
curl_setopt($chCURLOPT_POSTFIELDS$data);
curl_setopt($chCURLOPT_POST1);
curl_exec($ch);
?>

Варинат 3. (CURLOPT_POST после CURLOPT_POSTFIELDS. НЕ рабочий)

index.php:

PHP код:
<?php
$ch 
curl_init();
$data = array('name' => 'Foo''file' => '@'.$_SERVER['DOCUMENT_ROOT'].'/0.gif');

curl_setopt($chCURLOPT_URL'http://localhost/upload.php');
curl_setopt($chCURLOPT_POSTFIELDS$data);
curl_setopt($chCURLOPT_POST1);
curl_exec($ch);
?>

попрошу прокоментировать знатоков.
 
Ответить с цитированием

  #8  
Старый 26.11.2009, 16:03
slva2000
Новичок
Регистрация: 20.11.2009
Сообщений: 17
Провел на форуме:
23696

Репутация: -4
По умолчанию

cURL Information: libcurl/7.16.0 OpenSSL/0.9.8d zlib/1.2.3

b3 заголовки я отправлял с целью, что сервер принимает еменно "то, что нужно", т.е. рефер, например ему нужен правильный, и т.д. Оказалос, безусловно, что своими заголовками, я только напортачил. КУРЛ без этого сам правильно их сформировал.

Кста, а что ты скажешь про юзер-Агента? То, где я постю, это НЕОБХОДИМАЯ деталь. Причём, рандомные.

Но основная то беда не в нём. См мой ответ.

Последний раз редактировалось slva2000; 26.11.2009 в 16:09..
 
Ответить с цитированием

  #9  
Старый 26.11.2009, 17:08
b3
Постоянный
Регистрация: 05.12.2004
Сообщений: 647
Провел на форуме:
1698585

Репутация: 818


Отправить сообщение для b3 с помощью ICQ
По умолчанию

Цитата:
Кста, а что ты скажешь про юзер-Агента?
PHP код:
curl_setopt($chCURLOPT_USERAGENT'Opera/9.62 (Windows NT 6.0; U; ru) Presto/2.1.1'); 
Цитата:
Причём, рандомные.
Загнал в файл список агентов и вытягивай рандомно.
 
Ответить с цитированием

  #10  
Старый 26.11.2009, 17:21
slva2000
Новичок
Регистрация: 20.11.2009
Сообщений: 17
Провел на форуме:
23696

Репутация: -4
По умолчанию

b3 это был риторический вопрос. Я к тому, что хеадреы часто приходится модифицировать. А при моей задаче (постинг ПОСТом с файлом), хеадеры воообще никикие не катят, если их указывать явно. Убрал полностью - пожалуйста. Добавил хотя бы Юзер-Агента - уже никак.
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi. Отправка файла на гейт. slesh С/С++, C#, Delphi, .NET, Asm 34 18.10.2009 12:32
Отправка POST на mail.ru ozerin PHP, PERL, MySQL, JavaScript 8 20.06.2009 15:33
Процесс создания программного обеспечения для распределенных вычислений (С++). c0n Difesa Авторские статьи 9 09.06.2009 16:33
Curl + POST + array/sring Doom123 PHP, PERL, MySQL, JavaScript 1 13.04.2009 21:04



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ