2012-12-11 62 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.你的传递给方法ResizeImage图像仍然在内存中,因此你必须返回新形象b

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

此外,当您与Image完成前出售其在该方法。关闭它。我发现这是我的问题,因为我在上传后正在阅读图像以进行一些处理。下一次上传我会得到一个锁定的文件。

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

另外,您应该将您的Graphics g包装在using语句中。它会在完成时或者如果有异常时调用Dispose。

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

更好。确保您的图像处理异常。在Finally区块中拨打Image.Dispose()

相关问题