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

Java Discussion :

Serveur Java problème de renvoi d'images


Sujet :

Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2011
    Messages : 11
    Points : 10
    Points
    10
    Par défaut Serveur Java problème de renvoi d'images
    Bonjour,

    je suis en train de réaliser un serveur web en Java.

    Pour l'instant, mon programme peut interpréter les requêtes HTTP 1.1, et savoir donc quoi faire quand il en reçoit une.

    Lorsque le navigateur envoie une requête HTTP pour une page HTML, PHP ou même CSS ou encore SWF, il renvoie une requête HTTP avec derrière le contenu de ces fichiers et le navigateur les affiche correctement.

    Mais lorsque le navigateur demande par exemple une image en JPEG, mon programme renvoie une requête HTTP correcte avec derrière le contenu de l'image ; le problème est que j'ai l'impression que renvoyer le contenu d'une image en la lisant byte par byte au navigateur n'est pas bon puisqu'à chaque coup le navigateur n'affiche pas l'image correspondante.

    Je pense pas avoir été super clair, hésitez pas à poser des questions si c'est moyennement clair.

    Merci d'avance pour les réponses

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Euh, non, c'est pas clair du tout... Peut-être un mauvais content type ?
    Avec un peu plus de code, on pourrait peut-être faire quelque chose
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2011
    Messages : 11
    Points : 10
    Points
    10
    Par défaut
    Justement en fait dès que le navigateur me demande un fichier html par exemple je réponds par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    HTTP/1.1 200 OK
    Date: Mon Aug 08 17:57:46 CEST 2011
    Content-Type: text/html
    Content-Length: 28
     
    <img src="images/bgb.jpg" />
    du coup il va me demander ensuite l'image JPG :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    GET /mygreenpriz/images/bgb.jpg HTTP/1.1
    Host: 127.0.0.1:8000
    Connection: keep-alive
    Referer: http://127.0.0.1:8000/mygreenpriz/index.php
    User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.122 Safari/534.30
    Accept: */*
    Accept-Encoding: gzip,deflate,sdch
    Accept-Language: fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4
    Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
    comme ça et moi je vais lui répondre par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    HTTP ----- Response from server
    HTTP/1.1 200 OK
    Date: Mon Aug 08 17:57:46 CEST 2011
    Content-Type: image/jpeg
    Content-Length: 1765
     
    --contenu de l'image
    Le content-type est bon mais en fait pour écrire ma réponse à la requête de l'image, je vais ouvrir le fichier jpg et le lire byte par byte pour l'écrire sur la sortie. Au passage mes bytes sont transformés en caractère pour être inscrit dans une chaîne de caractère que j'écrirai ensuite au navigateur comme dit précédemment.

    Donc en gros, je lis le fichier byte par byte, je transforme les byte en char pour les stocker les uns à la suite des autres dans une chaîne de caractères, que j'envoie au navigateur.

    En espérant avoir été beaucoup plus clair.

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 557
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 557
    Points : 21 616
    Points
    21 616
    Par défaut
    Citation Envoyé par olivier_gold Voir le message
    Donc en gros, je lis le fichier byte par byte, je transforme les byte en char pour les stocker les uns à la suite des autres dans une chaîne de caractères, que j'envoie au navigateur.
    Et ça, ça marche avec les SWF mais pas avec les JPEG ? Ça me surprendrait...

    Il ne sert à rien de passer par String ou par des chars, il suffit de transmettre les bytes directement dans l'OutputStream de la réponse...

    La méthode service() de la classe Servlet reçoit en paramètre une ServletResponse.
    Pour répondre des données binaires, il suffit d'y indiquer la taille avec setContentLength(), puis de récupérer l'OutputStream de la réponse avec getOutputStream(), et de recopier les bytes de l'image dedans.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2011
    Messages : 11
    Points : 10
    Points
    10
    Par défaut
    Merci beaucoup Thelvin pour ta réponse qui m'a sauvé en fait ça me paraît plutôt logique maintenant que c'est fait qu'il fallait envoyé les bytes directement sans aucun cast.

    Du coup résolu et pour ceux qui aurait le même problème, voilà la solution :

    Après une requête du navigateur d'un fichier (exemple) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    GET /mygreenpriz/images/send2.png HTTP/1.1
    Host: 127.0.0.1:8000
    Connection: keep-alive
    Referer: http://127.0.0.1:8000/mygreenpriz/index.php
    User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.107 Safari/535.1
    Accept: */*
    Accept-Encoding: gzip,deflate,sdch
    Accept-Language: fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4
    Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
    Pour répondre à ça il faut faire :

    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
    File f = new File("send2.png");
    /*
    * Calcule la longueur du fichier (combien de bytes)
    * En supposant que 'int longueurFichier(File f)' existe
    */
    int length = longueurFichier(f);
     
    // Debut de la réponse (en-tête)
    String response = "";
    response += "HTML/1.1 200 OK\r\n";
    response += "Date : "+ new Date() + "\r\n";
    response += "Content-type : image/png\r\n";
    response += "Content-length : "+length+"\r\n";
    response += "\r\n";
     
    // Récupération des bytes contenus dans le fichier
    DataOutputStream dos = new DataOutputStream(new FileOutputStream(f));
    byte[] byteContent = new byte[length];
    while(dos.read(byteContent) != -1);
     
    // Envoi des données au navigateur
    dos.writeBytes(response); // En-tête
    dos.write(byteContent); // Contenu du fichier
    dos.flush();
    dos.close();
    Evidemment je ne l'ai pas mit mais un try catch pour les IOException est obligatoire pour manipuler des flux d'entrée et de sortie.

    Merci encore une fois pour ta réponse

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

Discussions similaires

  1. Problème de connections Client flash / serveur java
    Par bieltan dans le forum Intégration
    Réponses: 0
    Dernier message: 23/02/2011, 08h53
  2. [PHP/SQL] Problème d'insertion d'image dans SQL SERVEUR
    Par Joelatack dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 24/07/2009, 14h28
  3. Réponses: 1
    Dernier message: 22/07/2008, 20h12
  4. Réponses: 16
    Dernier message: 05/06/2008, 11h32
  5. [Java 2D] problème de composition d'images
    Par wwave dans le forum 2D
    Réponses: 4
    Dernier message: 11/07/2005, 12h28

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