在服务器端,我有一个包含标准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
显示在表单附件中发现的邮件消息。
我可以在这里用一个附件文件附加一个示例消息XML。
由于我在许多其他情况下使用过它们,所以我对代码的几乎任何一行都很确定,但由于某种原因,这里没有。
哪里出错了?
1条答案
按热度按时间jgwigjjp1#
由于某种原因,
ContentStream
上的位置必须重置为其原点。添加
在...之上
会修好的。
现在问题可能出在客户端的流写入编码上,乍一看,它看起来像是原始邮件XML文件中包含的附件数据(因此是
Base64
或类似的内容)。