生产服务器上的GDI +一般错误

时间:2017-03-13 14:38:14

标签: c# asp.net iis gdi+ system.drawing

我正在努力解决一个大规模回答的问题,但没有一个给定的解决方案对我有用。 我有一个ASP.NET WebForms应用程序,我想存储图片,并能够检索它,更改旋转,删除等... 问题是在我的开发环境中一切正常(使用visual studio甚至在我的本地机器上使用IIS 8.5)但是当我尝试在生产服务器(IIS 10.0)上部署它时,我甚至无法上传图片,我只能看图片。 如果我尝试保存,旋转或删除图像,我会收到GDI +泛型错误。 它让我觉得它是配置或权限问题,因为应用程序与我的机器上的应用程序相同,并且工作正常。

我尝试过:

  • <%= Environment.UserName%>返回“.NET v4.5”,我已经批准了这个 对目录具有完全权限的用户,甚至是给定的完全访问权限 “Everybody”用户无法解决问题。
  • 我试图在保存后处理图片,但我不想 这是因为当我上传时我不会覆盖任何内容 文件。
  • “GC.Collect()”它什么也没做,我真的不明白为什么 会有所作为。
  • 我查看了IIS的MIME类型,并且“image / jpeg”就在那里。

让我感到不安的是,我在同一个应用程序中有一个文件上传目录(不是图片)而且它有效,所以我猜权限是正常的,我对两个目录都拥有相同的权限。

以下是我上传图片的代码:

public static Int64 InsertPhoto(Photo maPhoto)
    {
        ////////////////////////////////////////////////
        // ETAPE 1 : Récupération du numéro de photo
        ////////////////////////////////////////////////
        try
        {
            int? numero = PecV2.DAL.Photo.GetNumeroPhotoMaxByIDIntervention(maPhoto.IDIntervention);
        if (numero.HasValue)
        {
            maPhoto.Numero = numero.Value + 1;
        }
        else
        {
            maPhoto.Numero = 0;
        }

        ////////////////////////////////////////////////
        // ETAPE 2 : Génération des miniatures
        ////////////////////////////////////////////////
        Intervention monIntervention = Intervention.GetIntervention(maPhoto.IDIntervention);
        maPhoto.IDImmeuble = monIntervention.IDImmeuble;
        maPhoto.FileName = maPhoto.IDImmeuble.ToString() + "_" + maPhoto.IDIntervention.ToString() + "_" + maPhoto.Numero.ToString() + ".jpg";

        maPhoto.EnregistrerMiniature(maPhoto.PhotoFull, global::PecV2.BL.Properties.Settings.Default.LargeurPhotoMedium, global::PecV2.BL.Properties.Settings.Default.RepertoirePhotosMedium, maPhoto.FileName);
        maPhoto.EnregistrerMiniature(maPhoto.PhotoFull, global::PecV2.BL.Properties.Settings.Default.LargeurPhotoSmall, global::PecV2.BL.Properties.Settings.Default.RepertoirePhotosSmall, maPhoto.FileName);
        // Encoder...                
        EncoderParameters encParams = new EncoderParameters(1);
        encParams.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, (long)100);


        // Codec...
        ImageCodecInfo codecJpeg = null;
        foreach (ImageCodecInfo codec in ImageCodecInfo.GetImageEncoders())
            if (codec.MimeType == "image/jpeg")
                codecJpeg = codec;
            //GC.Collect();
            maPhoto.PhotoFull.Save(Path.Combine(global::PecV2.BL.Properties.Settings.Default.RepertoirePhotosFull, maPhoto.FileName), codecJpeg, encParams);
        }
        catch (Exception ex)
        {

            throw ex;
        }
        ////////////////////////////////////////////////
        // ETAPE 3 : Enregistrement en base
        ////////////////////////////////////////////////
        return PecV2.DAL.Photo.InsertPhoto(maPhoto.IDImmeuble,
                                            maPhoto.IDIntervention,
                                            maPhoto.Remarques,
                                            maPhoto.Date,
                                            maPhoto.Numero,
                                            maPhoto.FileName);
    }

 private void EnregistrerMiniature(Bitmap PhotoSource, int DimMax, string RepertoireDestination, string NomFichier)
    {
        double RatioMedium;

        // détermination de l'orientation de la photo originale
        if (PhotoSource.Width >= PhotoSource.Height)
        {
            // photo horizontale
            RatioMedium = PhotoSource.Width / DimMax;
            //
        }
        else
        {
            // photo verticale
            RatioMedium = PhotoSource.Height / DimMax;
        }

        if (RatioMedium < 1)
            RatioMedium = 1;

        // Generation de la photo medium
        Int32 dW;
        Int32 dH;

        // Calcul de la résolution de la vignette par rapport à la largeur
        dW = (Int32)Math.Round(PhotoSource.Width / RatioMedium);
        dH = (Int32)Math.Round(PhotoSource.Height / RatioMedium);


        Bitmap bVignetteMedium = new Bitmap(dW, dH, PixelFormat.Format32bppRgb);

        using (Graphics g = Graphics.FromImage((Image)bVignetteMedium))
        {
            // Temp pour supprimer bordure (G+H) noire
            SolidBrush br = new SolidBrush(Color.White);
            g.FillRectangle(br, 0, 0, dW, dH);

            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
            g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighSpeed;
            g.DrawImage(PhotoSource, 0, 0, dW, dH);
        }
        // Encoder...                
        EncoderParameters encParams = new EncoderParameters(1);
        encParams.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, (long)100);

        // Codec...
        ImageCodecInfo codecJpeg = null;
        foreach (ImageCodecInfo codec in ImageCodecInfo.GetImageEncoders())
            if (codec.MimeType == "image/jpeg")
                codecJpeg = codec;
        //Enregistrement de la vignette
        try
        {
            bVignetteMedium.Save(Path.Combine(RepertoireDestination, NomFichier), codecJpeg, encParams);
            bVignetteMedium.Dispose();
        }
        catch (Exception)
        {
            throw;
        }
    }

这是完整的eror堆栈(btnEnregistrer_Click调用InsertPhoto):

[ExternalException (0x80004005): Une erreur générique s'est produite dans GDI+.]
 PecV2.WebApp.Intervention.Onglets.o07_Photos.btnEnregistrer_Click(Object sender, EventArgs e) +509
 System.Web.UI.WebControls.Button.OnClick(EventArgs e) +11802193
 System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +150
 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1735

----------------------------------------------- -UPDATE ----------------------------------------------- < / p>

我发现了问题的来源,这是一个web.config问题,我试图打开'照片'目录而不是'照片'目录......请不要嘲笑我!我不知道我怎么错过那个X'D

非常感谢,Nicolas。

1 个答案:

答案 0 :(得分:1)

我发现了问题的来源,这是一个web.config问题,我试图打开'照片'目录而不是'照片'目录......请不要嘲笑我!我不知道我怎么错过那个X'D