2012-12-11 5 views
2
public ActionResult _Upload(HttpPostedFileBase file, GaleriesViewModel galeriesViewModel) 
{ 
    Images image = new Images(); 

    if (file.ContentLength > 0) 
    { 
     try 
     { 
      var fileName = Path.GetFileName(file.FileName); 
      var path = Path.Combine(Server.MapPath("~/Images/Galeries/Galery_" + galeriesViewModel.sno), fileName); 
      var smallImagePath = Path.Combine(Server.MapPath("~/Images/Galeries/Small/Galery_" + galeriesViewModel.sno), fileName); 
      var db_file_url = "Images/Galeries/Galery_" + galeriesViewModel.sno + "/" + fileName; 
      var db_small_image_url = "Images/Galeries/Small/Galery_" + galeriesViewModel.sno + "/" + fileName; 

      //exception thrown in this line 
      file.SaveAs(path); 
      Image smallImage = Image.FromFile(path); 
      Size size = new Size(); 
      size.Height = 128; 
      size.Width = 128; 
      smallImage = ImageManager.ResizeImage(smallImage, size); 
      smallImage.Save(smallImagePath); 
      smallImage.Dispose(); 

      image.ContentType = file.ContentType; 
      image.CreatedOn = DateTime.Now; 
      //image.CreateUserId = WebSecurity.CurrentUserId; 
      image.GaleryId = galeriesViewModel.sno; 
      image.ImageUrl = db_file_url; 
      image.Name = fileName; 
      image.UploadSize = file.ContentLength; 
      image.SmallImageUrl = db_small_image_url; 
      entity.Images.Add(image); 
      entity.SaveChanges(); 
     } 
     catch (Exception ex) { } 
    } 



    galeriesViewModel.Galeries = entity.Galeries; 
    ViewData["Selected"] = galeriesViewModel.sno; 
    return View("ImageOperations", galeriesViewModel); 
} 

이 코드를 사용하여 이미지를 업로드 할 수 있습니다. 그러나, 동일한 이미지를 연속적으로 추가하려고하면, 다시 제목으로 쓰여지는 오류가 발생합니다. 이 문제를 어떻게 해결할 수 있습니까? 이것의 이유는 무엇입니까?프로세스가 다른 프로세스에서 사용 중이므로 파일을 액세스 할 수 없습니까?

UPDATE

imageManager 클래스

public static class ImageManager 
{ 
    public static Image ResizeImage(Image imgToResize, Size size) 
    { 
     int sourceWidth = imgToResize.Width; 
     int sourceHeight = imgToResize.Height; 

     float nPercent = 0; 
     float nPercentW = 0; 
     float nPercentH = 0; 

     nPercentW = ((float)size.Width/(float)sourceWidth); 
     nPercentH = ((float)size.Height/(float)sourceHeight); 

     if (nPercentH < nPercentW) 
      nPercent = nPercentH; 
     else 
      nPercent = nPercentW; 

     int destWidth = (int)(sourceWidth * nPercent); 
     int destHeight = (int)(sourceHeight * nPercent); 

     Bitmap b = new Bitmap(destWidth, destHeight); 
     Graphics g = Graphics.FromImage((Image)b); 
     g.InterpolationMode = InterpolationMode.HighQualityBicubic; 

     g.DrawImage(imgToResize, 0, 0, destWidth, destHeight); 
     g.Dispose(); 

     return (Image)b; 
    } 
} 

감사

+0

ImageManager에서 여전히 이미지를 사용하고있는 것 같습니다. – Mariusz

답변

5

나를 좋아 것 같습니다 :
1.You 이미지 Image smallImage = Image.FromFile(path);를 작성하는
2.You는 당신의 참고를 재정의 새 이미지로 smallImage = ImageManager.ResizeImage(smallImage, size);
3.Your 당신이 Image 완료 될 때, 또한 새로운 이미지 b

imgToResize.Dispose(); 
return (Image)b; 
3

을 반환하기 전에 그 방법을 처분 할 수 있도록 방법 ResizeImage에 전달 된 이미지가 메모리에 남아 있습니다. 닫아. 어떤 처리를하기 위해 업로드 후 이미지를 읽으면서 이것이 내 문제라는 것을 알았습니다. 다음 업로드는 잠긴 파일을 얻을 것입니다.

Image smallImage = Image.FromFile(path); 
//.... 
smallImage.Dispose(); 

또한, 당신은 using 문에 Graphics g을 마무리해야한다. 작업이 끝나거나 예외가 있으면 Dispose를 호출합니다.

using (Graphics g = Graphics.FromImage((Image)b) 
{ 
    //.... 
} 
//No need to call Dispose() manually. 

더욱 좋습니다. 이미지가 예외적으로 처리되도록하십시오. Finally 블록에서 Image.Dispose()으로 전화하십시오.

관련 문제