【问题标题】:Content type of a distant file远程文件的内容类型
【发布时间】:2016-11-14 21:04:51
【问题描述】:

我想获取一个远程文件的内容类型,因为我在下载它时遇到了问题。内容类型错误。这是我下载文件的代码

url = "http://my_url/my_file.mp4"
file = open(URI::encode(url))
content_type = file.content_type # => text/plain instead of video/mpeg or video/mp4

我之前尝试了以下代码来获取 content_type 但仍然无法正常工作:

url = URI.parse(url)
Net::HTTP.start(url.host, url.port){|http|  http.head(url.request_uri)['Content-Type']}

有人有想法吗?

编辑

这是我用来找出它是哪个 content_type 的代码..

MIME::Types.type_for(URI::encode(url)).map{|type| type.content_type}.join(' ')
# => "application/mp4 audio/mp4 video/mp4 video/vnd.objectvideo"

但这是带有音轨的视频的结果..我怎么想只有粉红色的“video/mp4”?我无法检查每种文件类型以查看结果。它是无止境的。

【问题讨论】:

  • 你是想找出它是什么类型的文件,或者服务器返回的 Content-Type 标头的值是什么?
  • 注意:一般最好写URI.encode(...):: 命名空间导航器适用于模块、类和常量。
  • @Jordan 我想知道内容类型。基本上我想确定上传的文件是它应该是什么..根据这个内容类型我将实例化 X 或 Y 模型..
  • 我刚刚测试了您的open 代码和您的Net::HTTP 代码,发现它们都报告了正确的Content-Type,即服务器返回的Content-Type 标头的值.这留下了一些可能性。其中: 1. 服务器没有返回文件,而是以纯文本形式返回错误信息(你看过响应的正文吗?); 2. 服务器没有返回文件,它返回的是其他一些纯文本文件;或 3. 服务器返回正确的文件,但 Content-Type 标头错误。我认为 1 和 3 最有可能。

标签: ruby file download content-type


【解决方案1】:

服务器没有义务告诉您正确的内容类型,而且在许多情况下他们会弄错,因为它通常并不重要。大多数浏览器在接受和处理的内容方面提供了相当大的余地。

唯一确定的方法是下载文件并使用file 之类的工具来检查它。这有一个相当大的数据库,包含不同的文件格式和识别它们的方法。

您的请求结果可能是 HTML 错误消息。在您验证文件的内容之前,您不会知道。

【讨论】:

  • 这就是我的想法,但是当我执行“open(..)”时,我创建了一个临时文件。我正在检查这个临时文件的内容类型,但它很糟糕。我想在下载之前确切知道我要下载的内容类型吗?
  • 这是一个混乱的世界,因此您无法确定在请求任意 URL 时会得到什么。如果您已经控制了服务器并正确配置了它,那么它主要匹配文件名与 MIME 类型,那么它可能是错误的。
  • FWIW 您可以通过管道将curlwget 连接到file,一旦file 可以识别它,管道就会短路,因此您不必下载整个文件:wget --quiet -O - http://... | file -curl --silent --location http://... | file -(cURL 的 --location 选项告诉它遵循重定向;Wget 自动执行)。
  • 这是wgetcurl 请求的结果:/dev/stdin: ISO Media, MPEG v4 system, iTunes AVC-LC。我想手动将其与相关的内容类型匹配吗?
  • 如果您有--mime 选项file,看看是否有帮助。一如既往,file --help 来救援。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 2018-05-27
  • 2012-03-23
  • 2012-06-20
  • 2020-04-07
相关资源
最近更新 更多