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

C# WebApi How can i get complete Image from HttpPostedFile

这里我使用的是 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

我的 Class 文件为

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?

我想您可能想了解如何在 .Net 中使用 Streams?首先在这里使用流而不是字符串:

public class SendMailRequest
{
  public Stream FileContent { get; set; }
  public string FileName { get; set; }
}

然后,因为它完全令人困惑,所以将您的 reader 重命名为 writer

然后,不要对您的 Stream 做任何有约束力的事情,只需做:

await mailModel.filecontent.CopyToAsync(writer);

这里有一个复杂的问题。此代码假定原始上传的文件流在您尝试发送电子邮件时仍然存在并在内存中工作。这是否属实取决于两者之间发生的情况。

特别是,如果 Http 请求处理已经完成并且在电子邮件发送之前返回了响应,则文件内容流可能已经消失了。 has 比较稳妥的做法是直接在controller里做copy:

file.InputStream.CopyToASync(mailModel.filecontent)

但此时我不得不说,我宁愿 (1) 直接复制到文件或 (2) 复制到 MemoryStream。即

mailModel.filecontent= new MemoryStream();
file.InputStream.CopyToASync(mailModel.filecontent)

(如果您使用 MemoryStream,您必须计算您愿意处理的最大文件是多少,并确保在创建内存流之前拒绝更大的文件)。

最后,如果这会使用 Base64 而不是二进制文件填充您的文件,请查看此问题的答案: