2009-06-25 90 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的()”后,主要任务完成后似乎并没有影响速度了,但没有彻底摆脱内存不足错误的。

相关问题