2009-06-25 87 views
11
[ExternalException (0x80004005): A generic error occurred in GDI+.] 
    IpitchitImageHandler.Data.ImageRepository.AddNewTempImage(Stream image, String extension, Guid PageId, Guid ImageId, ImageTransformCollection toDoTransforms) +1967 
    IpitchitImageHandler.Data.ImageRepository.AddNewTempImage(Stream image, String extension, Guid PageId, Guid ImageId) +85 
    IpitchitWeb.Sell.Controls.UploadImagesSubstep.UploadImages(Object sender, EventArgs e) in F:\Documents and Settings\Vjeran\My Documents\Visual Studio 2008\Projects\Ipitchit\IpitchitWeb\Sell\Controls\UploadImagesSubstep.ascx.cs:88 
    System.Web.UI.WebControls.LinkButton.OnClick(EventArgs e) +111 
    System.Web.UI.WebControls.LinkButton.RaisePostBackEvent(String eventArgument) +79 
    System.Web.UI.WebControls.LinkButton.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10 
    System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13 
    System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +175 
    System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1565 

我的代碼是:一般性錯誤在GDI +

public void AddNewTempImage(Stream image, string extension, Guid PageId, Guid ImageId, 
    ImageTransformCollection toDoTransforms) 
{ 
    //mapping steam to memory stream so it does support the seek 

    MemoryStream targetStream = new MemoryStream(ReadStream(image, 1024)); 
    Image ImageToTransform=null; 
    Image transformedImage = null; 
    string storagePath = ImageTransformManager.Config.StorageServerPhysicalPath; 
    Uri storageUrl = new Uri(ImageTransformManager.Config.StorageServerUrl); 

    //string TempPath = Path.Combine(storagePath, GenerateFileName(extension)); 
    //SaveStream(TempPath, image); 
    //File.WriteAllBytes(TempPath, ReadStream(image, 1024)); 

    if (!HttpContext.Current.User.Identity.IsAuthenticated) 
     throw new Exception("Nonauthenticated users image submition is not supported"); 

     try 
     {    
      foreach (ImageTransform transform in toDoTransforms) 
      { 
      ImageRepositoryTempImage newimage = new ImageRepositoryTempImage(); 
      newimage.ImageGuid = ImageId; 
      newimage.PageGuid = PageId; 
      newimage.CreatedBy = HttpContext.Current.User.Identity.Name; 
      newimage.CreatedDate = DateTime.UtcNow; 
      newimage.Format = transform.OutputType; 
      newimage.Width = transform.Width; 
      newimage.Height = transform.Height; 
      newimage.Watermark = transform.UseWaterMark; 
      string filename = GenerateFileName(transform.OutputType); 
      string fullStoragePath = Path.Combine(storagePath, Path.Combine(transform.StorageFolder, filename)); 
      string fullStorageUrl = CombineUri(storageUrl, Path.Combine(transform.StorageFolder, filename)); 
      newimage.PhysicalStoragePath = fullStoragePath; 
      newimage.StoragePath = fullStorageUrl; 
      CheckOrAddImageTransform(transform); 
      var ImgRepTransform = GetTransformation(transform); 
      newimage.ImageRepositoryTransformation = ImgRepTransform; 
      newimage.TransformId = ImgRepTransform.Id; 

      Bitmap uploaded = new Bitmap(image); 

      ImageToTransform = (Image)uploaded.Clone(); 
      uploaded.Dispose(); 
      transformedImage = transform.Transform(ImageToTransform); 
      AddNewTempImage(newimage); 
      //adding named watermark and transformation 
      string wname = ImageTransformManager.Config.WaterMarkName; 
      string wpath = ImageTransformManager.Config.WaterMarkPath; 
      ChechOrAddWaterMark(wname, wpath); 


      if (!(string.IsNullOrEmpty(wname) && string.IsNullOrEmpty(wpath))) 
       newimage.ImageRepositoryWaterMark = GetWatermark(wname, wpath); 

      transformedImage.Save(fullStoragePath, GetFormat(newimage.Format)); 
      } 
     } 
     catch (System.Exception ex) 
     { 
      ErrorHandling.LogErrorEvent("Add new temp image method", ex); 
      throw ex; 
     } 
     finally 
     { 
      //File.Delete(TempPath); 
      if (ImageToTransform!=null) 
       ImageToTransform.Dispose(); 
      image.Dispose(); 
      targetStream.Dispose(); 
      if (transformedImage != null) 
      transformedImage.Dispose(); 
     } 

} 

