【问题标题】:How to download a file from URL to disk and guess filename [closed]如何将文件从 URL 下载到磁盘并猜测文件名 [关闭]
【发布时间】:2015-03-07 22:58:15
【问题描述】:

我正在寻找从 URL 下载文件、保存到磁盘并从 URL 或标题中找出文件名的正确方法。

解决方案可以是 Python、Node、Ruby 或 PHP - 只要其中一个选项对我来说并不重要。

通过从 URL 中猜测文件名来做一个简单的实现很容易,但即使有重定向并且文件名不在 URL 中,我也需要它来工作。

以下是一些示例 URL 和我期望的文件名:

URL 示例中的文件名

URL 示例中的文件名 + 查询参数

重定向 - 标题示例中的文件名

还有 - 以下是有关重定向案例的更多信息:Ruby - how to download a file if the url is a redirection?

【问题讨论】:

  • 你真正想要完成什么?从您自己的服务器下载文件很容易...我在这里看不到问题...
  • 猜文件名?
  • @jycr753 - 添加了示例 URL。
  • 如果语言真的无关紧要,为什么不使用wget 之类的?
  • 没关系,只要它是这些选项之一 :) @loganfsmyth

标签: php python ruby node.js url


【解决方案1】:

Ruby,使用Mechanize gem,简单案例:

require 'mechanize'
agent = Mechanize.new
agent.get(url).save

这甚至会跟随重定向并使用正确的文件名保存。它将第二个示例中的 http 查询字符串转换为有效的文件名。如果您想删除任何查询字符串(警告:这可能是识别唯一资源所必需的),您可能必须像这样调整它:

require 'mechanize'
agent = Mechanize.new    
uri = URI.parse(url)    
if uri.query.nil?
  agent.get(url).save
else
  agent.get(url).save_as(File.basename(uri.path))
end

【讨论】:

  • 示例 3(有问题)保存“下载”而不是歌曲的正确名称:-/
  • 在我的第一个示例中,它为我下载了具有正确文件名的歌曲。
  • 啊,你是对的!我用的是第二种。这是最好的答案。谢谢。
【解决方案2】:

使用 Python requests 模块。

import requests, os

url = "http://static.guim.co.uk/sys-images/Guardian/Pix/pictures/2010/4/14/1271276213693/Snoop-Dogg-in-2004-001.jpg"
resp = requests.get(url, stream=True, allow_redirects=True)
realurl = resp.url.split('/')[-1].split('?')[0]

savepath = '' # set the folder to save to
filepath = os.path.join(savepath, realurl)

with open(filepath, 'wb') as image:
    if resp.ok:
        for content in resp.iter_content(1024):
            if content:
                image.write(content)

【讨论】:

  • 这在重定向或查询参数的情况下不起作用,对吧?
  • i.imgur.com/mW7vW4j.gif?go=true的情况下,它保存到文件名mW7vW4j.gif?go=true...什么时候它应该保存到文件名mW7vW4j.gif
  • 现在可以正确保存了。 @bumpkin
  • 我收到“NameError: global name 'cdn' is not defined”
  • @bumpkin 您对所有这些不同示例的要求基本上是不可能的,除非您有不同的方法来解析您计划查询的每个服务器的 URL 和/或响应标头。如果文件名不包含在标题中(例如前两个示例),您如何判断文件名应该是什么?就第三个示例而言,文件名是"Content-Disposition" 标头的一部分,但它可能不适用于不同的服务器。某些文件类型,例如 .mp3s,在文件中嵌入了文件名(或至少是曲目名称),但许多其他文件没有。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-27
  • 1970-01-01
  • 2014-04-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多