Как исправить ошибку InputStream ReadTimeout при загрузке файла

#javascript #c# #asp.net-mvc #file-upload #email-attachments

#javascript #c# #asp.net-mvc #загрузка файла #электронная почта-вложения

Вопрос:

Моя настройка: asp.net веб-приложение mvc с простой формой электронной почты с загрузкой файла и кнопкой отправки.

Электронное письмо отправлено правильно, и файлы прикреплены — но вложения пусты. Отладка контроллера выдает InputStream.ReadTimeout в выражении var myFiles = model.MyFiles; (см. Приведенный ниже код контроллера).

Модель (только части)

 public List<HttpPostedFileBase> MyFiles { get; set; }
public List<EmailAttachments> Attachments { get; set; }
  

HTML

 <form id="data" method="post" enctype="multipart/form-data">
    <input id="files" type="file" aria-label="files" multiple="multiple" name="MyFiles">
</form>

<input type="button" class="btn k-button k-primary" id="send" value="Send" />
  

Javascript

  $(function () {

    $("#send").click(function () {
         var form = $("#data");
         var formData = new FormData(form[0]);

         var files = form.find("#files")[0].files;

         $.each(files, function() {
           var file = $(this);
           formData.append(file[0].name, file[0]);
         });

         $.ajax({
             type: "POST",
             url: url,
             data: formData,
             contentType: false,
             processData: false,
             success: function (response) {
                 alert("Success");
             },
             error: function (response) {
                 alert("Error");
             }
         });

    });
  

Контроллер

 [HttpPost]
public ActionResult SendCompanyEmail(GeneralEmailViewModel model)
{
    ...
    var myFiles = model.MyFiles; // here occurs the ReadTimeout
    if (myFiles != null)
    {
        foreach (var file in myFiles)
        {
            if (file != null amp;amp; file.ContentLength > 0)
            {
                MemoryStream stream = new MemoryStream(file.ContentLength);
                stream.Position = 0;
                attachements.Add(new EmailAttachments
                {
                    FileName = file.FileName,
                    ContentType = file.ContentType,
                    Stream = stream,
                });
            }
        }
    }
// ... code for sending the email ...
}
  

Любые предложения, в чем может быть причина ReadTimeout и как это исправить?

Ответ №1:

Код контроллера для сборки вложений был неисправен. Я нашел рабочий код:

     if (myFiles != null)
    {
        foreach (var file in myFiles)
        {
            if (file != null amp;amp; file.ContentLength > 0)
            {
                //MemoryStream stream = new MemoryStream(file.ContentLength);
                //stream.Position = 0;
                attachements.Add(new EmailAttachments
                {
                    FileName = file.FileName,
                    ContentType = file.ContentType,
                    Stream = file.InputStream
                });

            }
        }
    }
  

Сообщение InputStream.ReadTimeout все еще можно прочитать при отладке контроллера. Является ли это просто бесполезным сообщением, не имеющим значения, я не смог выяснить.

В любом случае, подход, описанный в моем исходном сообщении с приведенным выше исправлением, работает должным образом для загрузки файлов и преобразования их во вложения электронной почты.