验证正确的下载

时间:2014-04-11 07:37:49

标签: java android networking

在我的Android应用程序中,我从互联网上下载了一些照片。如何验证来自网络的图像是否正确下载?我已经想过检查文件的大小,我刚刚写的sd大于零,但我不知道这是否足够。这是我的代码

    String filename =title.replace(" ","")+j+".nomedia";
    File destination = new File(MyApplication.getPhotoStorage() ,filename);


    URL url = new URL (url_image);

    InputStream is = url.openStream();
    OutputStream os = new FileOutputStream(destination);


    byte[] b = new byte[2048];
    int length;

    while ((length = is.read(b)) != -1) {
    os.write(b, 0, length);
    }

    is.close();
    os.close();
    localPhotosUrl.add(destination.getAbsolutePath());

3 个答案:

答案 0 :(得分:1)

我能想到的唯一可能是比较文件校验和。因此,服务器必须为它提供的文件提供校验和。然后你将下载文件和校验和,在本地生成下载文件的校验和,然后将下载的校验和与生成的校验和进行比较。校验和可以通过MD5生成,但也有其他哈希算法。

以下是如何为Java中的文件生成MD5校验和而不会产生太多开销的问题:Getting a File's MD5 Checksum in Java

对于您的代码,它将像这样应用:

String filename =title.replace(" ","")+j+".nomedia";
File destination = new File(MyApplication.getPhotoStorage() ,filename);


URL url = new URL (url_image);

OutputStream os = new FileOutputStream(destination);

MessageDigest md = MessageDigest.getInstance("MD5");
try (InputStream is = url.openStream()) {
    DigestInputStream dis = new DigestInputStream(is, md);
    byte[] b = new byte[2048];
    int length;

    while ((length = dis.read(b)) != -1) {
        os.write(b, 0, length);
    }
}

byte[] digest = md.digest();

os.close();
localPhotosUrl.add(destination.getAbsolutePath());

答案 1 :(得分:1)

我想这里最简单的方法是尝试用Bitmap.DecodeFile解码它。如果可以正确加载位图,则表示已成功下载。

BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(path, options);
int width = opts.outWidth;
int height = opts.outHeight;

我们使用options.inJustDecodeBounds以便保持较低的内存使用率。我们不想要位图的副本,只是为了检查解码器知道如何处理该文件。

如果宽度和高度大于零,则位图不会损坏。

显然这只有效,因为你正在下载照片,而不是一些随机文件。如果这些文件可以包含任何类型的文件,那么md5答案就是一个很好的答案。

答案 2 :(得分:0)

除非服务器还在文件(SHA1,MD5等)旁边提供某种哈希值,否则您无法做到。您可以尝试解析图像文件(创建一个Bitmap等)对象,但如果要下载大量文件,则可能会占用大量内存。只要保持最大的努力:)