【发布时间】:2020-08-20 07:58:48
【问题描述】:
我有一个以原始模式存储所有电子邮件的数据库。
我用好的库https://github.com/php-mime-mail-parser/php-mime-mail-parser提取数据,特别是附件。
现在,从 html 页面我有:
$.ajax({
async: false,
type: "POST",
url: "/mail/get/attachment",
data: {
'idMail' : idMail,
'filename' : filename
},
success: function(data){
cl(data);
},
error: function(data){
}
}).done(function (data) {
});
这调用了我的方法php:
$parser = new PhpMimeMailParser\Parser();
$parser->setText($mail['rawContent']);
$attachments = $parser->getAttachments();
foreach ($attachments as $attachment) {
if ($attachment->getFilename() == $filename){
$file = $attachment->getContent();
$size = strlen($file);
@ob_start('');
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Type: application/download');
header('Content-Description: File Transfer');
header('Content-Transfer-Encoding', 'binary');
header('Content-Disposition: attachment; filename="'.basename($filename).'"');
header('Content-Length: '.$size);
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
ob_clean();
flush();
readfile($file);
正如响应所证明的那样,一切似乎都是正确的,但没有响应显示。
附件的文件大小是正确的...我只有字符串来计算它。我不想在文件系统上下载。
如果我将 ajax 客户端请求从“async:false”更改为“async:true”,chrome 控制台会给出错误“net::ERR_CONTENT_LENGTH_MISMATCH”。
我哪里错了?
我不想每次都必须在服务器上下载消息,然后使用简单的 url 来恢复它,因为我已经在数据库中拥有了所有内容。
我可以使用什么解决方案?
谢谢!
## 更新ob_clean();
echo $file;
flush();
此过程在控制台中返回此内容,但下载未开始。
【问题讨论】:
-
附件二进制数据存储在哪里?在服务器文件系统中还是在数据库中? readfile() 将文件名作为参数并输出内容。这仅在二进制数据可通过支持的 URL(例如 file://)访问时才有效。如果您在数据库中有二进制文件(据我所知,您的“我在数据库中拥有所有内容”),那么您必须回显文件内容。
-
是的,我有一个包含完整原始电子邮件内容的字段。每个下载请求我只收到一个附件。我尝试回显文件内容,但下载未开始,内容在返回控制台中返回。
-
啊,对不起,我太专注于 lib 并没有照顾 ajax。检查:stackoverflow.com/questions/20830309/…。简而言之:你需要ajax吗?没有它更简单。如果有充分的理由,请检查一些答案以及他们在 .then() 子句中所做的事情。