ASP.NET通过MemoryStream下载电子邮件附件失败

qgzx9mmu  于 2023-02-14  发布在  .NET
关注(0)|答案(1)|浏览(155)

在服务器端,我有一个包含标准System.Net.Mail.MailMessage的XML序列化文件,其中可能包含附件,我设计了一个表单,允许用户下载这些附件。
附件下载由以下代码控制:

private byte[] ReadFully(Stream input)
{
    byte[] _buffer = new byte[16 * 1024];

    using (MemoryStream _ms = new MemoryStream())
    {
        int _read;

        while ((_read = input.Read(_buffer, 0, _buffer.Length)) > 0)
        {
            _ms.Write(_buffer, 0, _read);
        }

        return _ms.ToArray();
    }
}

protected void bntViewAttachment_Click(object sender, EventArgs e)
{
    string _filename = Request.QueryString["file"];

    if (!string.IsNullOrWhiteSpace(_filename))
    {
        MailMessage _message = MailMessageSerializer.Create(Path.Combine(Path.GetFullPath(Path.Combine(Server.MapPath("~"), OUTBOUND_FOLDER)), _filename));

        try
        {

            int _selected = lbAttachments.SelectedIndex;

            if (_selected != -1)
            {
                Attachment _attachment = _message.Attachments[_selected];

                byte[] _data = ReadFully(_attachment.ContentStream);

                if (_data.Length > 0)
                {
                    Response.Clear();
                    Response.ContentType = MimeMapping.GetMimeMapping(_attachment.Name);
                    Response.AddHeader("Content-Disposition", string.Format("attachment;  filename={0}", _attachment.Name));
                    Response.BinaryWrite(_data);
                    Response.End();
                }
                else
                {
                    lblStatus.Text = "Attachment empty";
                }
            }
        }
        catch (Exception ex)
        {
            lblStatus.Text = "Exception : " + ex.Message;
        }
    }
}

电子邮件文件由Request.QueryString["file"]提供。当然,这不是最安全的操作方式,但现在我有一个更大的问题,因为下载根本不工作...因为_data.Length == 0所有的时间。lbAttachmentsListBox显示在表单附件中发现的邮件消息。
我可以在这里用一个附件文件附加一个示例消息XML。
由于我在许多其他情况下使用过它们,所以我对代码的几乎任何一行都很确定,但由于某种原因,这里没有。
哪里出错了?

jgwigjjp

jgwigjjp1#

由于某种原因,ContentStream上的位置必须重置为其原点。
添加

input.Seek(0, SeekOrigin.Begin);

在...之上

private byte[] ReadFully(Stream input)

会修好的。
现在问题可能出在客户端的流写入编码上,乍一看,它看起来像是原始邮件XML文件中包含的附件数据(因此是Base64或类似的内容)。

相关问题