创建映像文件时出现一般错误GDI

时间:2020-06-13 19:33:49

标签: asp.net iis

我的网站有问题,我必须为我的应用程序中的每条记录创建一个图像文件。

在我的IDE中工作正常,但我在IIS中对其进行了测试,但无法创建图像文件,但收到通用错误GDI(System.Runtime.InteropServices.ExternalException)

图像文件夹具有所有W / R权限,这是我的图像生成器:

private void generador(string barCode)
{
    using (Bitmap bitMap = new Bitmap(barCode.Length * 40, 80))
    {
        using (Graphics graphics = Graphics.FromImage(bitMap))
        {
            // IDAHC39M Code 39 Barcode INSTALADO en los fonts del servidor
            Font oFont = new Font("IDAHC39M Code 39 Barcode", 16);
            PointF point = new PointF(2f, 2f);
            SolidBrush blackBrush = new SolidBrush(Color.Black);
            SolidBrush whiteBrush = new SolidBrush(Color.White);
            graphics.FillRectangle(whiteBrush, 0, 0, bitMap.Width, bitMap.Height);
            graphics.DrawString("*" + barCode + "*", oFont, blackBrush, point);


            bitMap.Save(HttpContext.Current.Server.MapPath("/codigos/" + barCode + ".png"), ImageFormat.Png);
            bitMap.Dispose();
        }

    }
}

我将数据存储在DataTable中(仅用于测试),并且当我进行迭代(反复调用生成器)时,出现了该错误。

我重复一遍,在我的IDE中可以正常工作,但是当发布te应用程序时,我遇到了这个问题。

请,有人可以帮助我吗?

提前谢谢。

最诚挚的问候。

1 个答案:

答案 0 :(得分:0)

正如Lex Li所说:“ Web应用程序不支持System.Drawing”,使用它会引起很多问题。因此,我决定使用NetBarCode,并且可以使其工作: -从nuget安装NetBarCode -这是代码:

using NetBarcode; //Instalar NetBarcode de NugetPackages o usar la dll
using System.IO; // Filestream
using System.Configuration;
using System.Data;

private void generador(string codigo)
{
    var barcode = new Barcode("*" + codigo.Trim() + "*", NetBarcode.Type.Code39, true);
    var value = barcode.GetBase64Image();


    string filepath = Server.MapPath("~/codigos/" + codigo.Trim() + ".jpeg"); //Generar archivo
    var bytess = Convert.FromBase64String(value);
    using (var imageFile = new FileStream(filepath, FileMode.Create))
    {
        imageFile.Write(bytess, 0, bytess.Length);
        imageFile.Flush();
    }
}


protected void Bucle(object sender, EventArgs e)
{
    DataTable dt = new DataTable();
    dt.Columns.Add("Nif");
    dt.Columns.Add("Estudiante");
    dt.Columns.Add("Titulo");

    // Emulating my data
    // dt.Rows.Add("01769459"......)


    foreach (DataRow row in dt.Rows)
    {
        generador(row["Nif"].ToString());
    }



}

但是,如果需要,您必须控制内存流,例如(类似),我使用QRCoder.dll:

protected void Generar(string nif, string fileName)
{
    QRCodeGenerator qrGenerador = new QRCodeGenerator();
    QRCodeGenerator.QRCode qrCode = qrGenerador.CreateQrCode(nif, QRCodeGenerator.ECCLevel.Q);
    System.Web.UI.WebControls.Image imgQrCode = new System.Web.UI.WebControls.Image();
    imgQrCode.Height = 150;
    imgQrCode.Width = 150;
    string filepath = Server.MapPath("~/files/" + fileName.Trim() + ".jpeg"); //Generar archivo
    Bitmap bitmap = qrCode.GetGraphic(20);

    using (MemoryStream memory = new MemoryStream())
    {
        using (FileStream fs = new FileStream(filepath, FileMode.Create, FileAccess.ReadWrite))
        {
            bitmap.Save(memory, ImageFormat.Jpeg);
            byte[] bytes = memory.ToArray();
            fs.Write(bytes, 0, bytes.Length);
        }
    }

}