【问题标题】:How to download file with $.ajax and get raw content of attachment email, using PHP如何使用 $.ajax 下载文件并使用 PHP 获取附件电子邮件的原始内容
【发布时间】: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() 子句中所做的事情。

标签: php ajax download binary


【解决方案1】:

我只是快速浏览了一下图书​​馆。 Attachment::getContent() 返回实际内容。所以你需要:

ob_clean();
echo $file;
flush()

正如我在第一条评论中所述,readfile() 采用指向文件的 URL,而不是文件内容。

如果您确实需要通过 Ajax 下载文件,请查看download file using an ajax request。最简单的方法是不使用 Ajax。

顺便说一句:我怀疑这是否适用于多个附件。每个请求只能发送一个文件。

【讨论】:

  • 感谢您的回复。我有关于你的提示的更新问题。
猜你喜欢
  • 2011-09-06
  • 1970-01-01
  • 2020-03-18
  • 2015-01-23
  • 2016-06-22
  • 1970-01-01
  • 1970-01-01
  • 2012-06-22
  • 1970-01-01
相关资源
最近更新 更多