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

NetBeans Java Discussion :

[Visual Web] Comment envoyer les entêtes HTTP adéquats au navigateur (php ==> JAVA)


Sujet :

NetBeans Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    496
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 496
    Par défaut Comment envoyer les entêtes HTTP adéquats au navigateur (php ==> JAVA)
    Bonjour j'aimerais forcer un download en utilisant le code PHP suivant mais avec Java.

    Est-ce que quelqu'un peut me dire comment faire ceci en java.

    J'utilise VWP de Netbeans.

    Merci.


    Il existe des types de fichiers qui sont normalement interprétés par le navigateur comme étant spécifiques à une application. La dite application va s'exécuter et ouvrir le fichier.
    On souhaite ne pas ouvrir cette application et forcer l'enregistrement du fichier sur le disque du client. Pour forcer l'apparition de la boîte de dialogue "Enregistrer...", il faut envoyer les entêtes HTTP adéquats au navigateur. ;

    http://php.developpez.com/faq/?page=..._forcedownload

    Code php : 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
    <?php
    //
    // Constantes de configuration
    //
    define('CFG_SYSTEM_FILENAME', 'fichier.ext');
    define('CFG_SEND_FILENAME', CFG_SYSTEM_FILENAME);
     
    //
    // Constantes à ne pas modifier
    //
    define('CFG_FILESIZE', filesize(CFG_SYSTEM_FILENAME));
    define('CFG_FILE_MD5', md5_file(CFG_SYSTEM_FILENAME));
    define('CFG_DATE_FORMAT', 'D, d M Y H:i:s');
     
    //
    // Quelques éléments nécessaires
    //
    error_reporting(0);
    ini_set('zlib.output_compression', 0);
     
     
    /*
     *Début de l'envoi
     */
    //
    // Gestion du cache
    //
    header('Pragma: public');
    header('Last-Modified: '.gmdate(CFG_DATE_FORMAT).' GMT');
    header('Cache-Control: must-revalidate, pre-check=0, post-check=0, max-age=0');
     
    //
    // Informations sur le contenu à envoyer
    //
    header('Content-Tranfer-Encoding: none');
    header('Content-Length: '.CFG_FILESIZE);
    header('Content-MD5: '.base64_encode(CFG_FILE_MD5));
    header('Content-Type: application/octetstream; name="'.CFG_SEND_FILENAME.'"');
    header('Content-Disposition: attachement; filename="'.CFG_SEND_FILENAME.'"');
     
    //
    // Informations sur la réponse HTTP elle-même
    //
    header('Date: '.gmdate(CFG_DATE_FORMAT, time()).' GMT');
    header('Expires: '.gmdate(CFG_DATE_FORMAT, time()+1).' GMT');
    header('Last-Modified: '.gmdate(CFG_DATE_FORMAT, time()).' GMT');
    ?>

  2. #2
    Membre éprouvé
    Avatar de Valère
    Profil pro
    Inscrit en
    Août 2005
    Messages
    1 334
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Août 2005
    Messages : 1 334
    Par défaut
    Bonjour Diamonds,

    Je ne souhaites pas trop te donner la solution toute faite, simplement les grandes lignes, pour que tu cherches un peu quand même (c'est en forgeant qu'on devient forgeron).

    Donc, résumé des étapes précédentes, tu as désormais un serveur Tomcat installé sur ton serveur Solaris qui contient tes données à transférer.

    Nous n'avons donc plus besoin du FTPBean, puisque les données sont disponibles en local. Pour le remplacer et déterminer la liste des fichiers disponibles (et donc construire les dropdowns) il faut se diriger vers les traditionnelles méthodes de la classe java.io.File. Astuce: lire http://java.developpez.com/faq/java/ et surtout ici http://java.developpez.com/faq/java/...ngage_fichiers ne peut que te faire du bien.

    En ce qui concerne le téléchargement à proprement parler, nous allons utiliser la servlet évoquée ici.

    Quelques modifications à prévoir: dans le code de la page VWP en mode design, je suggère de placer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            session.setAttribute(maReference, myFileToDownload);
    , myFileToDownload étant le java.io.File à télécharger défini par l'utilisateur.

    Du coup, dans la servlet, nous avons forcément la récupération de l'objet à modifier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                File myFile = (File) session.getAttribute(reference);
    Ensuite, il faut s'occuper des en-têtes de session. En fait, dans l'exemple PHP donné plus haut, la partie cruciale est (je pense) le
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    header('Content-Type: application/octetstream; name="'.CFG_SEND_FILENAME.'"');

    Dans notre servlet, il faut donc définir:
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
                response.setContentType("application/octetstream");

    Dernière étape: récupérer et transmettre le flux de données que contitue ton fichier xml. La solution est presque dans la FAQ, dans cette réponse: http://java.developpez.com/faq/java/...FICHIER_copier. A la place de copier le flux de données lu dans le nouveau fichier avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                            destinationFile.write(buffer, 0, nbLecture);
    , il faut le transmettre à la réponse de la servlet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                response.getOutputStream().write(buffer, 0, nbLecture);
    A toi de jouer!

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    496
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 496
    Par défaut
    [quote=valered]
    Ensuite, il faut s'occuper des en-têtes de session. En fait, dans l'exemple PHP donné plus haut, la partie cruciale est (je pense) le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    header('Content-Type: application/octetstream; name="'.CFG_SEND_FILENAME.'"');
    Salut Valered, et bienvenue dans le monde de développez.net

    Juste avant d'aller dans les détails.
    Sur une page web de VWP j'ai un composant "Hyperlien".
    Dans les propriétés de ce composant, j'ai mis l'adresse suivante dans son évenement "OnClick" : window.open(http://XXXX/ZZZ/monfichier.yyy'))

    Puis-je ajuster seulement le Header selon le post de Mathieu et rajouter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    header('Content-Type: application/octetstream; name="'.CFG_SEND_FILENAME.'"');
    Si oui, à quelle place faut-il le rajouter ?
    En attendant ta réponse, je suis en train de programmer le reste.

  4. #4
    Membre éprouvé
    Avatar de Valère
    Profil pro
    Inscrit en
    Août 2005
    Messages
    1 334
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Août 2005
    Messages : 1 334
    Par défaut
    Je ne vois pas l'intérêt de ta commande javascript window.open(), un lien classique devrait faire l'affaire...

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    496
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 496
    Par défaut
    Citation Envoyé par valered
    Je ne vois pas l'intérêt de ta commande javascript window.open(), un lien classique devrait faire l'affaire...
    C'est que lorsque j'utilise juste un http classique, je n'ai aucun résultat soit que le fichier a une extension connue ou non.

    Mais si j'utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    window.open('http://XXXXX/ZZZ/monfichier.yyy','mywindow','width=400,height=200')
    Dans ce cas une fenêtre s'ouvre en me disant que la ressource monfichier.yyy est non disponible

    mais si je mets une extension connue comme monfichier.xml ou monfichier.txt le fichier est exécuté.

    Mais l'important c'est de savoir où je vais ajuster le header ?

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    496
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 496
    Par défaut
    Citation Envoyé par valered
    Je ne vois pas l'intérêt de ta commande javascript window.open(), un lien classique devrait faire l'affaire...
    Salut Valered

    Lorsque je télécharge un fichier qui a un format .zip je recois le popup de sauvegarde.

    Sais tu comment je peux aller changer le type Mime d'un fichier ?

    Si on utilise la classe URLConnection du package java.net , le code suivant ne fait que connaitre le type MIME mais sans le changer.

    Comment peut-on modifier ce code pour mettre le type MIME approprié ?

    Si non, peux-ton zipper le fichier qu'on veut télécharger avant de le télécharger. je sais qu'on peut le faire sur le répertoire même, mais je veux que mon application VWP le fait. de toute façons c'est mieux parce que le selection des drop down nous aménera à téléchargé notre fichier en question mais aussi avec d'autres fichiers avec lui (fichier d'explication, une doc technique, etc.)

    Alors à chaque téléchargement, on va téléchargé un zip qui contient peut-être 3 ou 4 fichiers.

    Est-ce que tu as des idées la-dessus ?



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public static String getMIMEType(File file){   if(file.isDirectory()){return "repertoire";}   if(!file.exists()){return "fichier inexistant";}   URL url = file.toURL();   URLConnection connection = url.openConnection();   return connection.getContentType();}

  7. #7
    Membre éprouvé
    Avatar de Valère
    Profil pro
    Inscrit en
    Août 2005
    Messages
    1 334
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Août 2005
    Messages : 1 334
    Par défaut
    Le type MIME est censé être défini par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    response.setContentType("application/octetstream");
    Sinon, faire un zip est envisageable. Tu as le package java.util.zip de J2SE pour ça. Ca peut simplifier les choses: si dans la phase de sélection via les dropdown, tu créés un fichier zip et l'adresse url vers ce fichier zip via le serveur apache HTTPD, alors plus besoin de la servlet.

    L'intérêt de la servlet, précedemment, c'était de pourvoir définir le type MIME pour forcer le téléchargement et non l'affichage du XML.

    Val

Discussions similaires

  1. Réponses: 4
    Dernier message: 07/08/2012, 15h00
  2. Réponses: 0
    Dernier message: 25/11/2007, 16h48
  3. Réponses: 7
    Dernier message: 24/01/2007, 16h05
  4. Javascript : affiche les entêtes HTTP
    Par chodaboy34 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 25/08/2006, 08h59
  5. Réponses: 2
    Dernier message: 19/04/2006, 13h43

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