【问题标题】:Async web api method to store files on disk but additional save each on to database将文件存储在磁盘上的异步 Web api 方法,但将每个文件额外保存到数据库
【发布时间】:2016-12-30 13:31:16
【问题描述】:

我注意到,由于异步上传小部件的性质,我正在使用我的 web api 方法在多个线程上调用,每个线程对应一个正在上传的文件。我正在尝试将此与将所有文件保存到数据库中相结合。我不确定它现在究竟是如何工作的,但在所有照片记录的最后,所有照片记录都保存到数据库中。问题是我无法为它们中的每一个设置正确的排序顺序,除了最后一个之外,它们的 SortOrder 均为 1。

这是我的 web api 方法,它的行为非常奇怪:

[HttpPost("{id}/photos")]
public IActionResult SavePhotos(int id, IEnumerable<IFormFile> photos)
{
    if (photos != null)
    {
        var product = _unitOfWork.Products.GetProductWithPhotos(id);

        foreach (var photo in photos)
        {
            if (photo.Length > 0)
            {
                var productPhotosPath = Path.Combine(_environment.WebRootPath, _settings.ProductUploadPath, product.Name);

                string randomFileName = Path.GetRandomFileName();
                randomFileName = Path.ChangeExtension(randomFileName, Path.GetExtension(photo.FileName));
                using (var fileStream = new FileStream(Path.Combine(productPhotosPath, randomFileName), FileMode.Create))
                {
                    photo.CopyTo(fileStream);
                }

                int maxSortOrder = product.Photos.Any() ? product.Photos.Max(p => p.SortOrder) : 0;
                Photo photoToSave = new Photo()
                {
                    ProductId = product.Id,
                    OriginalImageName = photo.FileName,
                    SavedImageName = randomFileName,
                    SortOrder = maxSortOrder + 1
                };

                _unitOfWork.Photos.Add(photoToSave);
            }
        }

        _unitOfWork.Complete();
    }

    return new EmptyResult();
}

【问题讨论】:

  • 它们应该如何排序?是先到先得吗?也许让客户指定排序顺序更好?如果它取决于服务器,您将需要某种类型的同步上下文,如果这应该可以扩展到服务器场,则可能必须跨服务器运行。或者,您可以让数据库使用标识列自动增加它们的排序顺序。或者,排序顺序可能无关紧要,您可以按分配的图像 ID 进行排序,该 ID 应该与接收图像的时间相关。
  • 你有没有尝试在foreach循环之前设置maxSortOrder并在循环中加1?
  • @Igor SortOrder 非常重要。我更喜欢默认排序值与用户选择要上传的多个文件的顺序相同。但如果不是这样,那么只要 Amy 随机排序,只要它们被排序为.. 1,2,3,4,5... 我已经有一个重新排序功能,可以在用户拖放之后修改 SortOrders一张照片到另一个地方。但这是我无法实施的初始排序顺序。用户无法控制它。
  • 您可以控制客户端代码吗?如果是这样,您需要指定排序顺序并将其与文件一起发送到服务器。如果没有,则根本不要设置排序顺序,因为服务器不知道它,服务器上的操作顺序!= 预期的排序顺序,正如您已经发现的那样。如果您发现上传时难以指定排序顺序,您还可以添加第二种方法,以便在上传完成后根据选择对图片进行排序。
  • @Igor 是的,我认为最好的选择是利用这个:docs.telerik.com/kendo-ui/api/javascript/ui/… 并在 e.Data 中创建键/值对,作为附加参数发送。有意义吗?

标签: c# entity-framework asynchronous asp.net-web-api asp.net-core


【解决方案1】:

当您进行 5 个 asyc 调用时,是否有可能同时发生 3 个调用,并且当这 3 个调用被击中时,数据库中没有任何照片使其排序顺序为 1,其余 2 个调用被击中在使用排序顺序 1 保存前 3 个调用后,它们的排序顺序为 2。

如何将创建的时间戳保存在数据库中并使用时间戳对其进行排序?如果您需要排序顺序属性,则有一个未映射的属性,该属性将根据创建的时间戳进行分配。

【讨论】:

    猜你喜欢
    • 2016-07-22
    • 2013-12-19
    • 2010-09-23
    • 2010-11-08
    • 2021-05-09
    • 1970-01-01
    • 2018-09-14
    • 2012-01-20
    • 2021-11-03
    相关资源
    最近更新 更多