在我的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());
答案 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等)对象,但如果要下载大量文件,则可能会占用大量内存。只要保持最大的努力:)