В GDI + произошла общая ошибка - PullRequest
11 голосов
/ 25 июня 2009
[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) - у меня есть разрешения на папки .. и все ...

Ответы [ 10 ]

26 голосов
/ 06 августа 2009

Я ненавижу эту ошибку со страстью. Generic Error - это, пожалуй, самое бесполезное описание ошибок, когда-либо написанное.

Когда я сталкивался с этой проблемой, как всегда, был связан с файлом IO.

Вот список исправлений, которые я храню в своих заметках. Не уверен, применимы ли они, но они обычно помогают мне.

  • Проверить путь к файлу
    • Убедитесь, что родительский каталог существует
    • Убедитесь, что путь включает как имя файла, так и расширение
    • Используйте server.MapPath () для создания пути
  • Убедитесь, что файл не записывается обратно в его источник. Закройте и снова откройте поток, если это необходимо.

Мои извинения, если я украл этот список откуда-то еще. Это было в моей записной книжке некоторое время, и я не могу вспомнить, откуда она взялась.

1 голос
/ 21 мая 2013

Все здесь (и на этом сайте) обсуждали это из-за ошибки разрешений. Я наткнулся на другой вкус: память. Я исчерпал память и начал получать эту ошибку также. Так что имейте это в виду как еще один потенциальный источник ошибки.

В моем конкретном случае я работал в приложении .NET и работал с несколькими потоками (достаточно мало, чтобы меня не слишком сильно сдерживала блокировка всего процесса GDI +). Добавление «GC.Collect ()» после завершения основных задач, похоже, не сильно повлияло на скорость, но полностью избавило от ошибок нехватки памяти.

0 голосов
/ 08 февраля 2013

Пожалуйста, будьте уверены в пути, который вы используете для изображений, я также сталкиваюсь с той же ошибкой. Проверьте все пути, которые вы используете.

0 голосов
/ 15 июня 2012

Не использовать прямой путь

    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 голосов
/ 11 августа 2010

Убедитесь, что IIS_WPG имеет правильные разрешения для вашей папки загрузки , а также ASPNET .

У меня просто была такая же проблема, и это исправило ее.

Не забудьте распространять разрешения через ваши подпапки, если это необходимо (возможно, я забыл, что .. :))

0 голосов
/ 18 июня 2010

Является ли ваша локальная машина Vista или Windows 7, а ваш сервер Windows Server 2003? Я считаю, что реализация GDI + отличается, и вы не увидите ошибку на более новых ОС. Сейчас я просто сталкиваюсь с этой проблемой, и это один из фактоидов, с которыми я столкнулся.

0 голосов
/ 11 сентября 2009

У меня такая же ошибка только сейчас, и Google поможет мне найти ответ: Загрузка / сохранение растрового изображения приводит к блокировке файла.

Обходной путь - создайте другое растровое изображение, сохраните и дайте ему выпустить:

Bitmap tmp = new Bitmap (bitmapToBeSaved); tmp.SaveToFile (имя_файл);

0 голосов
/ 27 августа 2009

Я согласен, что разрешения - вот проблема.

услуга сети возможно?

0 голосов
/ 31 июля 2009

Этот следил за мной долгое время. Да, вы можете проверить разрешения, но вам также следует правильно распорядиться своим растровым изображением.

bitmap.Dispose();
0 голосов
/ 30 июля 2009

У меня только что была похожая проблема (то же исключение) на моем размещенном веб-сайте: оказалось, что проблема с разрешениями, учетная запись ASP.NET пыталась прочитать файлы изображений из каталога вне его доступной области.

Я предлагаю вам дважды проверить разрешения, а также элемент <trust> в web.config, для него должно быть установлено значение "Средний" или выше, в зависимости от того, где находятся файлы.

...