这里我正在使用WebApi,我想要一张用于发送电子邮件的图像,为此,我将代码编写为:
var files = HttpContext.Current.Request.Files;
if (files.Count > 0) {
for (int i = 0; i < files.Count; i++) {
HttpPostedFile file = files[i];
mailModel.filename = file.FileName;
mailModel.filecontent = file.InputStream;
}
}
这里我如何绑定mailModel.Filecontent
我的班级文件为
public class SendMailRequest
{
public string filecontent { get; set; }
public string filename { get; set; }
}
我的邮件发送代码为:
if (mailModel.filename != null) {
string tempPath = WebConfigurationManager.AppSettings["TempFile"];
string filePath = Path.Combine(tempPath, mailModel.filename);
using(System.IO.FileStream reader = System.IO.File.Create(filePath)) {
byte[] buffer = Convert.FromBase64String(mailModel.filecontent);
reader.Write(buffer, 0, buffer.Length);
reader.Dispose();
}
msg.Attachments.Add(new Attachment(filePath));
如何将文件绑定到FileContent?
答案 0 :(得分:1)
我认为您可能想了解有关在.Net中使用Streams的知识?首先在这里使用Stream而不是字符串:
public class SendMailRequest
{
public Stream FileContent { get; set; }
public string FileName { get; set; }
}
然后,因为这非常令人困惑,请将您的reader
重命名为writer
。
然后,不要对您的Stream做任何严格的操作,只需执行以下操作:
await mailModel.filecontent.CopyToAsync(writer);
这里很复杂。此代码假定您尝试发送电子邮件时,原始的上载文件流仍然存在并且在内存中正常工作。这是否成立取决于两者之间发生的情况。
尤其是,如果Http请求处理已完成并且在发送电子邮件之前已返回响应,则文件内容流可能已经消失。有一个更安全的方法是立即在控制器中进行复制:
file.InputStream.CopyToASync(mailModel.filecontent)
但是在这一点上我不得不说,我宁愿要么(1)直接复制到文件中,要么(2)复制到MemoryStream中。即
mailModel.filecontent= new MemoryStream();
file.InputStream.CopyToASync(mailModel.filecontent)
(如果使用MemoryStream,则必须计算出您愿意处理的最大文件是什么,并在创建内存流之前确保拒绝较大的文件)。
最后,如果这使用Base64而不是二进制文件填充文件,请查看以下问题的答案:HttpRequest files is empty when posting through HttpClient