Java 正在检查服务器(Android)上是否存在图像文件
我的服务器上有一个包含图像的文件目录。图像的名称与items表相关联。项目ID#1将具有相应的图像“1.png” 并非所有项目都有图像,因此如果应用程序检查,它将在其中一些项目上找不到任何内容。在这种情况下,我需要一个Java 正在检查服务器(Android)上是否存在图像文件,java,android,file,url,Java,Android,File,Url,我的服务器上有一个包含图像的文件目录。图像的名称与items表相关联。项目ID#1将具有相应的图像“1.png” 并非所有项目都有图像,因此如果应用程序检查,它将在其中一些项目上找不到任何内容。在这种情况下,我需要一个if检查来显示默认图像 我的问题:只有一个URL可用,我如何检查URL是否指向图像,或者它是否指向nothing/blank/null?假设您正在讨论一个场景,您正在尝试通过HTTP/HTTPS获取图像 简单的方法是尝试获取图像。然后检查响应,查看响应状态代码和内容类型。如果它们分
if
检查来显示默认图像
我的问题:只有一个
URL
可用,我如何检查URL是否指向图像,或者它是否指向nothing/blank/null?假设您正在讨论一个场景,您正在尝试通过HTTP/HTTPS获取图像
简单的方法是尝试获取图像。然后检查响应,查看响应状态代码和内容类型。如果它们分别为200和“image/png”,那么您就得到了图像。如果状态代码为404,则图像不存在。如果两者都不是,那么服务器端“出了问题”是合理的假设
链接问题有做这类事情的代码
问题是,当您试图获取不存在的映像时,您在某种程度上依赖于服务器的操作。它似乎可以:
- 替换其自身的默认图像
- 返回错误页面,无论是否设置404状态代码
- 将您重定向到错误页面,这意味着状态代码将为3xx
- 失败,导致5xx响应,甚至
- 似乎成功,但返回一个空的正文,或其实际内容与响应“content type”标题不匹配的正文
如果您实现了服务器,或者您直接与实现者打交道,那么您可以对它将做什么做出假设。但是,如果您的代码必须针对任何服务器工作,那么它需要更加复杂。。。而且更具防御性。我建议请求图像请求的头部,因为这样更快 非毕加索:
HttpClient client= new DefaultHttpClient();
HttpHead headMethod = new HttpHead(urlToImage);
HttpResponse response = client.execute(headMethod);
if(response.getStatusLine().getStatusCode== HttpStatus.SC_NOT_FOUND) {
// Image does not exist, show a placeholder or something
} else {
// load image into the view.
}
毕加索:(与head版本无关,但这是一个简单的处理方法,还可以查看毕加索可以用来微调成功/错误的回调)
参考资料:
除了Android的细节,如网络线程问题,您可以在这个Java问题中找到解决方案的核心:-虽然基本机制是使用HttpURLConnection的getResponseCode()方法,但请花时间阅读所有答案,因为它们指出了需要注意的各种潜在复杂性。
Picasso.with(context).load(urlToImage).into(imageView).placeholder(R.drawable.user_placeholder).error(R.drawable.user_placeholder_error);