1

我正在尝试在 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。我应该不能只下载图像,而是任何类型的文件。

4

2 回答 2

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;
    }
} 
于 2013-07-24T08:46:48.570 回答
0

首先确保你在你的 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....
于 2013-07-24T08:40:46.727 回答