Php 如何将文件从URL下载到磁盘并猜测文件名

Php 如何将文件从URL下载到磁盘并猜测文件名,php,python,ruby,node.js,url,Php,Python,Ruby,Node.js,Url,我正在寻找从URL下载文件、保存到磁盘并从URL或标题中找出文件名的正确方法 解决方案可以是Python、Node、Ruby或PHP——只要这些选项中有一个选项,对我来说就无关紧要了 通过从URL猜测文件名很容易实现一个简单的实现,但是我需要这样做,即使有重定向并且文件名不在URL中 以下是一些示例URL和我期望的文件名: URL示例中的文件名 网址: 下载文件应保存为文件名:Snoop-Dogg-in-2004-001.jpg URL示例中的文件名+查询参数 网址: 下载文件应保存为文件

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

解决方案可以是Python、Node、Ruby或PHP——只要这些选项中有一个选项,对我来说就无关紧要了

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

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

URL示例中的文件名

  • 网址:
  • 下载文件应保存为文件名:Snoop-Dogg-in-2004-001.jpg
URL示例中的文件名+查询参数

  • 网址:
  • 下载文件应保存为文件名:mW7vW4j.gif
重定向-标题示例中的文件名

  • 网址:
  • 下载文件应保存为文件名:I may ft.P-Lo&K Camp.mp3

还有-这里有关于重定向案例的更多信息:

使用Python
请求模块

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)

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

你到底想完成什么?从您自己的服务器下载文件很容易。。。我看不出这里有什么问题……猜测文件名?@jycr753-添加了示例URL。如果语言真的不重要,为什么不使用
wget
或其他什么呢?只要是其中一个选项就行:)@loganfsmyth在重定向或查询参数的情况下不起作用,对吗?在,它保存为文件名mW7vW4j.gif?go=true。。。当它应该保存到文件名mW7vW4j.gif时,现在它将正确保存@bumpkinI得到了“NameError:未定义全局名称'cdn'”@bumpkin您对所有这些不同示例的要求基本上是不可能的,除非您有不同的方法来解析您计划查询的每个服务器的URL和/或响应头。如果文件名未包含在标题中(如前两个示例),您如何判断文件名应该是什么?就第三个示例而言,文件名是
“Content Disposition”
头的一部分,但它可能不适用于其他服务器。有些文件类型,如
.mp3
s,在文件中嵌入了文件名(或至少是曲目名),但许多其他文件类型没有。示例3(有问题)保存了“下载”而不是歌曲的正确名称:-/在我的第一个示例中,它为我下载了具有正确文件名的歌曲。啊,你说得对!我用的是第二个。这是最好的答案。谢谢。仅供参考-以下是我使用的: