OVH Cloud OVH Cloud

Erreur générique GDI +

3 réponses
Avatar
Sylvain
Bonjour,

J'éxécute le code suivant lorsque je clique sur un bouton dans ma page aspx.
Ce code fonctionne très bien la 1ere fois. Par contre lorsque je clique une
2e fois sans avoir raffraichit ma page, j'obtiens une erreur du type : une
erreur générique s'est produit avec GDI+.
Cette erreur arrive lorsque je sauve l'image, je ne comprends pas....

Voici le code:

Try

Dim oConfig As New CSO_Lib_V2.clsConfig
Dim cnDataBase As New System.Data.SqlClient.SqlConnection
Dim sqlCmd As New System.Data.SqlClient.SqlCommand
Dim sPath As String
Dim sPhotoName As String
Dim iLastSlashIndex As Integer

' on enregistre les données dans un tableau de valeurs binaires
Dim StreamObject As System.IO.Stream
' on récupère la taille de l'image.
Dim FileLength As Long = upfile.PostedFile.ContentLength
' on créer un tableau de byte de la taille de l'image.
Dim FileByteArray(FileLength) As Byte

' On récupère le fichier dans un stream
StreamObject = upfile.PostedFile.InputStream
' On lit le stream qui va remplir le tableau de bytes.
StreamObject.Read(FileByteArray, 0, FileLength)
' On récupère le nom du fichier.
iLastSlashIndex = upfile.PostedFile.FileName.LastIndexOf("\")
sPhotoName =
upfile.PostedFile.FileName.Substring(iLastSlashIndex + 1)
'On recréer l'image pour pouvoir la retailler.
Dim oImage As New Bitmap(StreamObject)
Dim oThumb As System.Drawing.Image
' On créer le thumbnail.
oThumb = oImage.GetThumbnailImage(130, 90, Nothing, Nothing)
' On récupère le chemin du dossier temporaire.
sPath = Server.MapPath("ImagesProduits\Temp\photo-p.jpg")
' On sauve au format jpg.
oThumb.Save(sPath, Imaging.ImageFormat.Jpeg)

' On lit le thumb dans un flux.
Dim StreamThumb As System.IO.Stream =
System.IO.File.OpenRead(sPath)
Dim ThumbLength As Long = StreamThumb.Length

' on créer un tableau de byte de la taille de l'image.
Dim ThumbByteArray(ThumbLength) As Byte
' on met le contenu du flux dans un tableau.
StreamThumb.Read(ThumbByteArray, 0, ThumbLength)


' On insère l'image dans la base.
cnDataBase.ConnectionString =
oConfig.GetSetting("ConnectionString")
cnDataBase.Open()
sqlCmd.Connection = cnDataBase
sqlCmd.CommandType = CommandType.StoredProcedure
sqlCmd.CommandText = "InsertImage"

' Image taille réelle.
sqlCmd.Parameters.Add(New
System.Data.Sqlclient.SqlParameter("@PhotoName", sPhotoName))
sqlCmd.Parameters.Add(New
System.Data.Sqlclient.SqlParameter("@Photo", FileByteArray))
sqlCmd.Parameters.Add(New
System.Data.Sqlclient.SqlParameter("@TypeImage",
upfile.PostedFile.ContentType))
sqlCmd.Parameters.Add(New
System.Data.Sqlclient.SqlParameter("@Taille", FileLength))

' Thumbnail.
sqlCmd.Parameters.Add(New
System.Data.Sqlclient.SqlParameter("@ThumbName", sPhotoName))
sqlCmd.Parameters.Add(New
System.Data.Sqlclient.SqlParameter("@Thumb", ThumbByteArray))
sqlCmd.Parameters.Add(New
System.Data.Sqlclient.SqlParameter("@ThumbType",
upfile.PostedFile.ContentType))
sqlCmd.Parameters.Add(New
System.Data.Sqlclient.SqlParameter("@ThumbTaille", ThumbLength))

sqlCmd.ExecuteNonQuery()
cnDataBase.Close()

'On supprime les fichiers temporaires.

' Suppression des variables utilisées.
oConfig = Nothing
cnDataBase = Nothing
sqlCmd = Nothing
StreamObject = Nothing
FileByteArray = Nothing
oImage = Nothing
oThumb = Nothing
upfile.Dispose()

Catch ex As Exception
Throw
Finally


--
Sylvain Duvernay

3 réponses

Avatar
Patrice
Le flux correspondant à la vignette ne me semble pas être fermé...
--
Patrice

"Sylvain" a écrit dans le message de
news:
Bonjour,

J'éxécute le code suivant lorsque je clique sur un bouton dans ma page


aspx.
Ce code fonctionne très bien la 1ere fois. Par contre lorsque je clique


une
2e fois sans avoir raffraichit ma page, j'obtiens une erreur du type : une
erreur générique s'est produit avec GDI+.
Cette erreur arrive lorsque je sauve l'image, je ne comprends pas....

Voici le code:

Try

Dim oConfig As New CSO_Lib_V2.clsConfig
Dim cnDataBase As New System.Data.SqlClient.SqlConnection
Dim sqlCmd As New System.Data.SqlClient.SqlCommand
Dim sPath As String
Dim sPhotoName As String
Dim iLastSlashIndex As Integer

' on enregistre les données dans un tableau de valeurs


binaires
Dim StreamObject As System.IO.Stream
' on récupère la taille de l'image.
Dim FileLength As Long = upfile.PostedFile.ContentLength
' on créer un tableau de byte de la taille de l'image.
Dim FileByteArray(FileLength) As Byte

' On récupère le fichier dans un stream
StreamObject = upfile.PostedFile.InputStream
' On lit le stream qui va remplir le tableau de bytes.
StreamObject.Read(FileByteArray, 0, FileLength)
' On récupère le nom du fichier.
iLastSlashIndex = upfile.PostedFile.FileName.LastIndexOf("")
sPhotoName > upfile.PostedFile.FileName.Substring(iLastSlashIndex + 1)
'On recréer l'image pour pouvoir la retailler.
Dim oImage As New Bitmap(StreamObject)
Dim oThumb As System.Drawing.Image
' On créer le thumbnail.
oThumb = oImage.GetThumbnailImage(130, 90, Nothing, Nothing)
' On récupère le chemin du dossier temporaire.
sPath = Server.MapPath("ImagesProduitsTempphoto-p.jpg")
' On sauve au format jpg.
oThumb.Save(sPath, Imaging.ImageFormat.Jpeg)

' On lit le thumb dans un flux.
Dim StreamThumb As System.IO.Stream > System.IO.File.OpenRead(sPath)
Dim ThumbLength As Long = StreamThumb.Length

' on créer un tableau de byte de la taille de l'image.
Dim ThumbByteArray(ThumbLength) As Byte
' on met le contenu du flux dans un tableau.
StreamThumb.Read(ThumbByteArray, 0, ThumbLength)


' On insère l'image dans la base.
cnDataBase.ConnectionString > oConfig.GetSetting("ConnectionString")
cnDataBase.Open()
sqlCmd.Connection = cnDataBase
sqlCmd.CommandType = CommandType.StoredProcedure
sqlCmd.CommandText = "InsertImage"

' Image taille réelle.
sqlCmd.Parameters.Add(New
System.Data.Sqlclient.SqlParameter("@PhotoName", sPhotoName))
sqlCmd.Parameters.Add(New
System.Data.Sqlclient.SqlParameter("@Photo", FileByteArray))
sqlCmd.Parameters.Add(New
System.Data.Sqlclient.SqlParameter("@TypeImage",
upfile.PostedFile.ContentType))
sqlCmd.Parameters.Add(New
System.Data.Sqlclient.SqlParameter("@Taille", FileLength))

' Thumbnail.
sqlCmd.Parameters.Add(New
System.Data.Sqlclient.SqlParameter("@ThumbName", sPhotoName))
sqlCmd.Parameters.Add(New
System.Data.Sqlclient.SqlParameter("@Thumb", ThumbByteArray))
sqlCmd.Parameters.Add(New
System.Data.Sqlclient.SqlParameter("@ThumbType",
upfile.PostedFile.ContentType))
sqlCmd.Parameters.Add(New
System.Data.Sqlclient.SqlParameter("@ThumbTaille", ThumbLength))

sqlCmd.ExecuteNonQuery()
cnDataBase.Close()

'On supprime les fichiers temporaires.

' Suppression des variables utilisées.
oConfig = Nothing
cnDataBase = Nothing
sqlCmd = Nothing
StreamObject = Nothing
FileByteArray = Nothing
oImage = Nothing
oThumb = Nothing
upfile.Dispose()

Catch ex As Exception
Throw
Finally


--
Sylvain Duvernay



Avatar
Sylvain
Merci Patrice pour cette réponse.
Mais comment dois je fermer le flux ???

Merci.
--
Sylvain Duvernay



"Patrice" a écrit :

Le flux correspondant à la vignette ne me semble pas être fermé...
--
Patrice

"Sylvain" a écrit dans le message de
news:
> Bonjour,
>
> J'éxécute le code suivant lorsque je clique sur un bouton dans ma page
aspx.
> Ce code fonctionne très bien la 1ere fois. Par contre lorsque je clique
une
> 2e fois sans avoir raffraichit ma page, j'obtiens une erreur du type : une
> erreur générique s'est produit avec GDI+.
> Cette erreur arrive lorsque je sauve l'image, je ne comprends pas....
>
> Voici le code:
>
> Try
>
> Dim oConfig As New CSO_Lib_V2.clsConfig
> Dim cnDataBase As New System.Data.SqlClient.SqlConnection
> Dim sqlCmd As New System.Data.SqlClient.SqlCommand
> Dim sPath As String
> Dim sPhotoName As String
> Dim iLastSlashIndex As Integer
>
> ' on enregistre les données dans un tableau de valeurs
binaires
> Dim StreamObject As System.IO.Stream
> ' on récupère la taille de l'image.
> Dim FileLength As Long = upfile.PostedFile.ContentLength
> ' on créer un tableau de byte de la taille de l'image.
> Dim FileByteArray(FileLength) As Byte
>
> ' On récupère le fichier dans un stream
> StreamObject = upfile.PostedFile.InputStream
> ' On lit le stream qui va remplir le tableau de bytes.
> StreamObject.Read(FileByteArray, 0, FileLength)
> ' On récupère le nom du fichier.
> iLastSlashIndex = upfile.PostedFile.FileName.LastIndexOf("")
> sPhotoName > > upfile.PostedFile.FileName.Substring(iLastSlashIndex + 1)
> 'On recréer l'image pour pouvoir la retailler.
> Dim oImage As New Bitmap(StreamObject)
> Dim oThumb As System.Drawing.Image
> ' On créer le thumbnail.
> oThumb = oImage.GetThumbnailImage(130, 90, Nothing, Nothing)
> ' On récupère le chemin du dossier temporaire.
> sPath = Server.MapPath("ImagesProduitsTempphoto-p.jpg")
> ' On sauve au format jpg.
> oThumb.Save(sPath, Imaging.ImageFormat.Jpeg)
>
> ' On lit le thumb dans un flux.
> Dim StreamThumb As System.IO.Stream > > System.IO.File.OpenRead(sPath)
> Dim ThumbLength As Long = StreamThumb.Length
>
> ' on créer un tableau de byte de la taille de l'image.
> Dim ThumbByteArray(ThumbLength) As Byte
> ' on met le contenu du flux dans un tableau.
> StreamThumb.Read(ThumbByteArray, 0, ThumbLength)
>
>
> ' On insère l'image dans la base.
> cnDataBase.ConnectionString > > oConfig.GetSetting("ConnectionString")
> cnDataBase.Open()
> sqlCmd.Connection = cnDataBase
> sqlCmd.CommandType = CommandType.StoredProcedure
> sqlCmd.CommandText = "InsertImage"
>
> ' Image taille réelle.
> sqlCmd.Parameters.Add(New
> System.Data.Sqlclient.SqlParameter("@PhotoName", sPhotoName))
> sqlCmd.Parameters.Add(New
> System.Data.Sqlclient.SqlParameter("@Photo", FileByteArray))
> sqlCmd.Parameters.Add(New
> System.Data.Sqlclient.SqlParameter("@TypeImage",
> upfile.PostedFile.ContentType))
> sqlCmd.Parameters.Add(New
> System.Data.Sqlclient.SqlParameter("@Taille", FileLength))
>
> ' Thumbnail.
> sqlCmd.Parameters.Add(New
> System.Data.Sqlclient.SqlParameter("@ThumbName", sPhotoName))
> sqlCmd.Parameters.Add(New
> System.Data.Sqlclient.SqlParameter("@Thumb", ThumbByteArray))
> sqlCmd.Parameters.Add(New
> System.Data.Sqlclient.SqlParameter("@ThumbType",
> upfile.PostedFile.ContentType))
> sqlCmd.Parameters.Add(New
> System.Data.Sqlclient.SqlParameter("@ThumbTaille", ThumbLength))
>
> sqlCmd.ExecuteNonQuery()
> cnDataBase.Close()
>
> 'On supprime les fichiers temporaires.
>
> ' Suppression des variables utilisées.
> oConfig = Nothing
> cnDataBase = Nothing
> sqlCmd = Nothing
> StreamObject = Nothing
> FileByteArray = Nothing
> oImage = Nothing
> oThumb = Nothing
> upfile.Dispose()
>
> Catch ex As Exception
> Throw
> Finally
>
>
> --
> Sylvain Duvernay
>





Avatar
Patrice
Donc un StreamThumb.Close.

Accessoirement, il est également possible de sauver l'image dans un flux
(toujours avec la méthode Save) ce qui permettrait sans doute de se passer
du fichier intermédiaire dans un deuxième temps.....

--
Patrice

"Sylvain" a écrit dans le message de
news:
Merci Patrice pour cette réponse.
Mais comment dois je fermer le flux ???

Merci.
--
Sylvain Duvernay



"Patrice" a écrit :

> Le flux correspondant à la vignette ne me semble pas être fermé...
> --
> Patrice
>
> "Sylvain" a écrit dans le message de
> news:
> > Bonjour,
> >
> > J'éxécute le code suivant lorsque je clique sur un bouton dans ma page
> aspx.
> > Ce code fonctionne très bien la 1ere fois. Par contre lorsque je


clique
> une
> > 2e fois sans avoir raffraichit ma page, j'obtiens une erreur du type :


une
> > erreur générique s'est produit avec GDI+.
> > Cette erreur arrive lorsque je sauve l'image, je ne comprends pas....
> >
> > Voici le code:
> >
> > Try
> >
> > Dim oConfig As New CSO_Lib_V2.clsConfig
> > Dim cnDataBase As New System.Data.SqlClient.SqlConnection
> > Dim sqlCmd As New System.Data.SqlClient.SqlCommand
> > Dim sPath As String
> > Dim sPhotoName As String
> > Dim iLastSlashIndex As Integer
> >
> > ' on enregistre les données dans un tableau de valeurs
> binaires
> > Dim StreamObject As System.IO.Stream
> > ' on récupère la taille de l'image.
> > Dim FileLength As Long = upfile.PostedFile.ContentLength
> > ' on créer un tableau de byte de la taille de l'image.
> > Dim FileByteArray(FileLength) As Byte
> >
> > ' On récupère le fichier dans un stream
> > StreamObject = upfile.PostedFile.InputStream
> > ' On lit le stream qui va remplir le tableau de bytes.
> > StreamObject.Read(FileByteArray, 0, FileLength)
> > ' On récupère le nom du fichier.
> > iLastSlashIndex upfile.PostedFile.FileName.LastIndexOf("")
> > sPhotoName > > > upfile.PostedFile.FileName.Substring(iLastSlashIndex + 1)
> > 'On recréer l'image pour pouvoir la retailler.
> > Dim oImage As New Bitmap(StreamObject)
> > Dim oThumb As System.Drawing.Image
> > ' On créer le thumbnail.
> > oThumb = oImage.GetThumbnailImage(130, 90, Nothing,


Nothing)
> > ' On récupère le chemin du dossier temporaire.
> > sPath = Server.MapPath("ImagesProduitsTempphoto-p.jpg")
> > ' On sauve au format jpg.
> > oThumb.Save(sPath, Imaging.ImageFormat.Jpeg)
> >
> > ' On lit le thumb dans un flux.
> > Dim StreamThumb As System.IO.Stream > > > System.IO.File.OpenRead(sPath)
> > Dim ThumbLength As Long = StreamThumb.Length
> >
> > ' on créer un tableau de byte de la taille de l'image.
> > Dim ThumbByteArray(ThumbLength) As Byte
> > ' on met le contenu du flux dans un tableau.
> > StreamThumb.Read(ThumbByteArray, 0, ThumbLength)
> >
> >
> > ' On insère l'image dans la base.
> > cnDataBase.ConnectionString > > > oConfig.GetSetting("ConnectionString")
> > cnDataBase.Open()
> > sqlCmd.Connection = cnDataBase
> > sqlCmd.CommandType = CommandType.StoredProcedure
> > sqlCmd.CommandText = "InsertImage"
> >
> > ' Image taille réelle.
> > sqlCmd.Parameters.Add(New
> > System.Data.Sqlclient.SqlParameter("@PhotoName", sPhotoName))
> > sqlCmd.Parameters.Add(New
> > System.Data.Sqlclient.SqlParameter("@Photo", FileByteArray))
> > sqlCmd.Parameters.Add(New
> > System.Data.Sqlclient.SqlParameter("@TypeImage",
> > upfile.PostedFile.ContentType))
> > sqlCmd.Parameters.Add(New
> > System.Data.Sqlclient.SqlParameter("@Taille", FileLength))
> >
> > ' Thumbnail.
> > sqlCmd.Parameters.Add(New
> > System.Data.Sqlclient.SqlParameter("@ThumbName", sPhotoName))
> > sqlCmd.Parameters.Add(New
> > System.Data.Sqlclient.SqlParameter("@Thumb", ThumbByteArray))
> > sqlCmd.Parameters.Add(New
> > System.Data.Sqlclient.SqlParameter("@ThumbType",
> > upfile.PostedFile.ContentType))
> > sqlCmd.Parameters.Add(New
> > System.Data.Sqlclient.SqlParameter("@ThumbTaille", ThumbLength))
> >
> > sqlCmd.ExecuteNonQuery()
> > cnDataBase.Close()
> >
> > 'On supprime les fichiers temporaires.
> >
> > ' Suppression des variables utilisées.
> > oConfig = Nothing
> > cnDataBase = Nothing
> > sqlCmd = Nothing
> > StreamObject = Nothing
> > FileByteArray = Nothing
> > oImage = Nothing
> > oThumb = Nothing
> > upfile.Dispose()
> >
> > Catch ex As Exception
> > Throw
> > Finally
> >
> >
> > --
> > Sylvain Duvernay
> >
>
>
>