Sto lavorando con un'applicazione console/WebJob che utilizza la libreria EPPlus per lavorare con file di Excel (.xlsx). La mia applicazione apre fondamentalmente un set di cartelle di lavoro e le unisce insieme come un unico file.EPPlus, l'esecuzione in Azure produce "Si è verificato un errore generico in GDI +"
L'applicazione funziona correttamente localmente, ma non in Azure. Secondo lo StackTrace
, l'errore si verifica all'interno della libreria EEPlus quando si tenta di salvare un'immagine (presumo che ciò avvenga per spostare le immagini da una cartella di lavoro a un'altra).
Unhandled Exception: System.ApplicationException: A generic error occurred in GDI+.
---> System.Runtime.InteropServices.ExternalException: A generic error occurred in GDI+.
at System.Drawing.Image.Save(Stream stream, ImageCodecInfo encoder, EncoderParameters encoderParams)
at System.Drawing.Image.Save(Stream stream, ImageFormat format)
at OfficeOpenXml.Drawing.ExcelPicture..ctor(ExcelDrawings drawings, XmlNode node)
at OfficeOpenXml.Drawing.ExcelDrawing.GetDrawing(ExcelDrawings drawings, XmlNode node)
at OfficeOpenXml.Drawing.ExcelDrawings.AddDrawings()
at OfficeOpenXml.Drawing.ExcelDrawings..ctor(ExcelPackage xlPackage, ExcelWorksheet sheet)
at OfficeOpenXml.ExcelWorksheets.Add(String Name, ExcelWorksheet Copy)
Il codice originale, che produce l'errore aperta chiedendo ConvertTo
.
Part = drawings.Part.Package.GetPart(UriPic);
FileInfo f = new FileInfo(UriPic.OriginalString);
ContentType = GetContentType(f.Extension);
_image = Image.FromStream(Part.GetStream());
ImageConverter ic=new ImageConverter();
var iby=(byte[])ic.ConvertTo(_image, typeof(byte[]));
var ii = _drawings._package.LoadImage(iby, UriPic, Part);
ImageHash = ii.Hash;
Dopo aver letto diverse domande sulla questione ho cercato di modificarlo utilizzando un manuale di conversione e il salvataggio di un MemoryStream
. Tuttavia sto ancora ricevendo l'errore.
Part = drawings.Part.Package.GetPart(UriPic);
FileInfo f = new FileInfo(UriPic.OriginalString);
ContentType = GetContentType(f.Extension);
_image = Image.FromStream(Part.GetStream());
byte[] iby;
using (MemoryStream ms = new MemoryStream())
{
_image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
iby = ms.ToArray();
}
var ii = _drawings._package.LoadImage(iby, UriPic, Part);
ImageHash = ii.Hash;
Sono davvero bloccato su cosa provare dopo. L'eccezione non produce così tanto da fare, e sento di aver già provato tutti i suggerimenti là fuori: controllo delle autorizzazioni di file e cartelle (la mia app utilizza la cartella temp, che credo sia sicura), evitare il riutilizzo di flussi e presto.
Per favore fatemi sapere se avete bisogno di ulteriori informazioni e sarò lieto di metterlo.
a corto di memoria dovrebbe essere la vostra considerazione superiore, questo codice non è esattamente frugale con esso. Un'immagine stupida nel file .doc successivo. –
Bene, credete che sarebbe il caso in entrambi i casi (modificato e non modificato)? Posso vedere come il mio esempio modificato potrebbe correre quel rischio, ma entrambi gli esempi si bloccano nello stesso identico modo. –
Beh, perché no, entrambi divorano memoria e presumibilmente entrambi elaborano lo stesso file .xlsx. Non si può davvero tralasciare alcun dettaglio sul file specifico in cui questo fallisce. –