2017-02-20 2 views
11

J'utilise NanoHTTPD comme serveur web dans mon Android APP, je l'espère, de compresser des fichiers et créer un InputStream côté serveur, et je télécharger le InputStream côté client en utilisant le code A.Comment créer un InputStream ZIP dans Android sans créer de fichier ZIP en premier?

J'ai lu le code B à How to zip and unzip the files? , mais comment créer un InputStream ZIP dans Android sans créer un fichier ZIP d'abord?

BTW, je ne pense pas que le code C est bon moyen, car il fait d'abord le fichier ZIP, puis convertir le fichier ZIP en FileInputStream, j'espère créer un InputStream ZIP directement!

Code A

private Response ActionDownloadSingleFile(InputStream fis) {  
    Response response = null; 
    response = newChunkedResponse(Response.Status.OK, "application/octet-stream",fis); 
    response.addHeader("Content-Disposition", "attachment; filename="+"my.zip"); 
    return response; 
} 

Code B

public static void zip(String[] files, String zipFile) throws IOException { 
    BufferedInputStream origin = null; 
    ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipFile))); 
    try { 
     byte data[] = new byte[BUFFER_SIZE]; 

     for (int i = 0; i < files.length; i++) { 
      FileInputStream fi = new FileInputStream(files[i]);  
      origin = new BufferedInputStream(fi, BUFFER_SIZE); 
      try { 
       ZipEntry entry = new ZipEntry(files[i].substring(files[i].lastIndexOf("/") + 1)); 
       out.putNextEntry(entry); 
       int count; 
       while ((count = origin.read(data, 0, BUFFER_SIZE)) != -1) { 
        out.write(data, 0, count); 
       } 
      } 
      finally { 
       origin.close(); 
      } 
     } 
    } 
    finally { 
     out.close(); 
    } 
} 

code C

File file= new File("my.zip"); 
FileInputStream fis = null; 
try 
{ 
    fis = new FileInputStream(file); 
} catch (FileNotFoundException ex) 
{ 

} 
+0

Vous devez créer un flux * de sortie * sur le serveur. Un 'ZipOutputStream', enroulé autour de tout flux de sortie que la technologie du serveur vous donne. – EJP

+0

Merci! Pour EJP, pourriez-vous me donner un exemple de code? – HelloCW

+0

Vous ne pouvez pas créer de ZipInputSteam directement, car ZipInputSteam étend FilterInputStream, de sorte qu'il fonctionne essentiellement comme une classe wrapper qui fournit des fonctionnalités pour que le flux lise les fichiers zip. Vous aurez besoin de quelque chose comme 'new ZipInputStream (nouveau FileInputStream (zipFile))' –

Répondre

4

Zi pInputStream selon la documentation ZipInputStream

ZipInputStream est un filtre de flux d'entrée pour la lecture des fichiers dans le format de fichier ZIP. Inclut le support pour les entrées compressées et non compressées.

Plus tôt, j'ai répondu à cette question d'une manière qui n'est pas possible en utilisant ZipInputStream. Je suis désolé.

Mais après avoir investi quelque temps, je trouve qu'il est possible selon le code ci-dessous

Il est très évident que puisque vous envoyez des fichiers au format zip sur le réseau .

//Create proper background thread pool. Not best but just for solution 
new Thread(new Runnable() { 
    @Override 
    public void run() { 

    // Moves the current Thread into the background 
    android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_BACKGROUND); 

    HttpURLConnection httpURLConnection = null; 
    byte[] buffer = new byte[2048]; 
    try { 
     //Your http connection 
     httpURLConnection = (HttpURLConnection) new URL("https://s3-ap-southeast-1.amazonaws.com/uploads-ap.hipchat.com/107225/1251522/SFSCjI8ZRB7FjV9/zvsd.zip").openConnection(); 

     //Change below path to Environment.getExternalStorageDirectory() or something of your 
     // own by creating storage utils 
     File outputFilePath = new File ("/mnt/sdcard/Android/data/somedirectory/"); 

     ZipInputStream zipInputStream = new ZipInputStream(new BufferedInputStream(httpURLConnection.getInputStream())); 
     ZipEntry zipEntry = zipInputStream.getNextEntry(); 

     int readLength; 

     while(zipEntry != null){ 
     File newFile = new File(outputFilePath, zipEntry.getName()); 

     if (!zipEntry.isDirectory()) { 
      FileOutputStream fos = new FileOutputStream(newFile); 
      while ((readLength = zipInputStream.read(buffer)) > 0) { 
      fos.write(buffer, 0, readLength); 
      } 
      fos.close(); 
     } else { 
      newFile.mkdirs(); 
     } 

     Log.i("zip file path = ", newFile.getPath()); 
     zipInputStream.closeEntry(); 
     zipEntry = zipInputStream.getNextEntry(); 
     } 
     // Close Stream and disconnect HTTP connection. Move to finally 
     zipInputStream.closeEntry(); 
     zipInputStream.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    }finally { 
     // Close Stream and disconnect HTTP connection. 
     if (httpURLConnection != null) { 
     httpURLConnection.disconnect(); 
     } 
    } 
    } 
}).start(); 
+0

@HelloCW laissez-moi savoir si vous avez essayé parce que cela fonctionne bien selon la sortie désirée. Cependant, il faut un peu d'optimisation en termes de flux de fermeture. –