【问题标题】:Upload file error from client side ( jquery )从客户端上传文件错误(jquery)
【发布时间】:2019-07-07 20:32:31
【问题描述】:

我正在尝试通过使用 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 () {
                                    });                          

                });         
            });
        }());

【问题讨论】:

  • 如果选择了多个文件,我不想等待它们被上传。相反,我想在后台将上传内容踢到一些异步任务以返回我的 jquery 调用。并在另一个 javascript 调用中检查上传状态!
  • 请在初始帖子正文中输入客户端代码。谢谢

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


【解决方案1】:

这种行为是预期的,因为请求在“完成”时被关闭/处置 - 在这种情况下,当您 return true 时。请求/响应相关的对象在该点之后将无法使用,这正是您试图通过延迟从输入流读取来做的事情。

修复:

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

【讨论】:

  • 并行使用 从客户端上传多个文件的最佳方法是什么。我的意思是将文件发布到服务器并显示每个文件上传状态的进度?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-22
  • 2017-08-21
  • 2021-03-19
  • 1970-01-01
  • 2012-02-03
  • 2023-04-09
  • 2016-06-17
相关资源
最近更新 更多