我的网站有问题,我必须为我的应用程序中的每条记录创建一个图像文件。
在我的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应用程序时,我遇到了这个问题。
请,有人可以帮助我吗?
提前谢谢。
最诚挚的问候。
答案 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);
}
}
}