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

Servlets/JSP Java Discussion :

uploader un fichier de grande taille depuis une applet vers une servlet


Sujet :

Servlets/JSP Java

  1. #1
    Membre expert
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 3 100
    Points
    3 100
    Par défaut uploader un fichier de grande taille depuis une applet vers une servlet
    bonjour,
    j'ai une applet qui est chargée d'envoyer à une servlet un fichier
    pour cela j'utilise le code suivant

    côté applet :
    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
     
    URL urlServlet = new URL(adresseServlet);
    HttpURLConnection connexion = (HttpURLConnection) urlServlet.openConnection();
    connexion.setDoInput(true); 
    connexion.setDoOutput(true); 
    connexion.setUseCaches(false); 
    connexion.setRequestProperty("Content-Type","application/octet-stream");
    connexion.setRequestProperty("fileName", fileName);
    connexion.setRequestProperty("fileLength", Long.toString(fileLength));
     
    FileInputStream in = new FileInputStream(fileToDownload); 
    byte[] buffer = new byte[(int) fileLength];
    in.read(buffer);
    in.close(); 
     
    DataOutputStream out = new DataOutputStream(connexion.getOutputStream()); 
    out.write(buffer, 0, buffer.length); 
    out.flush(); 
    out.close();
    et côté servlet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    java.io.DataInputStream dis = new java.io.DataInputStream(request.getInputStream());
    byte[] buffer = new byte[fileLength];
    dis.readFully(buffer); 
    dis.close();
     
    File cibleServeur = new File("C:/Temp/" + fileName);
    FileOutputStream fos = new FileOutputStream(cibleServeur); 
    fos.write(buffer);
    fos.close();
    seulement si le fichier est assez important (j'en ai un de 40Mo) j'ai une erreur
    Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space
    j'ai essayé d'envoyé le fichier via un "buffer" plus petit, mais j'ai l'impression que cette méthode revient au même et qu'il fait explosé la taille possible de la connexion

    si vous avez une piste pour moi, je suis prenneur, là je sèche un peu
    merci
    dam's

  2. #2
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Hello,

    l'erreur est côté applet ou servlet?

    sinon, c'est clair que ça pète: tu crée un tableau de byte de la taille du fichier, donc tu conserveras toutes les données du fichier en ram: et 40mo en ram ça passe pas par défaut

    Il faut implémenter un streaming. c'est quasiment pareil que ton code, sauf qu'il faut faire une boucle et envoyer les données par paquet, au lieu de tout charger dans un buffer et de l'envoyer en une seule fois.

    grosso modo:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int read; // nbre de bytes lus au dernier "read"
    byte[] buffer = new byte[1024 * 10]; // paquets de 10ko
     
    while((read=inputstream.read(buffer))>0) {
        outputstream.write(0,read,buffer);
    }
    sinon a partir de java 1.4.2, il y a l'api java.nio qui permet d'invoquer "transferTo", avec un appel genre "inputstream.getChannel().transferTo(outputstream.getChannel(),0,filelength)" (plus d'infos dans la faq)

    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  3. #3
    Membre expert
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 3 100
    Points
    3 100
    Par défaut
    bonjour,

    en fait j'avais essayé de transférer par paquet aussi, d'ailleurs j'ai gardé cette solution même si elle plantait de la même manière parce que cela me permet de faire avancer une barre de progression
    voila ce que j'utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    FileInputStream in = new FileInputStream(fileToDownload); 			        
    DataOutputStream out = new DataOutputStream(connexion.getOutputStream());
    byte buffer[] = new byte[ 10 * 1024];
    int nbLecture;
    while ((nbLecture = in.read(buffer)) != -1){								
    	out.write(buffer, 0, nbLecture);
    	out.flush();
    }
    in.close();
    out.close();
    sinon l'erreur semble être relevée par l'applet mais je pense que c'était lié à la connexion parce que si au lieu d'écrire dans le flux http j'écrivais dans un simple BufferOutputStream cela se passait sans problème

    merci de ton aide
    dam's

  4. #4
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    hum bizarre...

    et sans dataoutputstream (en écrivant directement dans connexion.getOutputStream), tu as le même comportement?
    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  5. #5
    Membre expert
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 3 100
    Points
    3 100
    Par défaut
    bonjour,

    j'ai effectivement le même problème...

    merci de ton aide en tout cas
    dam's

Discussions similaires

  1. Déplacer une image d'une feuille vers une autre dans un fichier Excel
    Par helenaide dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 03/10/2011, 14h27
  2. Réponses: 5
    Dernier message: 04/07/2011, 15h40
  3. Upload des fichiers de grandes tailles
    Par zdig10 dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 13/07/2010, 14h11
  4. [WSS 3.0 SP1] Upload de fichier de grande taille
    Par dev01 dans le forum SharePoint
    Réponses: 11
    Dernier message: 24/06/2008, 16h02
  5. [Applet] Ouvrir une applet dans une page HTML
    Par debutant java dans le forum Applets
    Réponses: 4
    Dernier message: 04/06/2004, 17h11

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