Lors de la sortie d'une image dans le flux de sortie, cela nécessite-t-il un stockage temporaire? J'obtiens l'erreur "GDI + générique" qui est généralement associée à une erreur d'autorisation de dossier lors de l'enregistrement d'une image dans un fichier.
La seule chose que je fais à l'image est d'ajouter du texte. J'obtiens toujours l'erreur même lorsque je renvoie l'image directement sans modifications. Par exemple, cela me donnera l'erreur:
using (Bitmap image = new Bitmap(context.Server.MapPath("images/stars_5.png")))
{
image.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Png);
}
Tout fonctionne correctement sur ma machine locale exécutant Windows 7 avec IIS 7.5 et ASP.NET 2.0. Le problème se produit sur le serveur QA qui exécute Windows Server 2003 avec IIS 6 et ASP.NET 2.0.
La ligne qui donne l'erreur est:
image.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Png);
Voici la trace de la pile:
[ExternalException (0x80004005): A generic error occurred in GDI+.]
System.Drawing.Image.Save(Stream stream, ImageCodecInfo encoder, EncoderParameters encoderParams) +378002
System.Drawing.Image.Save(Stream stream, ImageFormat format) +36
GetRating.ProcessRequest(HttpContext context) in d:\inetpub\wwwroot\SymInfoQA\Apps\tools\Rating\GetRating.ashx:54
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +181
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75
Les fichiers PNG (et autres formats) doivent être enregistrés dans un flux recherché. L'utilisation d'un MemoryStream
intermédiaire fera l'affaire:
using (Bitmap image = new Bitmap(context.Server.MapPath("images/stars_5.png")))
{
using(MemoryStream ms = new MemoryStream())
{
image.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
ms.WriteTo(context.Response.OutputStream);
}
}
J'ajouterais simplement:
Response.ContentType = "image/png";
Il peut donc être affiché directement dans le navigateur lorsqu'il ne se trouve pas dans une balise img
.