所以我有一些代码将职业应用程序发送到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版本相同。
答案 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);
现在可行。