【问题标题】:Asynchronous file upload in ASP.NET CoreASP.NET Core 中的异步文件上传
【发布时间】:2019-01-26 17:56:19
【问题描述】:

我正在使用 ASP.NET Core 异步上传多个文件。一旦用户单击浏览并选择多个文件,请求就会发送到服务器。它们是同时处理的,所以调试看起来很奇怪。

我希望允许用户一次上传多个文件,但按以下方式按顺序处理它们:

File1:保存到文件系统并将有关文件的信息存储在数据库中。
File2:当 File1 中的所有内容都完成后,保存到文件系统并将有关文件的信息存储在数据库中。
File3:当 File2 中的所有内容都完成后,保存到文件系统并将有关文件的信息存储在数据库中。

我面临的问题是 File2 数据库信息依赖于 File1 中的数据,File3 数据库信息依赖于 File2 中的数据...我想调用数据库以获取上一个文件来执行此操作,但我不能,因为由于一切都在处理,它从未存在过。

我正在使用的上传器控件有一个设置:SequentialUpload。 根据描述,这个设置似乎应该有助于我想要的东西,但在调试器中它看起来仍然很奇怪,我无法按顺序处理。

启用sequentialUpload 属性后,选定的文件将 按顺序(一个接一个)处理到服务器。如果文件 上传成功或失败,下一个文件会上传 自动在此顺序上传中。

下面是我的服务器端函数的样子,不包括保存到数据库的信息,因为那是业务逻辑:

// Upload method for chunk-upload and normal upload
public IActionResult Save(IList<IFormFile> UploadFiles)
{
    long size = 0;
    // for normal upload
    try
    {
        foreach (var file in UploadFiles)
        {
            var filename = ContentDispositionHeaderValue
                            .Parse(file.ContentDisposition)
                            .FileName
                            .Trim('"');
            filename = hostingEnv.WebRootPath + $@"\{filename}";
            size += file.Length;
            if (!System.IO.File.Exists(filename))
            {
                using (FileStream fs = System.IO.File.Create(filename))
                {
                    file.CopyTo(fs);
                    fs.Flush();
                }

                // LOGIC TO RETRIEVE INFO ABOUT PREVIOUSLY STORED FILE FROM DB HERE
                // LOGIC TO STORE INFO ABOUT CURRENT FILE TO DB HERE
            }
        }
    }
    catch (Exception e)
    {
        Response.Clear();
        Response.StatusCode = 204;
        Response.HttpContext.Features.Get<IHttpResponseFeature>().ReasonPhrase = "File failed to upload";
        Response.HttpContext.Features.Get<IHttpResponseFeature>().ReasonPhrase = e.Message;
    }
    return Content("");
}

如果 File1 被处理然后我最终在客户端上的成功函数中将是完美的,然后 File2 被启动等等......相反,我总是在所有处理完成后最终在成功函数中。

【问题讨论】:

    标签: c# html asp.net-mvc asp.net-core syncfusion


    【解决方案1】:

    您似乎在一个请求中发送所有文件,因此您将只有一个返回。

    如果我做对了,您需要为每个请求发送一个文件,这样您就可以成功调用每个文件,然后您就可以在级联中同步文件的 kick使用回调。

    【讨论】:

    • 我开始考虑这个问题,我认为与其一次性发送它们,不如简单地做一个标准的 AJAX 调用来发布表单数据。就像您将使用带有 .net 核心的 AJAX 手动发布表单一样。这有意义吗?我无法弄清楚如何发送文件,因为它们没有绑定到服务器端的 IList
    • 我通常从上下文“context.Request.Files”中获取文件。 upload file using jquery
    【解决方案2】:

    当使用顺序上传 API 时,选择的文件将被一个一个发送到服务器。第一个文件被处理后,无论成功或失败,第二个文件开始上传。 您可以在此sample 中进行验证。

    另外,请确保您使用的是 Syncfusion ej2 软件包版本 16.4.40 或更高版本。如果您仍然面临同样的问题,请还原足以复制该问题的示例或代码。这将有助于提供解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-02
      • 2013-04-20
      • 1970-01-01
      • 1970-01-01
      • 2018-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多