Получение байта [] из декодированной части MIME base64 - PullRequest
0 голосов
/ 24 августа 2018

Мы получаем файлы от различных объектов, которые могут содержать части MIME (которые представляют собой PDF-файлы) в кодировке base64. Мы извлекаем его и храним, чтобы открыть позже. Это работало хорошо для всех, кроме одного из лиц. Их файлы сохранятся, но не смогли их открыть.

Вот код:

        public byte[] GetAttachmentByName(string name)
    {
        foreach (var attachment in _mimeMessage.BodyParts.OfType<MimePart>())
        {
            if (attachment.ContentId != name)
                continue;

            using (var stream = new System.IO.MemoryStream())
            {
                using (var filtered = new FilteredStream(stream))
                {
                    filtered.Add(DecoderFilter.Create("base64"));
                    attachment.ContentObject.DecodeTo(filtered);

                    return stream.ToArray();
                }
            }
        }

        return null;}

Вот как выглядит часть MIME:

MIME-версия: 1.0 Content-Type: multipart / related; граница = "= - antAW7IrKfe1DvH3559M9g =="

...

- = - antAW7IrKfe1DvH3559M9g == Тип контента: приложение / pdf Content-Transfer-Encoding: base64 Content-Описание: Content-Id: "AC13127925.pdf"

...

bGVyDTw8IA0vU2l6ZSAxODkgDS9Sb290IDE4OCAwIFIgDS9JbmZvIDEgMCBSIA0 + PiANc3Rh cnR4cmVmDTU3MzU3MiANJSVFT0YN

- = - antAW7IrKfe1DvH3559M9g == -

(Я включил начало, середину и конец части MIME. В другой части файла также есть XML, но он обрабатывается просто отлично. Проблема, с которой мы столкнулись, связана с MIME / PDF.)

Любое руководство вообще приветствуется.

1 Ответ

0 голосов
/ 27 августа 2018

Метод MimeContent.DecodeTo() уже декодирует base64 для вас, поэтому вам нужно изменить свой код следующим образом:

public byte[] GetAttachmentByName(string name)
{
    foreach (var attachment in _mimeMessage.BodyParts.OfType<MimePart>())
    {
        if (attachment.ContentId != name)
            continue;

        using (var stream = new System.IO.MemoryStream())
        {
            attachment.ContentObject.DecodeTo(filtered);

            return stream.ToArray();
        }
    }

    return null;
}
...