0

だから私は、キャリアアプリケーションをWebサービスに送信し、フォーム内の他の要素とともにファイルを添付ファイルとして人事部に電子メールで送信するコードをいくつか持っています。ファイルを除くすべての部分は、必要に応じて電子メールで送信されます。ファイルは破損することなくサーバーにアップロードされます。しかし、結果として得られる電子メールの添付ファイルは破損してしまいます。

問題は; ファイルは EOF に達する前に突然終了します。元のファイルと縮小サイズのファイルの両方をテキストエディターで開くと、それが pdf ファイルであるとしましょう。一方が突然終了するまで、最初が同じであることがわかります。そのうちの 1 つは約 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//== のような文字列として読み取られると、何か意味がある場合は常に 2 つの "==" 記号で終わります。

この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 バージョンとほぼ同じです。

4

1 に答える 1

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

今では動作します。

于 2013-11-15T15:47:48.303 に答える