Общая ошибка произошла в GDI +

[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) - у меня есть права на папку.. и все...

Ответ 1

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

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

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

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

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

bitmap.Dispose();

Ответ 5

Я согласен с разрешениями здесь.

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

Ответ 6

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

Обходное решение создает растровое изображение, сохраняет и отпускает его:

Растровое изображение tmp = новое растровое изображение (bitmapToBeSaved);  tmp.SaveToFile(имя_файл);

Ответ 7

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

Ответ 8

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

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

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

Ответ 9

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

    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);

Ответ 10

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