在我的本地機器一切正常 - 但仍然發生..在服務器上(2003) - 我有文件夾的權限..和一切。 ..

+0

你能指明發生異常行? – 2009-07-19 17:31:50

回答

0

我只是在我的託管網站有一個類似的問題(同除外):它原來是一個權限問題,ASP.NET帳戶試圖從外部它的可用範圍的目錄中讀取圖像文件。

我建議您仔細檢查web.config中的權限以及<trust>元素,它應該設置爲「中」或更高,具體取決於文件的位置。

0

這一次跟着我很長一段時間。是的,你可以檢查權限,但你也應該做的是正確地處理你的位圖。

bitmap.Dispose(); 
25

我討厭那種充滿激情的錯誤。 通用錯誤可能是有史以來最無用的錯誤描述。

當我遇到這問題,以文件IO始終相關。

這裏是修復我把我的筆記 - 不知道如果這些申請,但他們通常做的伎倆我的列表。

  • 檢查文件的路徑
    • 確保父目錄存在
    • 確保路徑包括文件名和擴展
    • 使用使用Server.Mappath()創建路徑
  • 確保該文件沒有被寫回到它的源代碼。如有必要,關閉並重新打開流。

我的道歉,如果我從別的地方偷了這份名單。它一直在我的筆記本中,我不記得它來自哪裏。

+0

這確實是一條缺失的道路。 – sabbour 2010-08-11 11:01:09

0

我同意的權限是這裏的問題。

網絡服務可能嗎?

0

我剛剛得到同樣的錯誤,Google幫我找回答: 加載/保存位圖會導致鎖定的文件。

解決方法是創建位圖行吟詩人,保存並讓它釋放:

位圖TMP =新位圖(bitmapToBeSaved); tmp.SaveToFile(fileName);

0

是您的本地計算機Vista還是Windows 7,以及您的服務器Windows Server 2003?我相信GDI +實現方式不同,並且您不會在較新的操作系統上看到錯誤。我現在只是遇到了這個問題,這是我遇到的一個問題。

0

確保IIS_WPG對你上傳文件夾正確權限ASPNET

我只是有同樣的問題,這個固定。

不要忘記通過你的子文件,如果需要也傳播的權限(我可能已經忘記了.. :))

0

不要使用直接路徑

System.Drawing.Image img = Base64ToImage(_ImagePath); 
    img.Save(_attachmentPath, ImageFormat.Jpeg); 

用途使用Server.Mappath它會創建目錄如果需要

System.Drawing.Image img = Base64ToImage(_ImagePath); 
    img.Save(Server.MapPath(_attachmentPath), ImageFormat.Jpeg); 
0

請確保您使用的圖像路徑,我也面臨同樣的錯誤。請檢查您使用的所有路徑。

1

每個人都在這裏(在本網站)討論了這是由於權限錯誤。我絆倒了另一種味道:記憶。我用完了內存並開始接收這個錯誤。因此請牢記這是另一個潛在的錯誤來源。

在我的具體情況,我在.NET應用程序運行,並且對多個線程(足夠少,我沒有躊躇由GDI +處理範圍的鎖太多)運行。添加「GC.Collect的()」後,主要任務完成後似乎並沒有影響速度了,但沒有徹底擺脫內存不足錯誤的。

相關問題