代码之家  ›  专栏  ›  技术社区  ›  Blake Rivell

异步文件上载ASP.NET核心

  •  0
  • Blake Rivell  · 技术社区  · 6 年前

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

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

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

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

    我正在使用的上载程序控件有一个设置,名为: 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("");
    }
    

    如果文件1被处理,那么我在客户机上的success函数中结束,然后File2被启动,依此类推。。。相反,在所有处理完成后,我总是在success函数中结束。

    2 回复  |  直到 6 年前
        1
  •  0
  •   Luchini    6 年前

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

    如果我做对了,你需要为每个请求发送一个文件,这样每个文件都会有一个成功调用,然后你就可以同步

        2
  •  0
  •   Prince Oliver    6 年前

    sample .

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