Как загрузить файл за $. ajax и получить необработанное содержимое вложения электронной почты, используя PHP - PullRequest
1 голос
/ 05 мая 2020

У меня есть база данных, в которой хранятся все сообщения электронной почты в необработанном режиме.

Я извлекаю данные с помощью хорошей библиотеки 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);

Request and Response of script

As Судя по ответу, все кажется правильным, но ответа нет.

  • Размер вложения правильный ... У меня есть только строка для его вычисления. Я не хочу загружать в файловую систему.

  • Если я изменю клиентский запрос ajax с «asyn c: false» на «asyn c: true», chrome консоль выдает мне ошибку «net :: ERR_CONTENT_LENGTH_MISMATCH».

Где я ошибаюсь?

Я не хочу доходить до того, что чтобы каждый раз загружать сообщения на сервер, а затем использовать простой URL-адрес для их восстановления, поскольку у меня уже есть все в базе данных.

Какое решение я могу использовать?

Спасибо!

## UPDATE
ob_clean();
echo $file;
flush();

Эта процедура возвращает это в консоли, но загрузка не начинается.

enter image description here

1 Ответ

0 голосов
/ 05 мая 2020

Я только что бегло просмотрел библиотеку. Attachment :: getContent () возвращает фактическое содержимое. Итак, вам нужно:

ob_clean();
echo $file;
flush()

Как указано в моем первом комментарии, readfile () принимает URL-адрес, указывающий на файл, а не на его содержимое.

Если вам действительно нужно загрузить файл через Ajax, проверьте файл загрузки с помощью запроса ajax . Самый простой способ - сделать это без Ajax.

Кстати: я сомневаюсь, что это будет работать с несколькими вложениями. Вы можете отправить только один файл за один запрос.

...