IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET Discussion :

Upload d'image : erreur en distant


Sujet :

ASP.NET

  1. #1
    Membre régulier Avatar de Azephel
    Inscrit en
    Février 2007
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Février 2007
    Messages : 141
    Points : 99
    Points
    99
    Par défaut Upload d'image : erreur en distant
    Bonjour bonjour !

    Alors voila. J'ai une super fonction (en fait deux) qui me permettent d'uploader une image sur le serveur et de la redimmensionner. Le seul souci, c'est que ça fonctionne très bien en local, mais en distant c'est niet.

    Voici la fonction appelée en première :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     Public Function UploadAvatar() As Boolean
     
            If IsPostBack Then
     
                Dim path As String = Server.MapPath("~/UpImages/")
                Dim fileOK As Boolean = False
                If UploadPhoto.HasFile Then
                    Dim fileExtension As String
                    fileExtension = System.IO.Path.GetExtension(UploadPhoto.FileName).ToLower()
                    Dim allowedExtensions As String() = {".jpg", ".jpeg"}
                    For i As Integer = 0 To allowedExtensions.Length - 1
                        If fileExtension = allowedExtensions(i) Then
                            fileOK = True
                        End If
                    Next
     
                    If fileOK Then
                        Try
                            Dim oImage As System.Drawing.Image = Nothing
                            If File.Exists(path & "139.jpg") Then
                                File.Delete(path & "139.jpg")
                            ElseIf File.Exists(path & "139.jpeg") Then
                                File.Delete(path & "139.jpeg")
                            End If
                            Dim image As String = ""
                            If System.IO.Path.GetExtension(UploadPhoto.FileName).ToLower() = ".jpg" Then
                                UploadPhoto.PostedFile.SaveAs(path & _
                                     "139.jpg")
                                oImage = System.Drawing.Image.FromFile(path & "139.jpg")
                                image = "139.jpg"
                            ElseIf System.IO.Path.GetExtension(UploadPhoto.FileName).ToLower() = ".jpeg" Then
                                UploadPhoto.PostedFile.SaveAs(path & _
                                     "139.jpeg")
                                image = "139.jpeg"
                                oImage = System.Drawing.Image.FromFile(path & "139.jpeg")
                            Else
                                Dim ex As New Exception("Format non supporté, choisissez une autre photo.")
                                Throw ex
                            End If
                            PhotoEnregistreRetaille(oImage, System.IO.Path.GetExtension(UploadPhoto.FileName).ToLower(), image, 240, 200) 'Appel de la deuxième fonction
                            LblErreur.Text = "Image téléchargée !<br />Votre image sera redimensionnée si ses dimensions sont supérieurs à 240 X 200 pixels.<br />"
                            Return False
                        Catch ex As Exception
                            If ex.Message = "Format non supporté, choisissez une autre photo." Then
                                LblErreur.Text = ex.Message
                            Else
                                LblErreur.Text = "Ce fichier ne peut pas être téléchargé." 'C'est ce message d'erreur qui est affiché, donc c'est une exception qui est lancée.
                            End If
     
                            Return True
                        End Try
                    Else
                        LblErreur.Text = "Ce fichier ne peut pas être téléchargé."
                        Return True
                    End If
                End If
            End If
     
        End Function
    Et voici la fonction qui permet de retailler l'image, appelée par la fonction précédente :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    Private Function PhotoEnregistreRetaille(ByVal oImageSource As System.Drawing.Image, ByVal Format As String, ByVal filename As String, ByVal LargeurMaxi As Integer, ByVal hauteurMaxi As Integer) As Boolean
     
            Dim HauteurImage, LargeurImage As Integer
            Dim propor As Double
            If oImageSource.Width > LargeurMaxi Then
                propor = oImageSource.Width / oImageSource.Height
                LargeurImage = LargeurMaxi
                HauteurImage = LargeurImage / propor
                If HauteurImage > hauteurMaxi Then
                    HauteurImage = hauteurMaxi
                    LargeurImage = HauteurImage * propor
                End If
                Try
                    Dim oImageCible As System.Drawing.Bitmap = New System.Drawing.Bitmap(LargeurImage, HauteurImage, oImageSource.PixelFormat)
                    Dim oGraphique As System.Drawing.Graphics = System.Drawing.Graphics.FromImage(oImageCible)
                    oGraphique.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality
                    oGraphique.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic
                    oGraphique.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality
                    oGraphique.DrawImage(oImageSource, 0, 0, oImageCible.Width, oImageCible.Height)
                    oGraphique.Dispose()
                    Dim ImgFormat As System.Drawing.Imaging.ImageFormat
                    Select Case Format
                        Case ".jpg"
                            ImgFormat = System.Drawing.Imaging.ImageFormat.Jpeg
                        Case ".jpeg"
                            ImgFormat = System.Drawing.Imaging.ImageFormat.Jpeg
                        Case Else
                            ImgFormat = System.Drawing.Imaging.ImageFormat.Jpeg
                    End Select
                    oImageSource.Dispose()
                    Dim path As String = Server.MapPath("~/UpImages/")
                    File.Delete(path & filename)
                    oImageCible.Save(path & filename, ImgFormat)
                    Return True
                Catch exThread As Threading.ThreadAbortException
                    Throw exThread
                Catch ex As Exception
                    Return False
                End Try
            Else
                Return True
            End If
        End Function
    Si quelqu'un pouvait m'aider, ça serait génial. Ca fait déjà quelques heures que je suis dessus et toujours rien...

    Merci d'avance !

  2. #2
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Points : 8 734
    Points
    8 734
    Par défaut
    Et c'est quoi le problème???

  3. #3
    Membre expérimenté Avatar de bossun
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 359
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 359
    Points : 1 443
    Points
    1 443
    Par défaut
    Citation Envoyé par lutecefalco Voir le message
    Et c'est quoi le problème???

    C'est un challenge... on doit essayer de le trouve :-)

    Je pense que c'est un problème de droits qu'il doit avoir...

  4. #4
    Membre régulier Avatar de Azephel
    Inscrit en
    Février 2007
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Février 2007
    Messages : 141
    Points : 99
    Points
    99
    Par défaut
    ça fonctionne très bien en local, mais en distant c'est niet.
    Voila le souci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LblErreur.Text = "Ce fichier ne peut pas être téléchargé." 'C'est ce message d'erreur qui est affiché, donc c'est une exception qui est lancée.
    Et voici ce que ça fait.

    Je vois que la lecture des problèmes se fait rapidement...

    Bon, en tout cas, bossun a raison. Après avoir virer le try catch, c'est un problème de droits d'accès.

    Donc la question change :
    A qui mettre les droits sur le répertoire sachant que dans le web config j'ai ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <authentication mode="Windows"/>
    		<identity impersonate="true"/>
    ASP.NET possède t'il un compte pour lequel on peut lui accorder des droits ?
    merci d'avance.

  5. #5
    Membre expérimenté Avatar de bossun
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 359
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 359
    Points : 1 443
    Points
    1 443
    Par défaut
    tu as beau à mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <authentication mode="Windows"/>
    		<identity impersonate="true"/>

    si les utilsiateurs n'ont pas les droits, ça ne marchera pas quand meme.


    SI tu es dans un environnement Intranet, Active Directory, tu dois enlever l'authentification annonyme de sur ton server IIS. si tu ne le fais pas, il va utiliser ASPNET pour se connecter et ASPNET est un compte très limité..

  6. #6
    Membre régulier Avatar de Azephel
    Inscrit en
    Février 2007
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Février 2007
    Messages : 141
    Points : 99
    Points
    99
    Par défaut
    Je suis en extranet et donc je n'utilise pas l'AD. Nous avons donné le controle total à l'utilisateur IUSR/machine (je sais pas le nom exact, et notre admin réseau est sur un autre truc plus urgent). Je ne sais pas trop quoi faire au niveau des droits, c'est vraiment pas mon fort...

  7. #7
    Membre expérimenté Avatar de bossun
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 359
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 359
    Points : 1 443
    Points
    1 443
    Par défaut
    c n'est pas le bon compte..

    celui-ci sert pour l'accès annonyme à iis..


    donne les droits au compte ASPNET et ton problème sera reglé

  8. #8
    Membre régulier Avatar de Azephel
    Inscrit en
    Février 2007
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Février 2007
    Messages : 141
    Points : 99
    Points
    99
    Par défaut
    Le message d'erreur vient de changer sans que nous ayons changé les droits pour qui que ce soit. Maintenant, ça plante lors de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    File.Delete(path & "139.jpg")
    car le fichier est utilisé par un autre processus.

    Seulement, quel processus ? Est-ce un processus lié à ASPNET ? Un processus système ?
    Et surtout comment libérer ce processus pour qu'il me supprime le fichier ?

  9. #9
    Membre expérimenté Avatar de bossun
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 359
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 359
    Points : 1 443
    Points
    1 443
    Par défaut
    Tu fais qqch qui n'est pas juste dans ton code...

    quand tu upload l'imge tu la sauve d'abord et après tu la modifies... ceci peut poser problème si tu ne libère pas correctement les ressources...

    charge plutot ton image en memoire et après tu la reduis, et finalement la sauvegarde.. ca t evitera ces messages d erreurs..

  10. #10
    Membre régulier Avatar de Azephel
    Inscrit en
    Février 2007
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Février 2007
    Messages : 141
    Points : 99
    Points
    99
    Par défaut
    J'y avait même pas pensé.
    Seulement est-il possible d'instancier mon objet oImage avec le fichier posté par le controle fileupload ?

    Actuellement si je le sauvegarde une première fois c'est justement pour pouvoir faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    oImage = System.Drawing.Image.FromFile(path & "139.jpg")
    Et ensuite je passe mon objet oImage à la deuxième fonction. Est-il possible donc d'instancier mon objet Drawing.Bitmap sans sauvegarder le fichier auparavant ?

  11. #11
    Membre expérimenté Avatar de bossun
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 359
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 359
    Points : 1 443
    Points
    1 443
    Par défaut
    Voilà ce que tu veux faire en 4 lignes...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            Dim s As System.IO.Stream = FileUpload1.PostedFile.InputStream
            Dim img As Image = Image.FromStream(s)
            Dim bmp As Bitmap = New Bitmap(img, 100, 150)
            bmp.Save(Server.MapPath("~") & "\img.jpg", Imaging.ImageFormat.Jpeg)
    à adapter selon tes besoins

  12. #12
    Membre régulier Avatar de Azephel
    Inscrit en
    Février 2007
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Février 2007
    Messages : 141
    Points : 99
    Points
    99
    Par défaut
    Merci énormément de ton aide bossun. Je test ça dès que je peux et je retiens au courant !

  13. #13
    Membre régulier Avatar de Azephel
    Inscrit en
    Février 2007
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Février 2007
    Messages : 141
    Points : 99
    Points
    99
    Par défaut
    C'est bon, ça fonctionne sans problèmes !
    Merci bossun, grâce à toi une erreur très chiante vient d'être résolue.
    Aller hop, résolu !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [eZ Publish 4] Erreur d'upload d'image
    Par sboyer dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 16/06/2010, 16h25
  2. Réponses: 2
    Dernier message: 09/11/2008, 13h14
  3. Réponses: 1
    Dernier message: 22/07/2008, 20h12
  4. Erreur variable pour formulaire d'upload d'image
    Par DjChat dans le forum Langage
    Réponses: 5
    Dernier message: 28/05/2008, 12h12
  5. Réponses: 8
    Dernier message: 15/10/2006, 18h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo