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 :

Envoyer un fichier ( >500Mo ) via le réseau à un navigateur web


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Finistère (Bretagne)

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

    Informations forums :
    Inscription : Novembre 2015
    Messages : 1
    Par défaut Envoyer un fichier ( >500Mo ) via le réseau à un navigateur web
    Bonjour,
    je fais un serveur http en java et il est plutôt fonctionnel dans l'envoi de fichiers mais son gros défaut est de charger la totalité du fichier en mémoire, ce qui pose évidement un problème pour les gros fichiers qui génère une utilisation abusive du swap voir un "Out of Memory".
    J'ai essayé de charger progressivement mon fichier dans un buffer de taille limitée ( 16Mo ), et de l'envoyer directement mais le navigateur ne reçoit que le header puis le premier bloc de 16Mo ( et on observe bien 2 fichiers distincts reçus sur Firefox).

    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
     
    int tmpLength = -1;
    byte[] mybytearray = new byte[16777216];
     
    fis = new FileInputStream(myFile);
    bis = new BufferedInputStream(fis);
    client.setSendBufferSize(16777216); //Je ne sais plus pourquoi j'ai mis ça, j'ai du rajouter parce que ça ne marche pas
    os = new BufferedOutputStream(client.getOutputStream());
     
    System.out.println("Sending " + path + "(" + length + " bytes)");
    header = initHtmlHeader(path);
    header += mybytearray.length + "\r\n\r\n";
    os.write(header.getBytes(), 0, header.length());
    while ((tmpLength = bis.read(mybytearray)) != -1) {
        os.write(mybytearray, 0, tmpLength);
        os.flush();
    }
    Du coup comment peut on faire en sorte que le navigateur reçoit bien la totalité du fichier sans charger la totalité de celui ci en mémoire ?

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par Blivion Voir le message
    ( et on observe bien 2 fichiers distincts reçus sur Firefox).
    Tu peux expliquer ce que tu entends par là? Il n'y a pas de moyen en http d'envoyer 2 fichier en réponse à une requête http. Tu observe quoi dans ta transmission http?
    Tu es sûr de ne pas avoir d'exception levée? On ne vois pas de code de gestion d'erreurs dans ton code. Aussi, un sendBuffer de 16M tu peux oublier sur la socket (si client est bien un objet de type Socket, difficile à dire avec ce code), les distribution linux, par exemple, on un max à 128K. Ce serait bien de mettre des messages de progression dans ton code pour voir quand ça commence à merder. Et analyser la connection avec un truc comme wireshark pour voir ce qui passe vraiment sur la ligne, quand la socket est fermée et surtout qui du browser ou de ton serveur la ferme prématurément. Avoir le code de initHtmlHeader serait pas mal non plus.

    Au passage, pourquoi il n'y a pas d'appel à os.close() en fin de transmission?

Discussions similaires

  1. Réponses: 3
    Dernier message: 16/02/2012, 17h10
  2. Envoyer un fichier sur le réseau
    Par marmarbenh dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 07/12/2007, 14h33
  3. Réponses: 2
    Dernier message: 28/05/2007, 08h27
  4. Envoyer un fichier via FTP via un socket
    Par JnJp28 dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 24/05/2007, 20h37
  5. [Reseau]Copie de fichier via le réseau
    Par liichiii dans le forum Servlets/JSP
    Réponses: 14
    Dernier message: 16/08/2005, 10h19

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