douxing5598 2012-02-29 15:21
浏览 112
已采纳

php将multipart和xml一起提交给Web服务

I need to submit an XML and an image together to a restful web service. Is this possible using curl ?

Of the various examples available in web, I could see that they are passing a multipart and other form data together. But, I could not locate an example which sends an XML and an image together.

Here is the code I am trying.

<?php
$url = "http://www.myservice.com/event";

$file = dirname(__FILE__) . "\image.jpg"; 
$boundary  = "---------------------".substr(md5(rand(0,32000)), 0, 10);  

$event_xml_data =
'<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' .
'<ns5:event ' .
'xmlns="http://www.myservice.com/Common/"' .
'xmlns:ns2="http://www.myservice.com/Event/"' .
'xmlns:ns3="http://www.myservice.com/Media/"' .
'xmlns:ns4="http://www.myservice.com/Media/" ' .
'xmlns:ns5="http://www.myservice.com/Event/"> ' .
'<id>0</id>' .
'<name>Event2004</name> '.
'<ns2:description>Description845</ns2:description>' .
'<ns2:startDate>2012-02-27T22:21:29.458-06:00</ns2:startDate>' .
'<ns2:owner>Madhu</ns2:owner>' .
'</ns5:event>';

$content_type_header = 'Content-Type: multipart/form-data; '
    .'type="application/xml"; '
    .'boundary="' . $boundary . '"; '
    .'start="<event>"; '
    .'start-info="application/xml";';
$accept_header = 'Accept: multipart/form-data';
$transfer_encoding_header = 'Transfer-Encoding: chunked';

$fileContents = file_get_contents($file);

$headers = array($content_type_header, $accept_header, $transfer_encoding_header);

$postData  = $boundary . "
"
        ."Content-Type: application/xml

"
     ."Content-Transfer-Encoding: binary

"
        ."Content-ID: <event>

"
        .$event_xml_data . "
"
        .$boundary . "
"
        ."Content-Type: image/jpeg
"
        ."Content-Transfer-Encoding: binary

"
        . $fileContents . "
"
        .$boundary . "--
";

$postDataNoMedia  = $boundary . "
"
        ."Content-Type: application/xml

"
     ."Content-Transfer-Encoding: binary

"
        ."Content-ID: <event>

"
        .$event_xml_data . "
"
        .$boundary . "--
";

$f = fopen('request.txt', 'w');
//open connection
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_USERPWD, 'madhukampurath:xxxxxx');
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,$postDataNoMedia);
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
curl_setopt($ch, CURLOPT_HEADER,1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER  ,1);
curl_setopt($ch, CURLOPT_VERBOSE  ,1);
curl_setopt($ch, CURLOPT_STDERR  , $f);

//execute post
$output = curl_exec($ch);


$error = curl_error($ch);
$http_code = curl_getinfo($ch ,CURLINFO_HTTP_CODE); 

fclose($f);

echo $http_code . "<br />";

echo $output; 

echo $error; 

curl_close($ch); 

?>

Web service is done in java. Tomcat logs give this error.

org.apache.cxf.jaxrs.impl.WebApplicationExceptionMapper toResponse
WARNING: WebApplicationException has been caught : Couldn't find MIME boundary: -----------------------8a09e81751

  • 写回答

1条回答 默认 最新

  • duanqilupinf67040 2012-03-14 09:26
    关注

    I could solve the issue with the help of my friend Gerald Cantor. I am posting the answer below.

    It was because of a badly formed request. The boundaries were not defined correctly. Changed section is indicated below.

    <?php
    $url = "http://www.myservice.com/event";
    
    $file = dirname(__FILE__) . "\image.jpg"; 
    $boundary  = "---------------------".substr(md5(rand(0,32000)), 0, 10);  
    
    $event_xml_data =
    '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' .
    '<ns5:event ' .
    'xmlns="http://www.myservice.com/Common/"' .
    'xmlns:ns2="http://www.myservice.com/Event/"' .
    'xmlns:ns3="http://www.myservice.com/Media/"' .
    'xmlns:ns4="http://www.myservice.com/Media/" ' .
    'xmlns:ns5="http://www.myservice.com/Event/"> ' .
    '<id>0</id>' .
    '<name>Event2004</name> '.
    '<ns2:description>Description845</ns2:description>' .
    '<ns2:startDate>2012-02-27T22:21:29.458-06:00</ns2:startDate>' .
    '<ns2:owner>Madhu</ns2:owner>' .
    '</ns5:event>';
    
    $content_type_header = 'Content-Type: multipart/form-data; '
        .'type="application/xml"; '
        .'boundary="' . $boundary . '"; '
        .'start="<event>"; '
        .'start-info="application/xml";';
    $accept_header = 'Accept: multipart/form-data';
    $transfer_encoding_header = 'Transfer-Encoding: chunked';
    
    $fileContents = file_get_contents($file);
    
    $headers = array($content_type_header, $accept_header, $transfer_encoding_header);
    
    // Here is the change.
    $postData  = "--" . $boundary . "
    "
                ."Content-Type: application/xml
    "
                ."Content-Transfer-Encoding: binary
    "
                ."Content-ID: <event>
    
    "
                .$event_xml_data . "
    "
                ."--" .$boundary . "
    "
                ."Content-Type: image/jpeg
    "
                ."Content-Transfer-Encoding: binary
    "
                ."Content-ID: <media>
    
    "
                . $fileContents . "
    "
                ."--" .$boundary . "--";
    
    $postDataNoMedia  = "--" . $boundary . "
    "
                ."Content-Type: application/xml
    "
                ."Content-Transfer-Encoding: binary
    "
                ."Content-ID: <event>
    
    "
                .$event_xml_data . "
    "
                ."--" .$boundary . "--";
    // Change ends.
    
    $f = fopen('request.txt', 'w');
    //open connection
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_USERPWD, 'madhukampurath:xxxxxx');
    curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS,$postDataNoMedia);
    curl_setopt($ch, CURLOPT_TIMEOUT, 60);
    curl_setopt($ch, CURLOPT_HEADER,1);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER  ,1);
    curl_setopt($ch, CURLOPT_VERBOSE  ,1);
    curl_setopt($ch, CURLOPT_STDERR  , $f);
    
    //execute post
    $output = curl_exec($ch);
    
    
    $error = curl_error($ch);
    $http_code = curl_getinfo($ch ,CURLINFO_HTTP_CODE); 
    
    fclose($f);
    
    echo $http_code . "<br />";
    
    echo $output; 
    
    echo $error; 
    
    curl_close($ch); 
    
    ?>
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么