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

Applets Java Discussion :

Téléchargement de fichier par protocole HTTP


Sujet :

Applets Java

  1. #1
    Candidat au Club
    Inscrit en
    Avril 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Téléchargement de fichier par protocole HTTP
    Bonjour à tous,

    Voilà un moment que je bloque sur mon problème qui me parait tordu.

    J'ai créé une applet qui télécharge d'autres fichiers pour fonctionner (des comptes clients notamment) via le protocole http.

    ça fonctionne bien dans 90% des cas, sauf, lorsque je met à jour le fichier juste avant (fichier mis à jour dans l'applet par protocole ftp - via une interface manager) et qu'ensuite je re-télécharge pour vérifier que les données sont bien uploadé sur le serveur (http).

    Dans ce cas là, le téléchargement http me "re-télécharge" l'ancienne version et non la nouvelle...

    Je précise que ça fonctionne lorsque je travail sous éclipse et que cela arrive uniquement lorsque l'applet est lancé à partir du navigateur (Mozilla firefox 2.0)

    J'ai évidament vérifié via un logiciel ftp que mon serveur avait bien été mis à jour, le problème vient pas de l'upload.

    Voici la fonction qui télécharge les fichiers
    protected byte[] getStreamFile( URL url) throws Throwable {
    byte[] data = null;


    URLConnection urlC = url.openConnection();
    urlC.connect();
    int fileLenght = urlC.getContentLength();
    if (fileLenght == -1) {
    throw new IOException("Error on download utilities by server");
    }
    else {
    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM hh:mm:ss" );

    data = new byte[fileLenght];
    }
    InputStream in = null;
    try {
    in = urlC.getInputStream();
    } catch (IOException e) {
    return null;
    }

    int input = 0;
    byte[] buff = new byte[1024];
    int l = in.read(buff);
    while (l > 0) {
    for(int i=0; i<l; i++)
    data[i+input] = buff[i];

    input+=l;
    l = in.read(buff);
    }

    in.close();
    return data;
    }
    Si vous avez des idées du "Pourquoi il me télécharge pas le nouveau fichier mais l'ancien ?" je suis preneur..

    Petite précision, j'ai aussi essayé une autre méthode
    protected byte[] getStreamHTTPProtocole( URL url) throws Throwable {
    int BUF_SIZE = url.openConnection().getContentLength();
    char[] buf = new char[BUF_SIZE];
    Socket socketToWeb;
    PrintWriter toWeb;
    BufferedReader fromWeb;
    String str = "";
    int nb = 0;

    try {
    socketToWeb = new Socket( "http://www.simulator.tmtgonline.com", 80);
    toWeb = new PrintWriter( new BufferedWriter( new OutputStreamWriter( socketToWeb.getOutputStream())),true);
    fromWeb = new BufferedReader( new InputStreamReader( socketToWeb.getInputStream()));

    str = "GET "+ url +" HTTP/1.1\r\nHost: "+ httpAddress +"\r\n";

    toWeb.println(str);

    boolean echoing = true;
    boolean isRecept = false;
    int size = 0;
    while ( !isRecept ) {
    System.out.println( "dialogue...");
    if ( echoing ) {
    str = fromWeb.readLine();
    if ( str == null ) break;
    if ( str.length() == 0 ) {
    echoing = false; // end of header
    }
    System.out.println("Connection... " + str);
    } else {
    for (int i=0;i<nb;buf[i++]=0x00);
    nb = fromWeb.read(buf,0,BUF_SIZE);
    if ( nb == -1 ) {
    int j=BUF_SIZE-1;
    while ( buf[j] == 0x00 && j > 0 )
    j--;
    break;
    }
    System.out.println( "Reception..." + buf.length + "\n" + String.valueOf( buf));
    isRecept = true;
    }
    }
    } catch ( IOException e ) { e.printStackTrace(); }

    return null;
    }
    Merci d'avance pour vos réponses !!

    Je m'exprime assez mal, j'espere que vous comprendrez le dilème, je suis dispo pour ajouter plus de détails, merci.

  2. #2
    Candidat au Club
    Inscrit en
    Avril 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Bon, j'ai regardé de plus près la seconde fonction et après quelques tests supplémentaire j'ai remarqué que le problème n'affectait plus celle-ci (je pense que celle-ci n'a jamais été affecté et que je me suis trompé)

    je les un peu modifié mais le problème c'est que je ne sais pas comment stopper la boucle de reception après avoir tout récupéré toutes les données
    protected byte[] getStreamHTTPProtocole(URL url) throws Throwable {
    char[] buf = new char[BUF_SIZE];
    Socket socketToWeb;
    PrintWriter toWeb;
    BufferedReader fromWeb;
    String str = "";
    int nb = 0;

    try {
    socketToWeb = new Socket("http://www.simulator.tmtgonline.com", 80);
    toWeb = new PrintWriter(new BufferedWriter(new OutputStreamWriter(
    socketToWeb.getOutputStream())), true);
    fromWeb = new BufferedReader(new InputStreamReader(socketToWeb
    .getInputStream()));

    str = "GET " + url + " HTTP/1.1\r\nHost: " + httpAddress + "\r\n";

    toWeb.println(str);

    int size = 0;
    int advance = BUF_SIZE;
    boolean echoing = true;
    boolean isRecept = false;

    while (!isRecept) {
    if (echoing) {
    str = fromWeb.readLine();
    if (str == null)
    break;
    if (str.length() == 0) {
    echoing = false; // end of header
    }
    if( str.contains( "Content-Length: "))
    size = Integer.parseInt( str.substring( 16));
    } else {
    for (int i = 0; i < nb; buf[i++] = 0x00)
    ;
    nb = fromWeb.read(buf, 0, BUF_SIZE);

    if (nb == -1) {
    int j = BUF_SIZE - 1;
    while (buf[j] == 0x00 && j > 0)
    j--;
    break;
    }

    if( size > advance) {
    advance+=BUF_SIZE;
    }
    else
    isRecept = true;

    //System.out.println(buf);
    }
    }
    System.out.println("Downloaded");
    } catch (IOException e) {
    e.printStackTrace();
    }

    return null;
    }
    existe t-il un moyen de fermer la connection une fois la réponse du serveur obtenu ?

    Sinon, pour mon problème de mise à jours du fichier et son re-téléchargement, je pense que cela vient donc de Java et la classe URLConnection qui ne retélécharge pas les données si celle-ci sont encore le cache de java... Si quelqu'un pouvait me confirmer/réfuter ce que j'avance. Merci

  3. #3
    Candidat au Club
    Inscrit en
    Avril 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Solution
    En faite, le problème venait du cache de java (je m'en doutais)

    Pour résoudre le problème, j'ai trouvé la solution dans la classe URLConnection

    la fonction

    urlC.setDefaultUseCaches( false);

    permet de ne pas garder de cache et être sure que tous les fichiers téléchargé via cette fonction est bien celui présent sur le serveur au moment du téléchargement et non un cache java du dernier appel

    /**
    * Renvoi en tableau de byte un fichier lue par protocole HTTP
    *
    * @param url
    * @return
    * @throws Throwable
    */
    public byte[] getStreamFile( URL url) throws Throwable {
    byte[] data = null;

    URLConnection urlC = url.openConnection();
    urlC.setDefaultUseCaches( false);
    urlC.connect();
    int fileLenght = urlC.getContentLength();
    if (fileLenght == -1) {
    System.err.print("Empty file.");
    return null;
    }
    else {
    data = new byte[fileLenght];
    }
    InputStream in = null;
    try {
    in = urlC.getInputStream();
    } catch (IOException e) {
    System.err.print("Wrong URL.");
    return null;
    }

    int input = 0;
    byte[] buff = new byte[1024];
    int l = in.read(buff);
    while (l > 0) {
    for(int i=0; i<l; i++)
    data[i+input] = buff[i];

    input+=l;
    l = in.read(buff);
    }

    in.close();

    return data;
    }
    cette fonction télécharge un fichier par le protocole http et le télécharge réelement à tout les coups. (En gros ce que on lui demande )

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

Discussions similaires

  1. Téléchargement de fichiers par protocole HTTP
    Par Akabonga dans le forum API standards et tierces
    Réponses: 11
    Dernier message: 31/05/2011, 16h56
  2. Réponses: 2
    Dernier message: 07/02/2008, 10h28
  3. Réponses: 6
    Dernier message: 15/12/2006, 16h03
  4. [Configuration] Téléchargement de fichier par HTTP
    Par Thierry8 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 11
    Dernier message: 06/06/2006, 22h30
  5. Téléchargement de fichiers par HTTP / FTP
    Par Gladiator dans le forum Serveurs (Apache, IIS,...)
    Réponses: 2
    Dernier message: 07/12/2005, 11h28

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