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

Android Java Discussion :

Upload fichier zip To webservice


Sujet :

Android Java

  1. #1
    Membre du Club
    Upload fichier zip To webservice
    Bonjour a tous ,

    Je souhaite d'envoyer un fichier "zip" depuis un appareil Android vers mon application Web s'exécutant sur un serveur avec tomcat

    Android :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    File fl = new File(Environment.getExternalStorageDirectory() + "/test/zer.zip")
     
    URL url =new URL("http://xxx.xxx.x.xx:8080/test/zs/zipFile");  // test en local
    					HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    					conn.setRequestMethod("POST");
    					conn.setRequestProperty("Content-type", "application/zip");
    				    conn.setRequestProperty("Transfer-Encoding", "chunked" );
    					conn.setChunkedStreamingMode(4096);
    					conn.setDoInput(true); 
    					conn.setDoOutput(true);
    					conn.setConnectTimeout(50000);
    					..........


    Mais le problème, je ne sais comment attacher le fichier zer.zip ?? avec outputStream.write ??

    Merci d'avance

  2. #2
    Membre du Club
    Citation Envoyé par brayanrabat Voir le message
    avec outputStream.write ??
    Oui. Mais vous voulez faire un upload en morceaux/chunck. Il vous faudra lire un peu de specs pour que cet upload soit effectué correctement et compris par le serveur.

  3. #3
    Membre du Club
    Bonjour ,
    Merci pour votre réponse .

    coté client (android) :

    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
    20
    21
     
    File zipfile = new File(Environment.getExternalStorageDirectory() + "/temp/azw.zip");
     
    URL url =new URL("http://xxx.xxx.x.xx:8080/test/wy/zipFile");// LocalHost  
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    conn.setRequestMethod("POST");
    conn.setRequestProperty("Content-type", "application/zip");
    conn.setDoInput(true); 
    conn.setDoOutput(true);
    conn.setConnectTimeout(50000);
    BufferedOutputStream sout = new BufferedOutputStream(conn.getOutputStream());
    FileInputStream bis = new FileInputStream(zipfile);
    int i;    
    byte bytes[]=new byte[4096]; 
    while((i=bis.read(bytes))!=-1){
    				        sout.write(bytes,0,i);
    				        sout.flush();
    	         			}  
     
    sout.close();
    bis.close();


    coté serveur :

    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
     
    @patch("wy")
    public class test{
    ......
    ......
     
    @POST
    @patch("zipFile")
    @produces({ Media.Type.APPLICATION_OCTET_STREAM })
    public void zipFile(){
    ??????
    //le code pour recuperer ce zip ? et le mettre par exemple : c:/data/
     
    }
    }


    Merci d'avance

  4. #4
    Membre du Club
    Le plus standard serait sûrement de faire un multi-part avec une librairie Android, l'implémentation côté serveur dépendra du framework que vous utilisez:
    - Pour Spring ça semble assez simple avec un paramètre de type MultipartFile: https://spring.io/guides/gs/uploading-files/
    - Pour du "pur" Servlet il me semble que commons-fileupload était la solution al plus courante: http://commons.apache.org/proper/com...ns-fileupload/

    Sinon, si vous gardez votre client Android tel quel, il vous suffit de préciser la taille du zip dans les headers de la requête et, côté de serveur de lire le même nombre de bytes depuis le stream de la requête. Mais si le fichier est volumineux cela va prendre du temps et dans certaines infrastructure, ces requêtes sont coupées avant d'avoir eu le temps de tout envoyer.

  5. #5
    Membre du Club
    Rebonjour ,

    La taille du fichier zip , maxi = 25 mo , mais il faudra faire des tests , mais mnt je sais le code(web services REST) , pour le but de dowloawd ce fichier zip , et aprés l'envoyer à ce client ?

  6. #6
    Membre du Club
    Excusez-moi, je n'ai pas compris votre dernière question.

  7. #7
    Membre du Club
    Je souhaite envoyer un fichier (test.zip) depuis un appareil Android vers mon application Web exécutée sur un serveur avec tomcat.
    cote android : OK
    Cote serveur : je sais pas le code a écrire ? pour le but de telecharger ce fichier zipé

  8. #8
    Membre du Club
    Comme je vous le suggérait un peu plus tôt:
    Citation Envoyé par gervais.b Voir le message
    Le plus standard serait sûrement de faire un multi-part avec une librairie Android, l'implémentation côté serveur dépendra du framework que vous utilisez:
    - Pour Spring ça semble assez simple avec un paramètre de type MultipartFile: https://spring.io/guides/gs/uploading-files/
    - Pour du "pur" Servlet il me semble que commons-fileupload était la solution al plus courante: http://commons.apache.org/proper/com...ns-fileupload/

    Sinon, si vous gardez votre client Android tel quel, il vous suffit de préciser la taille du zip dans les headers de la requête et, côté de serveur de lire le même nombre de bytes depuis le stream de la requête. Mais si le fichier est volumineux cela va prendre du temps et dans certaines infrastructure, ces requêtes sont coupées avant d'avoir eu le temps de tout envoyer.


    Etant donné, que "cote android : OK" vous êtes dans ma seconde suggestion. Il vous reste à obtenir un InputStream sur le corps de la requête entrante.

    Dans l'api javax.servlet il y à la méthode HttpServletRequest#getInputStream() .

    L'idée serait donc que votre client Android précise la taille du fichier Zip via le header Content-Length. De cette façon, le serveur sait combien d'octets il doit lire.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    // Avec "CountingInputStream" qui compte les octets lus
    // Avec "getInput()" qui retourne un InputStream sur le corps de la requête
    // Avec "body" qui permet d'accumuler ou écrire les octets lus.
    CountingInputStream counter = new CountingInputStream(getInput());
    int length = Integer.parseInt(headers.getValue(CONTENT_LENGTH));
    while ( counter.getByteCount() <= length ) {
        body.append(counter.read());
    }



    https://www.w3.org/Protocols/rfc2616...html#sec14.13v

  9. #9
    Membre du Club
    Merci infiniment pour votre réponse , il me reste coté serveur , je sais pas le code à écrire pour recuperer ce fichier ?

  10. #10
    Membre du Club
    Le code que je vous ai donné est un extrait d'un code qui tourne sur le serveur.
    Malheureusement je ne sais pas quel framework vous utilisez sur votre serveur, je ne peux donc pas vous aider plus.

###raw>template_hook.ano_emploi###