【问题标题】:Download file programmatically以编程方式下载文件
【发布时间】:2012-01-10 05:38:02
【问题描述】:

我正在尝试使用 java 应用程序下载 vcalendar,但无法从特定链接下载。

我的代码是:

URL uri = new URL("http://codebits.eu/s/calendar.ics");
InputStream in = uri.openStream();

int r = in.read();
while(r != -1) {
    System.out.print((char)r);
    r = in.read();
}

当我尝试从另一个链接下载时,它可以工作(例如:http://www.mysportscal.com/Files_iCal_CSV/iCal_AUTO_2011/f1_2011.ics)。有些东西不允许我下载,我不知道为什么,当我尝试使用浏览器时它可以工作。

【问题讨论】:

  • 文件被移动。尝试从 uri.openConnection() 中检查 URLConnection

标签: java url inputstream


【解决方案1】:

我会关注这个example。基本上,获取连接的响应代码。如果是重定向(例如本例中的 301),请检索标头位置并尝试使用该位置访问文件。

简单的例子:

URL uri = new URL("http://codebits.eu/s/calendar.ics");
HttpURLConnection con = (HttpURLConnection)uri.openConnection();
System.out.println(con.getResponseCode());
System.out.println(con.getHeaderField("Location"));

uri = new URL(con.getHeaderField("Location"));
con = (HttpURLConnection)uri.openConnection();
InputStream in = con.getInputStream();

【讨论】:

  • 我可以更改网址,但该项目应该作为 Web 服务运行。当有人像这样将一个链接放到一个 vcalendar 时,我的 web 服务将无法正常工作。
  • 我检查了示例 (docs.oracle.com/javase/1.5.0/docs/guide/deployment/…) 并且它有效。非常感谢
  • 不用担心。我自己学到了一些新东西:)
【解决方案2】:

我也认为有重定向。浏览器从 ssl 安全的https://codebits.eu/s/calendar.ics 下载。尝试使用HttpURLConnection,它应该会自动跟随重定向:

HttpURLConnection con = (HttpURLConnection)uri.openConnection();
InputStream in = con.getInputStream();

【讨论】:

    【解决方案3】:

    您应该检查该链接实际提供的内容。例如,它可能是一个已移动的页面,它会返回一个 HTTP 301 代码。您的浏览器会自动知道从新 URL 中获取它,但您的程序不会。

    您可能想尝试,例如,wireshark 在您发出浏览器请求时嗅探实际流量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-15
      • 1970-01-01
      • 2018-11-09
      • 1970-01-01
      • 2011-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多