【问题标题】:MailMessage Attachment to byte[]MailMessage 附加到字节 []
【发布时间】:2021-03-21 00:16:15
【问题描述】:

过去 3 天我一直在搜索 Google/SO,但没有成功,希望有人可以帮助或指出正确的方向。

我们有一个发送电子邮件的方法(有一堆重载)。我的任务是将电子邮件保存到数据库中。

问题

如何将附件的内容提取到byte[] 中以便将其保存到数据库中?

我已经阅读了很多将附件保存到磁盘的示例,但是我想避免先保存到磁盘然后再将其读入内存(也许这就是为什么我没有找到任何东西的原因,因为这是不可能的,对此表示怀疑)。

【问题讨论】:

  • 你知道附件是什么吗?您想将附件作为字节存储在数据库中吗?
  • @MicahArmantrout 我不知道附件是什么,可能是图像、excel、doc、pdf 等。是的,我想以byte[] 的形式存储在 db 中
  • 最好将文件路径保存在数据库中,并将文件保存在磁盘上
  • @MarkNg 我知道。遗憾的是,这不是他们想要的。

标签: c# database attachment mailmessage


【解决方案1】:

所以我认为您要问的是如何将流转换为字节,然后您就不必将其保存到磁盘。您可以使用此扩展方法来做到这一点。

public static class StreamExtensions
{
    public static byte[] ReadAllBytes(this Stream instream)
    {
        if (instream is MemoryStream)
            return ((MemoryStream) instream).ToArray();

        using (var memoryStream = new MemoryStream())
        {
            instream.CopyTo(memoryStream);
            return memoryStream.ToArray();
        }
    }
}

https://stackoverflow.com/a/33611922/237109

用那个方法你可以做到这一点

System.Net.Mail.MailMessage m = new MailMessage();
foreach (var element in m.Attachments)
{
  byte[] bytes = element.ContentStream.ReadAllBytes()
   element.ContentType // you will want to save this as well so you can convert it to a file when you need to pull it back out of the database.
}

【讨论】:

  • 有趣的是它不起作用。结果总是0x。我检查了element.ContentStream.Length,确实得到了一个> 0的值,但是ReadAllBytes()和其他帖子中的其他方法总是什么都不返回。 =(旁注,在测试页面上,我确保上传文件正常工作并且确实如此(电子邮件确实发送了预期的附件),但显然在这个阶段发生了一些事情。=(
  • 好的,所以我将这个逻辑分开来自己测试它并且它可以工作。好的开始,现在我只需要弄清楚这个方法发生了什么。感谢您指导正确的方向!
  • 好的,所以我发现了问题(我不知道)。我们的SendMail() 方法接受IEnumerable<Attachment> 的附件。然后它将它与其他字段一起传递以构建MailMessage 对象。正是在这一点上,我试图获取原始附件的Stream。经过进一步的测试,我意识到它们 Stream 只能被读取一次,并且在创建 MailMessage 对象时我丢失了它。
  • 是的,流只能读取一次,但您可以保存字节并重新使用它,或者如果需要重新设置流
  • 好的。我将不得不看看如何“重置流”随时让我知道如何。谢谢
猜你喜欢
  • 2015-04-29
  • 2018-02-18
  • 2011-05-15
  • 2023-03-09
  • 2011-07-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多