我在将PNG图像从我的服务器下载到我的Android应用程序时遇到问题。问题是PNG图像特有的(JPG工作正常),问题是下载的文件是损坏的图像。我将在下面详细解释。
情景:
我需要从服务器下载JPG和PNG图像,并将其显示给Android应用的用户。
问题:
JPG图像下载没有问题。但下载的PNG文件已损坏。我已经仔细检查了我服务器上的图像来源,它们是正确的。它只有下载的PNG文件,它们已损坏。所以,问题可能在于我在Android中下载它们的方式。
代码示例:
URL imageURL;
File imageFile = null;
InputStream is = null;
FileOutputStream fos = null;
byte[] b = new byte[1024];
try {
// get the input stream and pass to file output stream
imageURL = new URL(image.getServerPath());
imageFile = new File(context.getExternalFilesDir(null), image.getLocalPath());
fos = new FileOutputStream(imageFile);
// get the input stream and pass to file output stream
is = imageURL.openConnection().getInputStream();
// also tried but gave same results :
// is = imageURL.openStream();
while(is.read(b) != -1)
fos.write(b);
} catch (FileNotFoundException e) {
} catch (MalformedURLException e) {
} catch (IOException e) {
} finally {
// close the streams
try {
if(fos != null)
fos.close();
if(is != null)
is.close();
} catch(IOException e){
}
}
关于我如何处理这个问题的任何指示都将非常感激。
注意:
由于这是在服务中发生的,因此在AsyncTask中执行此操作没有任何问题。
答案 0 :(得分:2)
问题出在这里
while(is.read(b) != -1)
fos.write(b);
这是错误的,因为在每次迭代中它都会将完整的缓冲区(1024字节)写入文件。但是之前的read
读取的字节数可能比读取的少(几乎肯定是在最后一个循环中,除非图像长度恰好是1024的倍数)。您应该检查每次读取的字节数,并写入该字节数。
int bytesRead;
while( (bytesRead = is.read(b)) != -1)
fos.write(b,0,bytesRead );
您的错误会让您总是写出大小为1024的倍数的文件 - 当然,情况并非如此。现在,使用额外的尾随字节保存图像时会发生什么情况取决于格式和图像阅读器。在某些情况下,它可能会起作用。不过,这是错的。
顺便说一下:从不吞下例外 - 即使今天不是问题,也许明天可能会花费数小时查找问题。