2012-09-11 5 views
1

서버에서 Android64로 zip 파일을 Base64로 인코딩해야합니다. 파일 크기가 커서 (~ 20MB), 아래 코드를 사용하여 String을 bufferSize = 1024 * 1024로 가져 와서 인코딩하고 파일에 쓰려고합니다. android.util.Base64.encode() 메소드로 bad-base64 오류가 발생합니다. 왜?스트리밍 안드로이드 서버에서 Base64 문자열

코드 :

int bufferSize = 1024 * 1024; 
byte[] buffer = new byte[bufferSize]; 
FileOutputStream fileOutputStream = null; 
InputStream inputStream = null; 
try { 
    fileOutputStream = new FileOutputStream(this.path + "/" + this.zipFileName); 
    inputStream = connection.getInputStream(); 
    int bytesRead; 
    //read bytes 
    while ((bytesRead = inputStream.read(buffer, 0, bufferSize)) > 0) { 
     byte[] zipBytes = Base64.decode(buffer, 0, bytesRead, Base64.DEFAULT); 
     fileOutputStream.write(zipBytes); 
    } 
} catch (Exception e) { 
e.printStackTrace(); 
} finally { 
    if (fileOutputStream != null) { 
     try { 
     fileOutputStream.close(); 
     } catch (Exception e) { 
     e.printStackTrace(); 
     } 
    } 
    if (inputStream != null) { 
     try { 
     inputStream.close(); 
      } catch (Exception e) { 
     e.printStackTrace(); 
     } 
    } 
} 

답변

2

우선 Base64가 필요한 이유는 무엇입니까? 일반적으로 할 일은 압축 된 파일을 보낸 다음 클라이언트가 압축을 풀도록하는 것입니다. Base64는 문자 당 6 비트로 제한되기 때문에 대역폭을 절약 할 것입니다. 서버 코드를 변경할 수 있다면 zip 파일을 제공하는 것이 가장 좋습니다.

어쨌든 청크로 파일을 가져올지라도 그 청크를 따로 따로 해독 할 수는 없습니다. 1024 * 1024 바이트의 청크를 모두 합친 다음 많은 부분을 해독해야합니다. 이 작업을 수행하려면 20MB 버퍼가 필요합니다. Base64는 각 청크의 끝 부분에 몇 가지 터미네이터 문자를 추가합니다. wikipedia article에는 아주 좋은 설명이 있습니다.

또 다른 옵션은 청크 크기를 3의 배수로 만듭니다. 이 경우 Base64 결과는 청크로 나눌 수 있고 입력과 동일 할 수 있다고 생각합니다. 시도해 볼 가치가 있습니다.

+0

서버 코드를 변경할 수 있었고 이제 순수 바이트를 스트리밍하고 있습니다. – Loadeed

+0

좋습니다! 이것이 실제로 최상의 솔루션입니다. – alexfernandez

1

나는() Base64.decode에 중단 점을 설정하고 버퍼에 무엇을 확인하는 것이 좋습니다. 대부분의 경우 예기치 않은 오류 (서버 응용 프로그램 오류 또는 이와 유사한 오류)가 발생하여 디코딩 오류가 발생합니다.

관련 문제