【问题标题】:Checking content type from URL从 URL 检查内容类型
【发布时间】:2015-01-26 06:25:26
【问题描述】:

我之前问过这个questionEvgeniy Dorofeev 回答了这个问题。虽然只为直接链接工作,但我接受了他的回答。他刚刚告诉我从直接链接检查内容类型:

String requestUrl = "https://dl-ssl.google.com/android/repository/android-14_r04.zip";
URL url = new URL(requestUrl);
URLConnection c = url.openConnection();
String contentType = c.getContentType();

据我所知,下载文件有两种URL类型:

  • 直接链接。例如:https://dl-ssl.google.com/android/repository/android-14_r04.zip。从这个链接,我们可以直接下载数据并获取文件名,包含文件扩展名(在这个链接中,.zip扩展名)。这样我们就可以知道要下载什么文件。您可以尝试从该链接下载。
  • 间接链接。例如:http://www.example.com/directory/download?file=52378。您是否尝试过从 Google Drive 下载数据?从 Google Drive 下载数据时,它会给您一个非直接链接,例如上面的链接。我们永远不知道该链接是否包含文件或网页。另外,我们不知道文件名和文件扩展名是什么,因为这个链接类型是不清楚的和随机的。

我需要检查它是文件还是网页。如果内容类型是文件,我必须下载它。

所以我的问题:

  • 如何检查非直接链接的内容类型?
  • 如本题的cmets所示,HTTP-redirects能否解决问题?

感谢您的帮助。

【问题讨论】:

  • 可能的解决方案:Handling HttpClient Redirects
  • 间接链接是什么意思? HTTP 重定向?
  • 您是否针对此问题得到了适当的解决方案?
  • @MiteshSharma,我仍然没有找到解决方案。 @farukdgn 的答案使用返回 Content-Type 标头字段的相同方法来获取内容类型。
  • @MiteshSharma,farukdgn 的回答奏效了。查看他的答案的评论,了解它为什么有效。

标签: java url httpurlconnection content-type


【解决方案1】:

打开 URLConnection 后,会返回一个头文件。里面有一些关于文件的信息。你可以从那里拉出你想要的东西。例如:

URLConnection u = url.openConnection();
long length = Long.parseLong(u.getHeaderField("Content-Length"));
String type = u.getHeaderField("Content-Type");

length 是以字节为单位的文件大小,type 类似于 application/x-dosexecapplication/x-rar

【讨论】:

  • URLConnection类,getHeaderField()方法返回Content-Type头域。此方法返回与getContentType() 相同的标头字段。抱歉,我不能接受这个答案。
  • 所以?我不知道问题是什么,因为它们都运行良好。您遇到过哪些问题?
  • 现在可以了。我已经连接到服务器两次,并为我的 IP 地址提供了大约一个小时的间隔时间。当我在一个小时后第三次连接到它时,服务器将内容类型返回为 .htm。因此,当我尝试在一个小时后使用相同的 IP 重新连接时,问题就来了。感谢您的帮助!
【解决方案2】:

此类链接使用HTTP redirects 将浏览器重定向到实际内容。要获得正确的内容类型,您所要做的就是通过将 setFollowRedirects() 设置为 true 来告诉 HttpURLConnection 遵循重定向(记录在 here)。

【讨论】:

  • 医生说是True by default,所以我猜你不必这样做?
【解决方案3】:

MimeTypeMap.getFileExtensionFromUrl(url)

【讨论】:

    【解决方案4】:

    这个对我有用,你必须使用改造来检查响应的标题。首先,您必须定义一个端点以使用您要检查的 url 调用它:

    @GET
    suspend fun getContentType(@Url url: String): Response<Unit>
    

    然后你这样调用它来获取内容类型标题:

    api.getContentType(url).headers()["content-type"]
    

    【讨论】:

      猜你喜欢
      • 2014-07-25
      • 1970-01-01
      • 2012-04-28
      • 1970-01-01
      • 1970-01-01
      • 2013-04-30
      • 2015-02-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多