#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 все еще можно прочитать при отладке контроллера. Является ли это просто бесполезным сообщением, не имеющим значения, я не смог выяснить.
В любом случае, подход, описанный в моем исходном сообщении с приведенным выше исправлением, работает должным образом для загрузки файлов и преобразования их во вложения электронной почты.