【发布时间】: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