2014-05-09 142 views
2

我的服务器上有一个文件目录,其中包含图像。图像的名称与项目表相关联。项目ID#1,将具有对应的图像“1.png”。检查服务器上是否存在图像文件(Android)

不是所有的项目都有图像,所以如果应用程序检查,它会发现一些没有。在这种情况下,我想要一个if检查来显示默认图像。

我的问题:只有URL可用,我该如何检查url是否导致图像或如果它导致nothing/blank/null?

+0

除了Android的细节,比如网络线程问题,你可以找到在这个Java问题的解决方案的核心是:http://stackoverflow.com/questions/1378199/how-to-检查是否存在或返回404-with-java - 虽然基本机制是使用HttpURLConnection的getResponseCode()方法,但需要花时间阅读所有答案,因为它们指出了各种潜在的问题要知道。 –

回答

1

假设你正在谈论你在哪里试图获取通过HTTP/HTTPS的图像的场景......

简单的方法是只尝试获取图像。然后您检查响应以查看响应状态代码是什么以及内容类型是什么。如果他们分别是200和“image/png”,那么你就有了这个图像。如果状态码是404则图像不存在。如果两者都不是,那么在服务器端“合理的出错”是合理的假设。

链接的问题有做这种事情的代码。


问题是,当您尝试获取不存在的图像时,您在某种程度上依赖于服务器执行的操作。它可以振振有词:

  • 替代自有
  • 返回错误页面,有或没有设置404个状态码
  • 您重定向到一个错误页面,这意味着状态码将默认图像是3xx,
  • 失败,导致5xx响应,或者甚至是
  • 似乎成功但返回一个空的正文或实际内容与响应“content-type”标题不匹配的主体。

如果您实施了服务器,或者您正在与实施者直接打交道,那么您可以假定它将执行什么操作。但是,如果你的代码必须对任何服务器工作,那么它需要更复杂......并且更具防御性。

4

我会建议要求图像请​​求的主管,因为它更快。

非毕加索:

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. 
} 

毕加索:(无关头的版本,但是这是一个很不错的选择来处理它,也看回调毕加索可以在微调成功/错误)

Picasso.with(context).load(urlToImage).into(imageView).placeholder(R.drawable.user_placeholder).error(R.drawable.user_placeholder_error); 

参考文献:

Apache HttpHead from Android's SDK Reference

Apache HttpStatus from Android's SDK Reference

Square Picasso

相关问题