Partage
  • Partager sur Facebook
  • Partager sur Twitter

Webservice - envoie de "gros fichiers"

comment faire pour couper blocs/blocs les fichiiers ?

Anonyme
    8 avril 2010 à 12:11:24

    Bonjour à tous,

    Pour mon stage je dois développer un webservice qui sera du download/upload.
    J'utilise TOMCAT et Axis
    Seulement, j'ai un petit problème pour le download de gros fichiers : ca merdouille et ça m'affiche :
    Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    


    Voila donc mon code côté serveur :

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    
    import org.apache.log4j.Logger;
    
    
    
    
    public class GestionFichier {
    
    	private static Logger logger = Logger.getLogger(GestionFichier.class);
    	
    	public byte[] RecupFichier(String nomFichier) {
       
    
    	//on récupére le fichier
             File file = new File(nomFichier);
    
        // on créer un tableau de byte contenant le fichier
             byte[] b = new byte[(int) file.length()];
    
               try {
                   FileInputStream fileInputStream = new FileInputStream(file);
                   fileInputStream.read(b);
    		
    
                    } catch (FileNotFoundException e) {
                        logger.error("erreur : fichier non trouvé");
    				
    
                    }
                    catch (IOException e1)
                    {
                        logger.error("erreur dans la lecture du fichier");
    									
    
                 }
                    
              return b;
    	}
    	
    	
    	
    	public void EnvoiFichier(byte[] contenu, String nomFichier)
    	{
    	
    		File monFichier = new File(nomFichier);
    
    
            try {
                    monFichier.createNewFile(); // On essaie de créer le fichier
    
            } catch (IOException ex) {
                logger.error("erreur dans la création d'un nouveau fichier");
            }
                
            try {
    
                    java.io.FileOutputStream monFluxFichier;              
                    monFluxFichier = new java.io.FileOutputStream(monFichier); // on efface le fichier si deja present
             
                    monFluxFichier.write(contenu);
    
                    monFluxFichier.close(); // on ferme le fichier
            }
            catch (IOException ex) {
                logger.error("erreur dans l'écriture du nouveau fichier");
            }
    	
    	}	
    }
    


    et mon code côté client :


    import java.io.File;
    import java.io.IOException;
    import java.net.URL;
    
    import javax.xml.namespace.QName;
    
    import org.apache.axis.client.Call;
    import org.apache.axis.client.Service;
    import org.apache.log4j.Logger;
    
    public class ClientFichier {
    	private static Logger logger = Logger.getLogger(ClientFichier.class);
    
    	
    	public static void main(String [] args) throws Exception {
    		Service service = new Service();
    		Call call = (Call)service.createCall();
    		String endpoint = "http://localhost:8080/axis/GestionFichier.jws";
    		call.setTargetEndpointAddress(new URL(endpoint));
    		call.setOperationName(new QName("RecupFichier"));
    		
    
    		String name = "test2.bmp";
    		byte[] contenu = (byte[])call.invoke(new Object [] {new String(name)});
    		
    		
    		
    		File monFichier = new File("bis_" + name);
    		 try {
                 monFichier.createNewFile(); // On essaie de créer le fichier
    
         } catch (IOException ex) {
             logger.error("erreur dans la création d'un nouveau fichier");
         }
             
         try {
    
                 java.io.FileOutputStream monFluxFichier;              
                 monFluxFichier = new java.io.FileOutputStream(monFichier); // on efface le fichier si deja present
          
                 monFluxFichier.write(contenu);
    
                 monFluxFichier.close(); // on ferme le fichier
         }
         catch (IOException ex) {
             logger.error("erreur dans l'écriture du nouveau fichier");
         }
    		
    		
    	}
    }
    


    j'avais déjà eu un précédent problème avec des sockets sur un autre projet, or ici déjà j'en utilise pas et donc pas de readFully pour me sortir de là... Il semble que la solution soit d'envoyer le contenu du fichier block par block ( morceau par morceau ) mais je n'y arrive pas, comment peut-on faire ?

    Merci d'avance pour votre aide !
    • Partager sur Facebook
    • Partager sur Twitter
      8 avril 2010 à 13:07:53

      J'ai déjà rencontré ce genre de problème sur un forum, il semblerait qu'il faudrait modifier un fichier .bat de ton dossier axis, bon, je te laisse voir par toi même :
      http://www.developpez.net/forums/d3252 [...] fmemoryerror/ je pense qu'il a été résolut
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        8 avril 2010 à 14:02:19

        Mais si on peut vraiment pas augmenter cette capacité, n'y a t'il pas d'autres moyens ?
        genre en splittant le fichier
        • Partager sur Facebook
        • Partager sur Twitter
          8 avril 2010 à 15:44:22

          Véhiculer d'aussi grands volumes distants, la sécurité doit joué son rôle ^^ .
          Supposons que c'est possible de splitter comme tu dis un fichier en par exemple, 20 morceaux, si ne serait-ce qu'un d'entre eux n'est pas arrivé, le fichier est endommagé ! Solution à ce problème, les transactions. La loi de tout ou rien. Si tout les fichiers sont arrivés, on valide (commit) sinon on annule (rollback).
          Donc pour éviter l'utilisation des transactions, tu dois envoyer le fichier en un seul coup ^^
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            8 avril 2010 à 16:09:16

            J'aurai vraiment aimé trouvé une possibilité de split car je sais pas si lors du déploiement on pourra augmenter cette taille....

            Mis à part cela j'ai essayé de modifier la config mais je n'arrive pas à trouver comment faire ( pas très explicite dans le lien que tu m'as donnés ). Merci d'avance
            • Partager sur Facebook
            • Partager sur Twitter

            Webservice - envoie de "gros fichiers"

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown