【问题标题】:Check if file exists on remote server using its URL [duplicate]使用 URL 检查远程服务器上是否存在文件 [重复]
【发布时间】:2011-06-03 13:04:48
【问题描述】:

如果文件存在于远程服务器上(由 HTTP 提供服务),我如何在 Java 中签入,并且有它的 URL?我不想下载文件,只是检查它的存在。

【问题讨论】:

  • 此文件是否通过 http 提供服务?

标签: java http networking url file-exists


【解决方案1】:

检查一下,它对我有用。来源网址:Check if URL exists or not on Server

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);     

    String customURL = "http://www.desicomments.com/dc3/08/273858/273858.jpg";

    MyTask task = new MyTask();
    task.execute(customURL);
}


private class MyTask extends AsyncTask<String, Void, Boolean> {

    @Override
    protected void onPreExecute() {

    }

    @Override
    protected Boolean doInBackground(String... params) {

         try {
                HttpURLConnection.setFollowRedirects(false);
                HttpURLConnection con =  (HttpURLConnection) new URL(params[0]).openConnection();
                con.setRequestMethod("HEAD");
                System.out.println(con.getResponseCode()); 
                return (con.getResponseCode() == HttpURLConnection.HTTP_OK);
            }
            catch (Exception e) {   
                e.printStackTrace();    
                return false;
            }
    }

    @Override
    protected void onPostExecute(Boolean result) {
        boolean bResponse = result;
         if (bResponse==true)
            {
                Toast.makeText(MainActivity.this, "File exists!", Toast.LENGTH_SHORT).show();      
            }
            else
            {           
                Toast.makeText(MainActivity.this, "File does not exist!", Toast.LENGTH_SHORT).show();
            }                  
    }           
}
}

【讨论】:

  • 这是安卓相关的解决方案。 OP 没有要求 Android 解决方案。
【解决方案2】:
import java.net.*;
import java.io.*;

public static boolean exists(String URLName){
    try {
      HttpURLConnection.setFollowRedirects(false);
      // note : you may also need
      //        HttpURLConnection.setInstanceFollowRedirects(false)
      HttpURLConnection con =
         (HttpURLConnection) new URL(URLName).openConnection();
      con.setRequestMethod("HEAD");
      return (con.getResponseCode() == HttpURLConnection.HTTP_OK);
    }
    catch (Exception e) {
       e.printStackTrace();
       return false;
    }
  }

如果与 URL (made with HttpURLConnection) 的连接返回 HTTP status code 200,则该文件存在。

编辑:请注意,由于我们只关心它是否存在,因此无需请求整个文档。我们可以只使用 HTTP HEAD request method 请求头来检查它是否存在。

来源:http://www.rgagnon.com/javadetails/java-0059.html

【讨论】:

  • 我们是否必须配置注释中提到的行(注释行)?
  • 我想提一下:服务器需要处理 HEAD 请求才能使其正常工作。
  • 当我在文件名中有一个像'Ü'这样的特殊字符,并用 URLEncoder.encode(filename, "UTF-8") 解析它时,它告诉我文件不存在?
  • 这是一个解释 HEAD 方法使用的有用链接:ochronus.com/http-head-request-good-uses
  • @imdhmd 但是不应该像这里解释的那样禁用头部请求->security.stackexchange.com/questions/62811/…
【解决方案3】:
public static boolean exists(String URLName){
    try {
      HttpURLConnection.setFollowRedirects(false);
      // note : you may also need
      //        HttpURLConnection.setInstanceFollowRedirects(false)
      HttpURLConnection con =
         (HttpURLConnection) new URL(URLName).openConnection();
      con.setRequestMethod("HEAD");
      return (con.getResponseCode() == HttpURLConnection.HTTP_OK);
    }
    catch (Exception e) {
       e.printStackTrace();
       return false;
    }
  }  

Checking if a URL exists or not

【讨论】:

    【解决方案4】:

    创建一个 URLConnection 到它。如果你成功了,它就存在。你可能不得不去打开一个输入流,但你不必阅读内容。您可以立即关闭流。

    【讨论】:

    • InputStream 实现可能不一定会在服务器端进行读取,因此它可能仍然不存在。
    【解决方案5】:

    假设文件是​​通过 http 提供的,您可以向 URL 发送 HEAD 请求并检查返回的 http 响应代码。

    【讨论】:

      【解决方案6】:

      唯一真正的方法是下载它:)。在某些服务器上,通常您可以通过发出 HEAD 请求来摆脱对同一 url 的 GET 请求。这将只返回资源元数据,而不是实际的文件内容。

      更新:查看 org.life.java 的回答,了解如何执行此操作的实际技术细节。

      【讨论】:

        猜你喜欢
        • 2012-06-13
        • 2014-02-21
        • 2014-06-30
        • 2013-01-01
        • 1970-01-01
        • 2014-01-31
        • 2014-12-07
        • 2010-12-12
        • 2014-12-12
        相关资源
        最近更新 更多