Pracuję z aplikacją konsolową/WebJob, która wykorzystuje bibliotekę EPPlus do pracy z plikami-Excel (.xlsx). Moja aplikacja zasadniczo otwiera zestaw skoroszytów i łączy je razem jako jeden plik.EPPlus, działający na Azure, generuje "Ogólny błąd wystąpił w GDI +"
Aplikacja działa poprawnie lokalnie, ale nie na Azure. Według StackTrace
błąd występuje wewnątrz biblioteki EEPlus podczas próby zapisania obrazu (zakładam, że robi się to w celu przeniesienia obrazów z jednego skoroszytu do drugiego).
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)
Oryginalny kod, który wywołuje błąd nazywając ConvertTo
otwarty.
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;
Po przeczytaniu kilku pytań w tej sprawie Próbowałem zmodyfikować go za pomocą ręcznej konwersji i zapisania w MemoryStream
. Jednak wciąż dostaję błąd.
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;
Naprawdę utknąłem na czym spróbować. Wyjątek nie daje tak wiele do zrobienia i wydaje mi się, że już wypróbowałem wszystkie sugestie: Sprawdzanie uprawnień do folderów i plików (moja aplikacja używa folderu tymczasowego, który moim zdaniem jest bezpieczny), unikając ponownego wykorzystywania strumieni i wkrótce.
Proszę dać mi znać, jeśli potrzebujesz dodatkowych informacji i chętnie go podam.
Running out of memory powinien być twój top uwagę, ten kod nie jest dokładnie oszczędny z nim. Nieskalany obraz w pliku .doc dalej. –
Czy uważasz, że tak jest w obu przypadkach (zmodyfikowane i niezmodyfikowane)? Widzę, jak mój zmodyfikowany przykład może uruchomić to ryzyko, ale oba przykłady ulegają awarii w dokładnie taki sam sposób. –
Cóż, dlaczego nie, obie pożerają pamięć i prawdopodobnie oba przetwarzają ten sam plik .xlsx. Nie można naprawdę pominąć żadnych szczegółów dotyczących konkretnego pliku, który się nie powiedzie. –