Общая ошибка произошла в 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
Пожалуйста, убедитесь, что вы используете для изображений, я также сталкиваюсь с той же ошибкой. Проверьте все пути, которые вы используете.