2010-03-26 88 views
0
[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Upload(Photo photo) 
{ 
    foreach (string file in Request.Files) 
    { 

     var path = "~/Uploads/Photos/"; 

     HttpPostedFileBase posted = (HttpPostedFileBase)Request.Files[file]; 

     if (posted.ContentLength > 0) 
     { 
      photo.Date = DateTime.Now; 
      photo.AlbumID = 1; 
      photo.Title = Path.GetFileName(posted.FileName); 

      photoRepository.Add(photo); 
      photoRepository.Save(); 

      posted.SaveAs(Server.MapPath(path + photo.PhotoID + ".jpg")); 

      Image img1 = Image.FromFile(Server.MapPath("~/Uploads/Photos/") + photo.PhotoID + ".jpg"); 

      imageHelper.CreateThumbnail(posted, img1); 

      int newWidth = 100; 
      int newHeight = 100; 
      double ratio = 0; 

      if (img1.Width > img1.Height) 
      { 
       ratio = img1.Width/(double)img1.Height; 
       newHeight = (int)(newHeight/ratio); 
      } 
      else 
      { 
       ratio = img1.Height/(double)img1.Width; 
       newWidth = (int)(newWidth/ratio); 
      } 

      Image bmp1 = img1.GetThumbnailImage(newWidth, newHeight, null, IntPtr.Zero); 
      bmp1.Save(Server.MapPath("~/Uploads/Photos/Thumbnails/") + photo.PhotoID + ".jpg"); 

      img1.Dispose(); 
      bmp1.Dispose(); 
     } 
    } 

    return RedirectToAction("Index"); 
} 

我想組織這樣的代碼更好一點,像這樣:C#新手問題,部分2 - 聲明類和方法

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Upload(Photo photo) 
{ 
    foreach (string file in Request.Files) 
    { 

     var path = "~/Uploads/Photos/"; 

     HttpPostedFileBase posted = (HttpPostedFileBase)Request.Files[file]; 
     ImageHelper imageHelper = new ImageHelper(); 

     if (posted.ContentLength > 0) 
     { 
      photo.Date = DateTime.Now; 
      photo.AlbumID = 1; 
      photo.Title = Path.GetFileName(posted.FileName); 

      photoRepository.Add(photo); 
      photoRepository.Save(); 

      posted.SaveAs(Server.MapPath(path + photo.PhotoID + ".jpg")); 

      Image img1 = Image.FromFile(Server.MapPath("~/Uploads/Photos/") + photo.PhotoID + ".jpg"); 

      // Create thumbnail 
      imageHelper.CreateThumbnail(posted, img1);      
     } 
    } 

    return RedirectToAction("Index"); 
} 

,在這裏,在助手文件夾我創建的類和方法將處理縮略圖:

public class ImageHelper 
{   
    public void CreateThumbnail(HttpPostedFileBase posted, Image img1) 
    { 
     int newWidth = 100; 
     int newHeight = 100; 
     double ratio = 0; 

     if (img1.Width > img1.Height) 
     { 
      ratio = img1.Width/(double)img1.Height; 
      newHeight = (int)(newHeight/ratio); 
     } 
     else 
     { 
      ratio = img1.Height/(double)img1.Width; 
      newWidth = (int)(newWidth/ratio); 
     } 

     Image bmp1 = img1.GetThumbnailImage(newWidth, newHeight, null, IntPtr.Zero); 
     bmp1.Save(Server.MapPath("~/Uploads/Photos/Thumbnails/") + photo.PhotoID + ".jpg"); 

     img1.Dispose(); 
     bmp1.Dispose(); 
    } 
} 

但我得到的編譯錯誤Server(在bmp1.Save(Server.MapPath ImageHelper類...行)不會在目前的情況下存在,而它工作正常,如果代碼在一個地方。
我在做什麼錯了,這是甚至正確的方式來聲明方法和組織代碼?

由於提前,

回答

2

ServerController類的屬性。這就是爲什麼它可以通過Update操作訪問。爲了從外部使用它,你可以通過HttpContext.Current.Server來獲取它。

但是,這會使您的代碼更少測試,並與ASP.NET細節更緊密地結合在一起。相反,重寫此方法,以便它將獨立於任何ASP.NET相關的東西。

在這種特殊情況下,你可以添加額外的參數的方法,它會告訴它在哪裏保存縮略圖:

void CreateThumbnail(Image img1, string targetDirectory) 
+0

很好,它的工作原理... – 2010-03-26 16:09:26

2

而不是讓你的CreateThumbnail方法直接調用事關「服務器」,而不是你應該將這些資源傳遞給你的函數。這可以更好地分離問題,最終實現更好的可重用性。此外,它也會糾正你的問題。

+0

我明白...好的提示! – 2010-03-26 16:13:41