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

C# Discussion :

Récupérer une image via une URL


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Mai 2011
    Messages : 4
    Par défaut Récupérer une image via une URL
    Bonjour à tous,

    J'essaie depuis quelque temps de récupéré en C# une image qui m'est retourné via une URL. Cependant, cette image est retourné en téléchargement.
    J'ai essayé la méthode suivant pour la récupéré mais sans succès. J'obtient l'erreur
    HTTP 500 internal server error

    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
     
    System.IO.MemoryStream file = new System.IO.MemoryStream();
    System.Net.WebRequest webRequest = System.Net.WebRequest.Create("http://test.com/pdf.do?lat=46.96543&lon=-71.20991&lang=en");
    webRequest.Timeout = 10000;
     
    System.Net.WebResponse webResponse = webRequest.GetResponse();
     
    byte[] buffer = new byte[1024];
     
    using(System.IO.Stream webFile = webResponse.GetResponseStream())
    {
       int bytesRead;
       while((bytesRead = webFile.Read(buffer, 0, buffer.Length)) > 0)
       {
         file.Write(buffer, 0, bytesRead);
       }
    }
    webResponse.Close();
    si je met l'URL directement dans un browser internet une fenetre de sauvegarde s'afficher pour pouvoir soit sauvegarder ou ouvrir l'image.


    Alors ma question est: Comment puis-je récupéré le data de l'image avec ce type d'URL (image non spécifié dans l'URL)?

    J'utilise .NET 1.1

    Merci à tous

  2. #2
    Membre éclairé Avatar de cs_ntd
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2006
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 598
    Par défaut
    Salut,

    Je ne suis pas sur a 100%, mais tu devrais essayer d'utiliser l'objet HttpRequest plutot, il me semble avoir lu que le WebRequest ne devrait pas etre utilisé.
    Cela va peut etre résoudre ton problème, mais pas sur.

    L'erreur 500 sur un serveur est une 'Internal Error' ca veut dire en gros que c'est pas de ta faute
    Je vais tenter de deviner : Usuellement, lorsque l'on a un probleme de requete sur un site Web, cela vient du fait que la requete est mauvaise/mal formée (erreur 400), que l'on a pas l'autorisation de visualiser cette page (401, 403), etc...

    Typiquement, une erreur 500, cela vient du script PHP (du site) qui plante, ou des entetes de réponses (du site) qui ne sont pas conformes.

    Et pourquoi ca marche avec ton navigateur et pas avec WebRequest ? (C'est la que je devine) Le navigateur transmet tout un tas d'entete qui a mon avis ne sont pas transmises par WebRequest (notament User-Agent, je ne pense pas que WebRequest le transmette, alors que HttpRequest peut-etre). Or si le site est pas très bien concu, et cherche a utiliser ce User-Agent (alors qu'il est pas défini car pas transmis), et bien le site peut 'planter', d'ou l'erreur 500.
    Le User-Agent est un exemple, ce n'est peut-etre pas lui qui pose probleme.

    Donc comment éviter cette erreur 500 (si ca ne marche toujours pas avec HttpRequest) : Il faut que tu regarde toutes les entetes transmises par ton navigateur : D'une maniere générale, tu peux voir ca avec WireShark, ou sinon Firebug (pour Firefox), DragonFly (Opera), ...

    Ensuite, spécifie les memes Headers dans la classe HttpRequest. La liste des Headers que tu peux définir est présente ici :
    http://msdn.microsoft.com/en-us/libr...t.headers.aspx
    (Note : tu ne peut pas les modifier directement avec HttpRequest.Headers tu dois passer par HttpRequest.[Header name])

    Si ca ne marche pas, je n'ai pas d'autres idées pour l'instant ! (A par faire une requete "a la main" pour maitriser tout ce qui est envoyé...)

    Bon courage


    EDIT: Pourquoi utiliser le .NET 1.1 ??? Tu utilises Mono sous Linux ? A par ca sinon je ne vois pas

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Mai 2011
    Messages : 4
    Par défaut
    J'ai essayer de récupéré mon image avec le HttpRequest mais sans succes.

    Je ne suis pas certain d'avoir compris la partir ou tu parle des header. J'ai essayer de voir avec Firebug si il y avait un header particulier mais je ne semblais pas capable de voir car la fenetre de sauvegarde de l'image était aussitot affiché.

    J'ai testé le code suivant aussi mais pas plus de succes. Peut-être cela aidera-t-il:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    using(WebClient wc = new WebClient())
             {
                wc.DownloadFile("http://test.com/pdf.do?lat=46.96543&lon=-71.20991&lang=en","c:\\test.png");
             }
    J'utilitse .Net 1.1 avec Visual studio 2003 car je travail dans un site web qui a été developpé à la base en 1.1.

    Merci

  4. #4
    Membre éclairé Avatar de cs_ntd
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2006
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 598
    Par défaut
    Tu veux vraiment pas utiliser HttpWebRequest ?

    Le WebRequest est une abstract class a la base, utilisée apres par HttpWebRequest, FtpWebRequest...

    HttpWebRequest est ici particulierment adapté. Et ca te permet d'utiliser les header propres a HTTP.

    Les headers justement : Voici un exemple de requete HTTP trouvée au pif sur le net :

    GET /en/html/dummy.php?name=MyName&married=not+single &male=yes HTTP/1.1
    Host: www.explainth.at
    User-Agent: Mozilla/5.0 (Windows;en-GB; rv:1.8.0.11) Gecko/20070312 Firefox/1.5.0.11
    Accept: text/xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
    Accept-Language: en-gb,en;q=0.5
    Accept-Encoding: gzap,deflame
    Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
    Keep-Alive: 300
    Connection: keep-alive
    Referer: http://www.explainth.at/en/misc/httpreq.shtml
    J'ai mis les headers en gras. Ces headers peuvent etre utilisés par le site Web pour adapter sa réponse. Ils sont transmis par le navigateur (et avec WebRequest). Certains sont facultatifs, d'autres non.

    Le probleme : que ce passe-t-il si une entete (header) facultative, définie par le navigateur est utilisée par le serveur, mais que WebRequest ne transmet pas ce header ?
    Suivant comment le serveur a été codé, celui-ci peut crasher, envoyer n'importe quoi, ... bref, ca peut provoquer une erreur 500, du fait d'une différence de header.

    Ce que je proposais, c'était de regarder la requete HTTP envoyée par ton navigateur, pour voir les header envoyés. Puis après, dans HttpWebRequest, spécifier les memes Headers

    EDIT: On peut avoir acces au lien ou c'est privé ? Car effectivement, Firebug ne détecte pas la requete si c'est pour un téléchargement...

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Mai 2011
    Messages : 4
    Par défaut
    D'accord,
    et pour ajouter les header est-ce que je dois procédé comme suit:
    Si possible de mettre un exemple ca serait apprécié car je ne suis pas encore très familié avec le web désolé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    System.IO.MemoryStream file = new System.IO.MemoryStream();
             HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(fileURL);
             webRequest.Headers.Add("User-Agent");
     
             System.Net.WebResponse webResponse = webRequest.GetResponse();
    voici les header que j'obtiens:

    Host test.com
    User-Agent Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.2.17) Gecko/20110420 Firefox/3.6.17
    Accept */*
    Accept-Language en-us
    Accept-Encoding gzip,deflate
    Accept-Charset ISO-8859-1,utf-8;q=0.7,*;q=0.7
    Keep-Alive 115
    Connection keep-alive
    Content-Type application/x-www-form-urlencoded; charset=UTF-8
    X-Requested-With XMLHttpRequest
    Referer http://test.com/general.do?lat=45.37...219387&lang=en
    Content-Length 385
    Cookie JSESSIONID=123123123A235234DF2ERW

  6. #6
    Membre éclairé Avatar de cs_ntd
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2006
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 598
    Par défaut
    Bin c'est bon, tu a tout !

    Bon ok un exemple :

    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
     
    using System.Net;
     
    WebRequest webRequest = WebRequest.Create("http://test.com/pdf.do?lat=46.96543&lon=-71.20991&lang=en");
     
    webRequest.Header.Add(HttpRequestHeader.Host,"test.com");
    webRequest.Header.Add(HttpRequestHeader.UserAgent,"Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.2.17) Gecko/20110420 Firefox/3.6.17");
     
    //... etc, tu trouvera la liste complete ici : http://msdn.microsoft.com/en-us/library/system.net.httprequestheader.aspx
     
    webRequest.Timeout = 10000;
     
    WebResponse webResponse = webRequest.GetResponse();
     
    byte[] buffer = new byte[1024];
     
    using(System.IO.Stream webFile = webResponse.GetResponseStream())
    {
       int bytesRead;
       while((bytesRead = webFile.Read(buffer, 0, buffer.Length)) > 0)
       {
         file.Write(buffer, 0, bytesRead);
       }
    }
    webResponse.Close();

Discussions similaires

  1. [Débutant] Manipulation d'images : intégrer une image dans une image
    Par noscollections dans le forum VB.NET
    Réponses: 2
    Dernier message: 17/10/2014, 11h51
  2. Réponses: 1
    Dernier message: 18/06/2013, 03h09
  3. Récupération d'une image via une URL
    Par pscheven dans le forum IGN API Géoportail
    Réponses: 5
    Dernier message: 17/12/2009, 11h46
  4. Comment récupérer la taille d'une image via un lien ?
    Par MaTHieU_ dans le forum Web & réseau
    Réponses: 5
    Dernier message: 17/09/2007, 14h37

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