我正在研究我朋友刚才写的小cms。
有一个页面,用户可以上传图像并将其显示在他的个人资料中。我想知道保存这张图片的最佳方法是什么。在这个cms中它是这样的:首先将实体保存到数据库中并在获得它的主键之后,用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;
}
}
服务层:
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();
}
我在我的一些工作中所做的是我使用guid键作为我的图像的名称,并将其上传到服务器,而不是使用这个guid键与我的其余部分实体,然后立即保存在数据库中。
那么哪种方式更好?我或他的?
答案 0 :(得分:0)
两者都有效且我没有看到一个比另一个更好(除了DB中的第二次写入),假设在您的解决方案中,您将图像guid / filename存储为实体的属性而不是使用它也是实体键。