从客户端上传文件错误(jquery)

时间:2019-02-13 21:36:59

标签: c# jquery file-upload async-await task-parallel-library

我正在尝试通过使用jQuery将表单发布到我的控制器操作方法中来从javascript上传文件。我不想等待结果,想立即返回。这就是为什么我叫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 :(得分:1)

当请求“完成”时(在这种情况下,当您return true时),请求被关闭/处分是预期的行为。在那一点之后,与请求/响应相关的对象将无法使用,而这正是您通过延迟从输入流中读取内容来尝试执行的操作。

修复:

  • 使服务器端代码通常将文件存储为请求的一部分,但在客户端不等待结果
  • 将输入流读入MemoryStream并将其保存到文件中。可能不适用于大文件。