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

画像に使用しているパスを確認してください。同じエラーが発生します。使用しているすべてのパスを確認してください。

于 2013-02-08T10:09:48.500 に答える
0

ここでのアクセス許可が問題であることに同意します。

ネットワークサービスかな?

于 2009-08-27T10:17:17.100 に答える
0

これは長い間私を追いかけました。はい、アクセス許可を確認できますが、ビットマップを正しく破棄することも必要です。

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

ホストされている Web サイトで同様の問題 (同じ例外) が発生しました。アクセス許可の問題であることが判明しました。ASP.NET アカウントは、使用可能な範囲外のディレクトリから画像ファイルを読み取ろうとしていました。

アクセス許可と web.config の要素を再確認することをお勧めします<trust>。ファイルの場所に応じて、「中」以上に設定する必要があります。

于 2009-07-30T02:29:35.790 に答える
0

IIS_WPGがアップロード フォルダーASPNETに対して正しいアクセス許可を持っていることを確認してください。

私はちょうど同じ問題を抱えていましたが、これで修正されました。

必要に応じて、サブフォルダーを介してアクセス許可を伝達することも忘れないでください (私はそれを忘れているかもしれません.. :))

于 2010-08-11T09:15:59.510 に答える
0

ローカル マシンは Vista または Windows 7 で、サーバーは Windows Server 2003 ですか? GDI+ の実装は異なると思いますが、新しい OS ではエラーは表示されません。私はちょうど今、この問題に直面しています。これは、私が遭遇したファクトイドの 1 つです。

于 2010-06-17T21:51:40.040 に答える
0

ちょうど今同じエラーが発生しました。Google が答えを見つけるのを手伝ってくれます: ビットマップの読み込み/保存により、ファイルがロックされます。

回避策は、ビットマップを作成し、保存して解放することです。

Bitmap tmp = new Bitmap(bitmapToBeSaved); tmp.SaveToFile(ファイル名);

于 2009-09-11T09:55:16.280 に答える
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 に答える