2013-10-07 71 views
0

因此,我有一些代碼將職業應用程序發送到web服務,然後將該文件作爲附件通過電子郵件發送到hr部門,以及表單中的其他元素。除文件外的所有部分都會根據需要通過電子郵件發送。文件被上傳到服務器而不被損壞。但最終的電子郵件附件最終被損壞。使用cURL將文件發送到帶有XML的web服務會破壞它

問題是;該文件在到達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>[email protected]</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 //長隨機數序列// ==它總是與兩端之間的串讀「= =「標誌,如果這意味着什麼。

我真的難倒的文件遭到上傳與此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 protected]" ,ToName="name",Message="xxx",Subject="subject"}); 
     eml.Recipients[0].Attachments.Add(new ApiEmlAttachment() { FileName = "abm.pdf", Data = attach }); 
     eml.Send(); 

這幾乎等同於它的PHP版本。

回答

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); 

現在,它的工作原理。

相關問題