Ошибка загрузки файла со стороны клиента (jquery) - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь загрузить файл из javascript, отправив форму с помощью jQuery в метод действия моего контроллера.Я не хочу ждать результата и хотел бы немедленно вернуться.Вот почему я звоню Task.Factory.StartNew и возвращаюсь.Но я получаю сообщение об ошибке «Не удается получить доступ к закрытому файлу в теле задачи!».Пожалуйста, сообщите.

[HttpPost] 
public bool UploadAll(HttpPostedFileBase fileSelect)
{          
    Task.Factory.StartNew<string>((st) =>
                    {
                        var file = st as HttpPostedFileBase;
                        if (file != null)
                        {
        // Here is where I get the error "cannot access the closed file!"
                            file.SaveAs("E:\\" + file.FileName);
                            return file.FileName;
                        }
                        return string.Empty;
                    }, fileSelect).ContinueWith((tsk) =>
                      {
                          Debug.WriteLine(tsk.Result);
                      });

    return true;
}

Клиентская сторона

$(function () {
                //getAllVideos();
                $('#upload').submit(function (e) {
                    e.preventDefault();

                    var files = $("#fileSelect")[0].files;
                    if (files.length > 0) {
                        if (window.FormData !== undefined) {                       
                               var formData = new FormData($(this)[0]);                                                          
                                    $.ajax({
                                        url: uploadUrl,
                                        method: "post",
                                        cache: false,
                                        contentType: false,
                                        processData: false,
                                        data: formData
                                    }).done(function (result) {
                                        alert(result);
                                    }).fail(function () {
                                    });                          

                });         
            });
        }());

1 Ответ

0 голосов
/ 14 февраля 2019

Поведение ожидается при закрытии / удалении запроса, когда он «завершен» - в этом случае, когда вы return true.Объекты, связанные с запросом / ответом, не смогут использоваться после этой точки, что именно то, что вы пытаетесь сделать, задерживая чтение из входного потока.

Исправление:

  • делает код на стороне сервера нормальнымсохранить файл как часть запроса, но на стороне клиента не ждать результата
  • прочитать поток ввода в MemoryStream и сохранить его в файл.Может не работать с большими файлами.
...