2017-02-20 8 views
11
내 안드로이드 APP에서 웹 서버로 NanoHTTPD를 사용

, 나는 일부 파일을 압축하고 서버 측에서의 InputStream을 만들 수 있도록 노력하겠습니다, 그리고 내가 How to zip and unzip the files?에서 코드 B 읽고먼저 ZIP 파일을 만들지 않고 Android에서 ZIP InputStream을 만드는 방법은 무엇입니까?

코드 A를 사용하여 클라이언트 측에서의 InputStream를 다운로드 ,하지만 먼저 ZIP 파일을 만들지 않고 Android에서 ZIP InputStream을 만드는 방법은 무엇입니까?

저는 코드 C가 좋은 방법이라고 생각하지 않습니다. 왜냐하면 먼저 ZIP 파일을 만든 다음 ZIP 파일을 FileInputStream으로 변환하기 때문에 ZIP InputStream을 직접 만들 수 있기를 바랍니다.

코드

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; 
} 

코드 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(); 
    } 
} 

코드 C

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

} 
+0

서버에 * 출력 * 스트림을 만들어야합니다. 'ZipOutputStream'은 서버 기술이 제공하는 출력 스트림을 감싸고 있습니다. – EJP

+0

고마워요! EJP에게 샘플 코드를 줄 수 있습니까? – HelloCW

+0

ZipInputSteam은 FilterInputStream을 확장하므로 ZipInputSteam을 직접 만들 수 없으므로 기본적으로 스트림에서 zip 파일을 읽는 기능을 제공하는 래퍼 클래스로 작동합니다. '새로운 ZipInputStream (새로운 FileInputStream (zipFile)) '과 같은 것이 필요합니다. –

답변

4

닫아 pInputStream는 문서에 따라 ZipInputStream

ZipInputStream는 ZIP 파일 형식으로 파일을 읽어들이는 입력 스트림 필터입니다. 압축 된 항목과 압축되지 않은 항목을 모두 지원합니다.

이전 나는 ZipInputStream을 사용하는 것이 불가능한 방식으로이 질문에 대답했습니다. 미안 해요.

하지만 그것은 아래의 코드

그것은 매우 분명 따라 가능하다는 것을 발견 약간의 시간을 투자 한 후

당신은 네트워크를 통해 zip 형식 에 파일을 전송하기 때문에 .

//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는 원하는 출력마다 잘 작동하기 때문에 시도했는지 알려줍니다. 그러나 스트림을 종료하는 측면에서 약간의 최적화가 필요합니다. –