2012-09-11 26 views
1

我必须从服务器获取zip文件到安卓手机,编码为Base64。由于文件很大(〜20MB),我使用下面的代码来获取字符串的bufferSize = 1024 * 1024,对它进行编码并将其写入文件。 我通过android.util.Base64.encode()方法得到了bad-base64错误。为什么?从Android服务器流式传输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有一个很好的解释。

另一种选择是使块大小为三的倍数;在这种情况下,我认为Base64的结果可以分成大块并且与输入相同。这是值得一试的。

+0

我能够更改服务器代码,现在我正在流纯字节。 – Loadeed

+0

太棒了!这确实是最好的解决方案。 – alexfernandez

1

我建议设置Base64.decode()断点,并检查你所拥有的缓冲区。最有可能你会看到一些意想不到的东西(从你的服务器应用程序或类似的错误),这会导致解码错误。

相关问题