C # WebApi Как я могу получить полное изображение из HttpPostedFile - PullRequest
0 голосов
/ 07 октября 2018

Здесь я использую 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

Файл моего классаas

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 голосов
/ 07 октября 2018

Я думаю, что вы, вероятно, хотите узнать об использовании потоков в .Net?Сначала используйте Stream, а не string:

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 пустые при публикации через HttpClient

...