【问题标题】:Android: write bytes to image file on SD CardAndroid:将字节写入 SD 卡上的图像文件
【发布时间】:2013-07-24 08:28:46
【问题描述】:

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

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,但已损坏)。 我最终用文本编辑器在我的计算机上打开了该文件,我看到一些初始文件数据(在发送之前)与最终文件不同。所以我猜测存在某种编码错误或类似的东西。 我将不胜感激如何使这项工作(从网络服务器下载图像文件,并在我的手机上打开)。 PS。我还可以更改或获取有关服务器配置的信息,因为它是由我的朋友配置的。 PS2。我应该不仅可以下载图片,还可以下载任何类型的文件。

【问题讨论】:

  • 您确定响应不在 Base64 中吗?我曾经遇到过这个问题,Base 64解码解决了!
  • sry,更新后的 pData.getBytes() 已更改为 bytesToWrite(来自服务器的实际字节)
  • @Skaard-Solo 我没有提到响应在 Base64 中的任何地方。你能稍微解释一下你的意思吗?

标签: android file encoding


【解决方案1】:

我认为最好在服务器中将图像编码为 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;
    }
} 

【讨论】:

  • 这看起来接近我想要的,但问题是:我是否能够让它用于下载除图像之外的其他类型的数据(因为它们现在可以工作,唯一的问题是有图片)?
  • 是的,我认为您可以将任何文件类型(音频、图像..)编码/解码到/从 base64
【解决方案2】:

首先确保你在你的 android manifest 上有这个权限。

<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....

【讨论】:

  • 我正在从服务器获取字节并使用 FileOutputStream 写入本地存储。那有什么问题?我的问题是输出的字节不是(可能)以与服务器相同或类似的方式编码的。这个想法是我成功写入文件字节,但它们是不正确的,或者至少,没有正确“理解”以正确解码它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-20
  • 2011-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多