2013-07-24 64 views
1

我试图在sd卡上创建一个图像文件,从调用Web服务后服务器向我发送的字节构建它(基本上:下载文件)。 我设法在客户端的“东西”,并尝试这些字节写入文件,使用:Android:将字节写入SD卡上的图像文件

FileOutputStream fOut = null; 
BufferedOutputStream bOs = null; 

try { 
     fOut = new FileOutputStream(returnedFile); 

     bOs = new BufferedOutputStream(fOut); 

     bOs.write(bytesToWrite); 

} 
catch (FileNotFoundException e) { 
     e.printStackTrace(); 
} 
catch (Exception e) { 
     e.printStackTrace(); 
} 
finally { 
     try { 
      if (bOs != null) { 
       bOs.close(); 
       fOut.close(); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

但图像文件被破坏(其大小> 0KB,但打破)。 我最终用文本编辑器在我的电脑上打开了该文件,并且我看到一些初始文件数据(在发送之前)与最后一个不同。所以我猜猜是有某种编码错误或类似的东西。 我很想知道如何使这项工作(从web服务器下载图像文件,并在我的手机上打开)的想法。 PS。我也可以更改或获取有关服务器配置的信息,因为它是由我的一位朋友配置的。 PS2。我应该不能仅下载图像,而是可以下载任何类型的文件。

+0

您确定该响应不在Base64中吗?我曾经遇到过这个问题,Base 64解码解决了它! –

+0

什么是pData? – njzk2

+0

sry,已更新pData.getBytes()已更改为bytesToWrite(来自服务器的实际字节数) – DoruAdryan

回答

0

我觉得这是更好您编码图像的Base64在你的服务器,例如PHP,你可以做这样的:

$type = pathinfo($path, PATHINFO_EXTENSION); 
$data = file_get_contents($path); 
$base64 = 'data:image/' . $type . ';base64,' . base64_encode($data); 

然后在Android版解码Base64编码字符串到您的图像文件:

FileOutputStream fos = null; 
try { 

if (base64ImageData != null) { 
    fos = context.openFileOutput("imageName.png", Context.MODE_PRIVATE); 
    byte[] decodedString = android.util.Base64.decode(base64ImageData, android.util.Base64.DEFAULT); 
    fos.write(decodedString); 

    fos.flush(); 
    fos.close(); 

    } 

} catch (Exception e) { 

} finally { 
    if (fos != null) { 
     fos = null; 
    } 
} 
+0

这看起来接近我想要的,但问题是:我能否使它能够下载除图像以外的其他类型的数据(因为它们现在工作,唯一的问题是图像)? – DoruAdryan

+0

是的,我认为你可以编码/解码任何文件类型(音频,图像..)到/从base64 –

0

首先确保你的Android清单上有这个权限。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
<uses-permission android:name="android.permission.INTERNET"/> 

文件流旨在用于本地文件存储而不是网络连接。改为使用URLConnection类。

URL uri = new URL("Your Image URL"); 
URLConnection connection = uri.openConnection(); 
InputStream stream = connection.getInputStream(); 
//DO other stuff.... 
+0

我从服务器获取字节并使用FileOutputStream写入本地存储。那有什么问题?我的问题是,出来的字节不是(可能)以与服务器相同的方式进行编码。我的想法是,我成功地写入文件的字节,但他们是incorect,或至少,不正确“理解”,以解码他们的权利。 – DoruAdryan