C# 使用主键或Guid作为图像的名称
我正在做一个我朋友不久前写的小cms 有这个页面,用户可以上传一个图像,并显示在他的个人资料。我想知道保存此图像的最佳方法是什么。在这个cms中,它是这样的:首先,实体被保存到数据库中,在获得它的主键后,图像被上传到服务器,类似于C# 使用主键或Guid作为图像的名称,c#,asp.net-mvc,C#,Asp.net Mvc,我正在做一个我朋友不久前写的小cms 有这个页面,用户可以上传一个图像,并显示在他的个人资料。我想知道保存此图像的最佳方法是什么。在这个cms中,它是这样的:首先,实体被保存到数据库中,在获得它的主键后,图像被上传到服务器,类似于image-{PrimaryKey}.jpg然后再次点击数据库,用图像的全名更新同一实体。 下面是他的部分代码: 在控制器中: [HttpPost] [ValidateAntiForgeryToken] public async Task<
image-{PrimaryKey}.jpg
然后再次点击数据库,用图像的全名更新同一实体。
下面是他的部分代码:
在控制器中:
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<bool> Add([Bind(Include = "IdLanguage,Title,Address,Description,IdLinksCategory")]TblLinks tblLinks, string coverPath, string coverBase64)
{
try
{
tblLinks.IdUser = await _permissionService.GetCurrentIdUser();
tblLinks.CreatedDateTime = DateTime.Now;
await _linkService.Add(tblLinks);
if (!string.IsNullOrEmpty(coverPath))
{
byte[] fileByte = _utilityService.GetByteFromBase64String(coverBase64);
var fileType = Path.GetExtension(coverPath);
var fileName = string.Format("Link-{0}{1}", tblLinks.IdLink, fileType);
var fileMapPath = fileName.GetLinkMapPath();
System.IO.File.WriteAllBytes(fileMapPath, fileByte);
tblLinks.ImageName = fileName;
await _linkService.Edit(tblLinks);
}
return true;
}
catch
{
return false;
}
}
[HttpPost]
[ValidateAntiForgeryToken]
公共异步任务添加([Bind(Include=“IdLanguage,Title,Address,Description,IdLinksCategory”)]TblLinks TblLinks,string coverPath,string coverBase64)
{
尝试
{
tblLinks.IdUser=await_permissionService.GetCurrentIdUser();
tblLinks.CreatedDateTime=DateTime.Now;
等待链接服务添加(tblLinks);
如果(!string.IsNullOrEmpty(coverPath))
{
byte[]fileByte=\u utilityService.GetByteFromBase64String(coverBase64);
var fileType=Path.GetExtension(coverPath);
var fileName=string.Format(“Link-{0}{1}”,tblLinks.IdLink,fileType);
var fileMapPath=fileName.GetLinkMapPath();
System.IO.File.writealBytes(fileMapPath,fileByte);
tblLinks.ImageName=文件名;
等待链接服务编辑(tblLinks);
}
返回true;
}
抓住
{
返回false;
}
}
和服务层:
public async Task<TblLinks> Add(TblLinks links)
{
_eTblLinks.Add(links);
await _uow.SaveChangesAsync();
_cacheUpdateService.Links();
return links;
}
public async Task Edit(TblLinks links)
{
var query = await (from k in _eTblLinks
where k.IdLink == links.IdLink
select k).FirstOrDefaultAsync();
query.Title = links.Title;
query.Address = links.Address;
query.Description = links.Description;
query.IdLinksCategory = links.IdLinksCategory;
if (!string.IsNullOrEmpty(links.ImageName))
query.ImageName = links.ImageName;
_uow.MarkAsChanged(query);
await _uow.SaveChangesAsync();
_cacheUpdateService.Links();
}
公共异步任务添加(TblLinks链接)
{
_添加(链接);
等待_uow.saveChangesSync();
_cacheUpdateService.Links();
返回链接;
}
公共异步任务编辑(TblLinks链接)
{
var query=WAIT(来自k in_eTblLinks
其中k.IdLink==links.IdLink
选择k).FirstOrDefaultAsync();
query.Title=links.Title;
query.Address=links.Address;
query.Description=links.Description;
query.IdLinksCategory=links.IdLinksCategory;
如果(!string.IsNullOrEmpty(links.ImageName))
query.ImageName=links.ImageName;
_uow.MarkAsChanged(查询);
等待_uow.saveChangesSync();
_cacheUpdateService.Links();
}
在我的工作中,我使用guid键作为图像的名称,并将其上载到服务器,而不是将此guid键与实体的其余部分一起使用,然后立即保存到数据库中
那么哪种方式更好呢?我的还是他的?都是有效的,我不认为其中一个比另一个好(除了在数据库中进行第二次写入),假设在您的解决方案中,您将图像guid/文件名存储为实体的属性,而不将其用作实体键。请注意,控制器中的逻辑不利于MVC分离关注点。@Dane,所以上传图片的部分应该在服务层,对吗?这是我对MVC的理解,尽管我不是专家。它只是帮助你把事情分开,这样你就可以更容易地维护你的应用程序。第二次写入数据库让我怀疑这是否是一个好方法。这一切都取决于你的应用程序负载,但这对性能没有多大影响,所以我会优先考虑从代码角度看简单、干净的应用程序。