【问题标题】:Asp.Net download email attachment trough MemoryStream failureAsp.Net 通过 MemoryStream 失败下载电子邮件附件
【发布时间】:2021-12-24 02:04:07
【问题描述】:

在服务器端,我有一个包含标准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 一直都是。 lbAttachments 是显示在邮件消息内的表单附件上的ListBox

我可以使用单个附件文件 here 附加示例消息 xml。

我很确定几乎所有代码行,因为我在许多其他情况下都使用过它们,但由于某种原因,这里没有。

哪里出错了?

【问题讨论】:

    标签: c# asp.net email email-attachments memorystream


    【解决方案1】:

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

    添加

    input.Seek(0, SeekOrigin.Begin);
    

    在上面

    private byte[] ReadFully(Stream input)
    

    会解决的。

    现在问题可能是在客户端上写入的流的编码。乍一看,它与包含在原始邮件 xml 文件中的附件数据完全相同(因此是 Base64 或类似的东西)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-25
      • 1970-01-01
      相关资源
      最近更新 更多