Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MailMessage附件到字节[]_C#_Database_Attachment_Mailmessage - Fatal编程技术网

C# MailMessage附件到字节[]

C# MailMessage附件到字节[],c#,database,attachment,mailmessage,C#,Database,Attachment,Mailmessage,在过去的3天里,我一直在搜索Google/SO,但都没有成功,我希望有人能帮助我,或者为我指明正确的方向 我们有一个发送电子邮件的方法(有很多重载)。我的任务是将电子邮件保存到数据库中 问题 如何将附件的内容提取到字节[],以便将其保存到数据库中 我读过很多将附件保存到磁盘的示例,但我希望避免先保存到磁盘,然后再将其读取到内存中(可能这就是为什么我没有找到任何东西,因为这是不可能的,对此表示怀疑)。所以我想你要问的是如何将流转换为字节,这样你就不必将其保存到磁盘。您可以使用此扩展方法来实现这一点

在过去的3天里,我一直在搜索Google/SO,但都没有成功,我希望有人能帮助我,或者为我指明正确的方向

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

问题

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


我读过很多将附件保存到磁盘的示例,但我希望避免先保存到磁盘,然后再将其读取到内存中(可能这就是为什么我没有找到任何东西,因为这是不可能的,对此表示怀疑)。

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

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();
        }
    }
}

用这种方法你可以做到这一点

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.
}

你知道附件是什么吗?您想将附件以字节形式存储在数据库中吗?@MicahArmantrout我不知道附件是什么,它可能是图像、excel、文档、pdf等。是的,我想以
byte[]
的形式存储在数据库中,您最好将文件路径保存在数据库中,并将文件保存在数据库中disk@MarkNg我知道。可悲的是,这不是他们想要的。有趣的是,这不起作用。结果总是
0x
。我检查了
element.ContentStream.Length
,确实得到了一个大于0的值,但是
ReadAllBytes()
和其他来自其他帖子的方法总是不返回任何内容=(旁注,在一个测试页面上,我确保上传文件工作正常,确实如此(电子邮件确实发送了预期的附加文件),但显然在这个阶段发生了一些事情=(好的,所以我把这个逻辑分离出来,单独测试它,它就可以工作了。好的开始,现在我只需要找出这个方法中发生了什么。谢谢你给我提供了正确方向的指导!好的,所以我发现了问题(我没有意识到)。我们的
SendMail()
方法接受附件的
IEnumerable
。然后将其与其他字段一起传递,以构建
MailMessage
对象。正是在这一点上,我尝试获取原始附件的
Stream
。在进一步测试后,我意识到它们
Stream
只能读取一次,因此我得到了los在创建
MailMessage
对象时启动。是的,流只能读取一次,但您可以保存字节并重新使用,或者在需要时重置steam。我必须了解如何“重置流”,请随时告诉我如何进行。thnaks