C#WebApi如何从HttpPostedFile获取完整的图像

时间:2018-10-07 14:22:10

标签: c# asp.net-web-api httppostedfilebase

这里我正在使用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?

1 个答案:

答案 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