Asp.net GDI+;中发生一般性错误;
我的代码是:Asp.net GDI+;中发生一般性错误;,asp.net,image,stream,gdi,Asp.net,Image,Stream,Gdi,我的代码是: [ExternalException (0x80004005): A generic error occurred in GDI+.] IpitchitImageHandler.Data.ImageRepository.AddNewTempImage(Stream image, String extension, Guid PageId, Guid ImageId, ImageTransformCollection toDoTransforms) +1967 Ipitc
[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
在我本地的机器上,一切都可以工作,但仍然会发生。。在服务器(2003)上-我有文件夹权限。。还有一切…我在托管网站上遇到了一个类似的问题(相同的例外):结果是权限问题,ASP.NET帐户试图从其可用范围之外的目录中读取图像文件
我建议您仔细检查权限以及web.config中的
元素,它应该设置为“中等”或更高级别,具体取决于文件所在的位置。这是我很久以来一直关注的问题。是的,您可以检查权限,但您还应该正确处理位图
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();
}
}
我非常讨厌那个错误。
泛型错误可能是有史以来最无用的错误描述 当我遇到它时,问题总是与文件IO有关 下面是我在笔记中保留的修复列表-不确定这些是否适用,但它们通常对我有用
- 检查文件路径
- 确保父目录存在
- 确保路径包含文件名和扩展名
- 使用server.MapPath()创建路径
- 确保文件没有被写回其源。如有必要,关闭并重新打开流李>
如果我从其他地方偷了这份名单,我深表歉意。它在我的笔记本里已经有一段时间了,我记不起它是从哪里来的 我同意权限是这里的问题
网络服务可能吗?我刚才也有同样的错误,谷歌帮我找到答案: 加载/保存位图会导致锁定文件 解决方法是创建其他位图,保存并释放: 位图tmp=新位图(bitmapToBeSaved);
tmp.SaveToFile(文件名) 您的本地计算机是Vista还是Windows 7,以及您的服务器是Windows server 2003?我相信GDI+的实现是不同的,在较新的OSs上你不会看到错误。我现在遇到了这个问题,这是我遇到的问题之一。确保IIS\u WPG对您的上传文件夹和ASPNET具有正确的权限 我只是有同样的问题,这解决了它 如果需要,也不要忘记通过子文件夹传播权限(我可能忘记了..:)不要使用直接路径
bitmap.Dispose();
使用Server.MapPath,它将在需要时创建目录
System.Drawing.Image img = Base64ToImage(_ImagePath);
img.Save(_attachmentPath, ImageFormat.Jpeg);
请确定您用于图像的路径,我也面临相同的错误。请检查您正在使用的所有路径。由于权限错误,这里(以及本网站上)的每个人都讨论了这一问题。我偶然发现了另一种味道:记忆。我的内存不足,也开始收到这个错误。因此,请记住这是另一个潜在的错误来源
在我的特殊情况下,我运行在一个.NET应用程序中,并且运行在多个线程上(足够少,我不会被GDI+进程范围的锁太多阻碍)。在主要任务完成后添加“GC.Collect()”似乎对速度没有太大影响,但完全消除了内存不足错误。您能指出异常发生的位置吗?这确实是一条丢失的路径。+1表示充满激情的仇恨!我也有一个丢失路径的错误。+1实际上,它也是我的文件路径。目录的路径是正确的,但我未能将文件名放入路径中。这对我来说是有效的:(在将其写入响应流之前,它从映像创建了一个中间流)“一般错误可能是有史以来编写的最无用的错误描述”,显然,您从未遇到对象“~”的“方法”~”失败由COM发布。
System.Drawing.Image img = Base64ToImage(_ImagePath);
img.Save(Server.MapPath(_attachmentPath), ImageFormat.Jpeg);