使用cURL将文件发送到使用XML的Web服务会破坏它

时间:2013-10-07 01:49:50

标签: php curl

所以我有一些代码将职业应用程序发送到Web服务,然后将该文件作为附件通过电子邮件发送到hr部门以及表单中的其他元素。除文件外的所有部分都会根据需要通过电子邮件发送。该文件上传到服务器而不会被破坏。但由此产生的电子邮件附件最终会被破坏。

问题是;文件在到达EOF之前突然结束。让我们说它是一个pdf文件,当我在文本编辑器中打开原始文件和缩小文件时,我看到开头是相同的,直到其中一个突然结束。其中一个约为1MB,腐败的约为600kB。

我尝试发送比生成的损坏文件更小(4kB)的文件,但该文件也以同样的方式损坏。生成的文件大约是1kB。

我得到的xml回复说:

<?xml version="1.0" encoding="utf-8"?><SENDEMLRSP><RTCD>1</RTCD><EXP>OK</EXP><RSP_LIST><RSP><MSGID>0</MSGID><EID /><RESULT>Invalid length for a Base-64 char array or string.</RESULT></RSP></RSP_LIST></SENDEMLRSP>

感兴趣的是这部分:

<RESULT>Invalid length for a Base-64 char array or string.</RESULT>

我准备了一个只有文件上传的小表单用于测试目的。

这是HTML:

<html>
    <body>

    <form action="upload_file.php" method="post" enctype="multipart/form-data">
    <label for="file">Filename:</label>
    <input type="file" name="file" id="file"><br>
    <input type="submit" name="submit" value="Submit">
    </form>

    </body>
</html>

以下是相关的PHP代码:

if(isset($_FILES['file']['name']))  
            {
            echo ($_FILES['file']['name']);
            echo ($_FILES['file']['tmp_name']);
            $target = $_FILES['file']['name'];


            move_uploaded_file( $_FILES['file']['tmp_name'], $target);

            $rawdata = file_get_contents($target);

            $data = urldecode($rawdata);
            $data = base64_encode($rawdata);


            //error_log('uploadconvertscope');


            $iletisimrcpt = '<RCPT>
                           <TA>someemail@address.com</TA>
                           <MSG>kgsg</MSG>
                           <SBJ>'. strlen($rawdata).'</SBJ>
                           <OBOE>'.OBOE.'</OBOE>
                           <OBON>'.OBON.'</OBON>
                           <ATT_LIST><ATT><FN>'.$_FILES['file']['name'].'</FN><DATA>'.$data.'</DATA></ATT></ATT_LIST>
                  </RCPT>';


          $request = '<?xml version="1.0" encoding="utf-8"?>
               <SENDEML>
                   <VERSION>1.0</VERSION>
                   <TOKEN>'.$token.'</TOKEN>
                   <JID>'.JOBID.'</JID>
                   <MSG>Kariyar Basvuru isteði baþarýyla yerleþtirildi.</MSG>
                   <SBJ>Kariyar Basvuru</SBJ>
                   <RCPT_LIST>
                   '.$iletisimrcpt.'
                   </RCPT_LIST>
               </SENDEML>';
        error_log($request );
        $params = array('data' => $request);

        $response = processRequest(EML_URL, $params);

        error_log($response );
        $xml = new SimpleXmlElement($response);
        }

processRequest函数与消息的其余部分一起使用。所以它可能不是问题,但这里是代码:

<?php

        function processRequest($url, $params) {

        if(!is_array($params))

        return false;

        $post_params = "";

        foreach($params as $key => $val) {

        $post_params .= $post_params?"&":"";

        $post_params .= $key."=".$val;

        }

        $ch = curl_init();

        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

        curl_setopt($ch, CURLOPT_URL, $url);

        curl_setopt($ch, CURLOPT_POST, 1);

        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

        curl_setopt($ch, CURLOPT_VERBOSE, 0);

        curl_setopt($ch, CURLOPT_TIMEOUT, 0);

        curl_setopt($ch, CURLOPT_HEADER, false); // 'true', for developer testing purpose

        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');

        curl_setopt($ch, CURLOPT_POSTFIELDS, $post_params);

        $data = curl_exec($ch);

        if(curl_errno($ch))

        print curl_error($ch);

        else

        curl_close($ch);

        return $data;

        }

        ?>

当文件看起来像AHFAY3453GAW之间的字符串// LONG RANDOM STRING OF CHARACTERS // ==它总是以两个“==”符号结束,如果这意味着什么。

我真的很难过,因为这些C#代码正确上传了文件:

        byte[]  attach1 = File.ReadAllBytes(@"C:\Users\user\Downloads\amb.pdf");
        string attach = Convert.ToBase64String(attach1);
        EmlRequest.SetConnectionInformation("someapi.com", "admin", "password");
        EmlRequest eml=new EmlRequest(){  MessageJobId="DASFA1SDFAWEFA4X2==" };
        eml.Recipients.Add(new ApiEmlRecipient() { TargetAddress = "email@address.com" ,ToName="name",Message="xxx",Subject="subject"});
        eml.Recipients[0].Attachments.Add(new ApiEmlAttachment() { FileName = "abm.pdf", Data = attach });
        eml.Send();

这几乎与它的PHP版本相同。

1 个答案:

答案 0 :(得分:0)

我很久以前就想到了这一点,但只能写下答案。

所以问题是字符串中的“+”符号被空格替换。

这一点是负责任的:

$rawdata = file_get_contents($target);
$data = urldecode($rawdata);
$data = base64_encode($rawdata);

我把它更改为:

$rawdata = file_get_contents($_FILES['uploadedfile']['tmp_name']);
$data = base64_encode($rawdata);
$data = urlencode($data);

现在可行。