2016-02-05 54 views
0

我正在研究一個我朋友前一段時間寫的小型cms。使用主鍵或Guid作爲圖像的名稱

有這個頁面,用戶可以上傳圖片,並在他的個人資料中顯示。我想知道保存這張圖片的最佳方法是什麼。在此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(); 
    } 

什麼,我有我的,做了一些我的工作就是我」 m使用guid鍵作爲我的圖像的名稱,並將其上傳到服務器,而不是將此GUID鍵與我的實體的其餘部分一起使用,然後立即保存在數據庫中。

那麼哪種方式更好?我的還是他的?

+0

需要注意的是,控制器中的邏輯違背了MVC對問題的分離。 – Dane

+0

@Dane,所以屬於上傳圖片的部分應該在服務層,對嗎? –

+0

這是我對MVC的理解,雖然我不是專家。它只是幫助將事情分開,以便您可以更輕鬆地維護您的應用。 – Dane

回答

0

的都有效,我沒有看到一個比其他的(除了一個數據庫中的第二寫入)更好,假定您的解決方案,你存儲圖像GUID /文件名作爲實體的財產,而不是將它用作實體鍵。

+0

第二次寫入數據庫讓我懷疑這是否是一種好方法。 –

+0

這一切都取決於你的應用程序加載,但它不應該在性能上有太大的區別,所以我會優先考慮從代碼的角度來看看/感覺簡單和清晰的那個。 – joaoruimartins