代码之家  ›  专栏  ›  技术社区  ›  Rohitesh

在Android中下载PNG图像时出现问题

  •  0
  • Rohitesh  · 技术社区  · 9 年前

    我在将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中执行这一操作没有问题。

    1 回复  |  直到 9 年前
        1
  •  2
  •   leonbloy    9 年前

    问题就在这里

     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的倍数,当然,通常情况并非如此。现在,当一个图像保存了额外的尾部字节时会发生什么,这取决于格式和图像读取器。在某些情况下,它可能会起作用。然而,这是错误的。

    顺便说一句:永远不要吞下例外——即使这不是今天的问题,也可能是明天,你可能会花几个小时来发现问题。