С сокетов на курл

Discussion in 'PHP' started by Malunga, 6 Sep 2008.

  1. Malunga

    Malunga New Member

    Joined:
    3 Sep 2008
    Messages:
    13
    Likes Received:
    2
    Reputations:
    0
    Приветствую всех форумчан и очень надеюсь на помощь!!! :)
    Сделал загрузчик файла на удалённый хост. На сокетах всё работает прекрасно. Решил переделать на курл и тут не получается.
    Вот примерный код:
    PHP:
    <?php  
    $head 
    "POST /upload.php HTTP/1.1\r\n";
    $head .= "Content-type: multipart/form-data; boundary=--UPLOAD\r\n";
    $head2 .= "-------UPLOAD-------\r\nContent-Disposition: form-data;\r\n\r\n";
    $head2 .= "-------UPLOAD-------\r\nContent-Type: image/gif\r\n\r\n";
    $head2 .= file_get_contents($filename);
    $head2 .= 'Content-Disposition: form-data; name="uploadfile"'."\r\n";
    $head2 .= "Submit Query\r\n-------UPLOAD-------\r\n";
    $head .= 'Content-length: '.strlen($head2)."\r\n\r\n".$head2;

    $fp fsockopen('host.ru'30);
    while(!
    feof($fp))
    {
       echo 
    fputs($fp$head);
    }
    fclose($fp);
    ?>
    (часть заголовков опустил)
    Как видно, заголовки довольно мудрёные. Напрягают двойные переносы (\r\n\r\n) и длина запроса, которая берётся из первой части.
    Вот что пытался сделать, конечно же ничего не работает.
    PHP:
    <?php    
    $head
    [] = 'Content-type: multipart/form-data; boundary=--UPLOAD';
    $head2[] = '-------UPLOAD-------';
    $head2[] = 'Content-Disposition: form-data;';
    $head2[] = '-------UPLOAD-------';
    $head2[] = 'Content-Type: image/gif';
    $head2[] = 'Content-Disposition: form-data; name="uploadfile"';
    $head2[] = 'Submit Query';
    $head2[] = '-------UPLOAD-------';
    $head[] = 'Content-length: '.count($head2);
    $head[] = $head2;        

    $init curl_init();
    curl_setopt($initCURLOPT_URL,'http://host.ru/upload.php');
    curl_setopt($initCURLOPT_RETURNTRANSFER,true);
    curl_setopt($initCURLOPT_HEADER,true);
    curl_setopt($initCURLOPT_POST,true);
    curl_setopt($initCURLOPT_UPLOAD,true);
    curl_setopt($initCURLOPT_POSTFIELDS,$head);
    curl_setopt($initCURLOPT_INFILESIZE,$_FILES["name"]["size"]);
    curl_setopt($initCURLOPT_INFILEfile_get_contents($_FILES["name"]["tmp_name"]));
    $string curl_exec($init);
    curl_close($init);
    echo 
    "<pre>$string</pre>";
    ?>
    С курлом столкнулся впервые тем более с передачей файлов на курле. так же гуглил и ничего не нашёл интересного по своему вопросу, кроме как простых статей как загрузить файл на удалённый хост....
    Надеюсь на вашу помощь!!!
     
  2. NuR

    NuR Elder - Старейшина

    Joined:
    11 Dec 2005
    Messages:
    85
    Likes Received:
    58
    Reputations:
    -2
    PHP:
    curl_setopt($cCURLOPT_INFILE$fp);   
    файловый дескриптор отправь
     
  3. NuR

    NuR Elder - Старейшина

    Joined:
    11 Dec 2005
    Messages:
    85
    Likes Received:
    58
    Reputations:
    -2
    ой ёпт, чет ты ваще не то фигачишь=))
    вот держи пример
    PHP:
    $file "testfile.txt";  
     
    $c curl_init();  
    curl_setopt($cCURLOPT_URL"http://example.com/putscript");  
    curl_setopt($cCURLOPT_USERPWD"username:password");  
    curl_setopt($cCURLOPT_RETURNTRANSFERtrue);  curl_setopt($cCURLOPT_PUTtrue);  curl_setopt($cCURLOPT_INFILESIZEfilesize($file));
    $fp fopen($file"r");  
    curl_setopt($cCURLOPT_INFILE$fp);     
    curl_exec($c);     
    curl_close($c);  
    fclose($fp); 
     
  4. Malunga

    Malunga New Member

    Joined:
    3 Sep 2008
    Messages:
    13
    Likes Received:
    2
    Reputations:
    0
    Спасибо. с этим более менее разобрался, а как в заголовками быть? Не пойму как быть с двойными переносами. И ещё вопрос: как быть с Curlopt_infile если я передаю файл через форму (т.е. я не сохраняю его на серве, всё делается через $_files).
    сорри за ламерство, с курлом впервые столкнулся =))