【问题标题】:Checking if image file exists on Server (Android)检查服务器上是否存在图像文件(Android)
【发布时间】:2014-06-27 19:12:37
【问题描述】:

我的服务器上有一个包含图像的文件目录。图像的名称与项目表相关联。物品 ID#1,会有对应的图片“1.png”。

并非所有项目都有图像,因此如果应用程序检查,它不会在其中一些项目上找到任何内容。在这种情况下,我想要一个 if 检查以显示默认图像。

我的问题:只有URL 可用,我如何检查网址是否指向图像或者它是否导致空/空白/空?

【问题讨论】:

  • 除了网络线程问题等Android细节问题,你可以在这个Java问题中找到解决方案的核心:stackoverflow.com/questions/1378199/… - 而基本机制是使用HttpURLConnection的getResponseCode()方法采取是时候阅读所有答案了,因为它们指出了需要注意的各种潜在并发症。

标签: java android file url


【解决方案1】:

我会建议请求图像请求的负责人,因为它更快。

非毕加索:

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 :(与 head 版本无关,但这是处理它的简单替代方案,还请查看 Picasso 可以接受的回调以微调成功/错误)

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

【讨论】:

    【解决方案2】:

    假设您正在讨论一个尝试通过 HTTP / HTTPS 获取图像的场景......

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

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


    问题在于,当您尝试获取不存在的图像时,您在某种程度上依赖于服务器的操作。它可能是合理的:

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

    如果您实现了服务器,或者您直接与实现者打交道,您可以假设它会做什么。但是,如果您的代码必须针对任何服务器工作,那么它需要更复杂......并且更具防御性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-29
      • 2012-05-15
      • 2013-09-21
      • 2015-04-14
      • 2012-10-01
      • 2012-06-13
      • 2011-11-16
      相关资源
      最近更新 更多