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

我的代码是:

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)上 - 我有文件夹权限......一切......

4

10 回答 10

27

我满怀激情地讨厌这个错误。Generic Error 可能是有史以来最无用的错误描述。

当我遇到它时,问题总是与文件 IO 有关。

这是我在笔记中保留的修复列表-不确定这些是否适用,但它们通常对我有用。

  • 检查文件路径
    • 确保父目录存在
    • 确保路径包含文件名和扩展名
    • 使用 server.MapPath() 创建路径
  • 确保文件没有被写回到它的源。如有必要,请关闭并重新打开流。

如果我从其他地方偷了这份清单,我深表歉意。它在我的笔记本里已经有一段时间了,我不记得它是从哪里来的。

于 2009-08-06T17:35:41.660 回答
1

由于权限错误,这里(以及本网站上)的每个人都讨论了这个问题。我偶然发现了另一种味道:记忆。我的内存不足并开始收到此错误。所以请记住,这是另一个潜在的错误来源。

在我的特殊情况下,我在一个 .NET 应用程序中运行,并且针对多个线程运行(足够少,以至于我没有被 GDI+ 进程范围的锁阻止太多)。在主要任务完成后添加“GC.Collect()”似乎对速度影响不大,但确实完全摆脱了内存不足的错误。

于 2013-05-21T05:10:42.343 回答
0

您的本地机器是 Vista 还是 Windows 7,而您的服务器是 Windows Server 2003?我相信 GDI+ 的实现有所不同,您不会在较新的操作系统上看到错误。我现在刚刚遇到这个问题,这是我遇到的事实之一。

于 2010-06-17T21:51:40.040 回答
0

我刚才遇到了同样的错误,谷歌帮我找到答案:加载/保存位图导致文件被锁定。

解决方法是创建其他位图,保存并让它释放:

位图 tmp = new Bitmap(bitmapToBeSaved); tmp.SaveToFile(文件名);

于 2009-09-11T09:55:16.280 回答
0

这个关注我很久了。是的,您可以检查权限,但您还应该正确处理位图。

bitmap.Dispose();
于 2009-07-31T11:59:47.723 回答
0

我刚刚在我的托管网站上遇到了类似的问题(同样的例外):原来是权限问题,ASP.NET 帐户试图从其可用范围之外的目录中读取图像文件。

我建议您仔细检查权限以及<trust>web.config 中的元素,根据文件所在的位置,它应该设置为“中”或更高。

于 2009-07-30T02:29:35.790 回答
0

确保IIS_WPG对您的上传文件夹ASPNET具有正确的权限

我只是有同样的问题,这解决了它。

如果需要,不要忘记通过您的子文件夹传播权限(我可能已经忘记了.. :))

于 2010-08-11T09:15:59.510 回答
0

我同意权限是这里的问题。

网络服务可能吗?

于 2009-08-27T10:17:17.100 回答
0

请确定您用于图像的路径,我也面临同样的错误。检查您使用的所有路径。

于 2013-02-08T10:09:48.500 回答
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);
于 2012-06-15T07:45:16.130 回答