从R中的url获取文件名

时间:2017-12-28 02:09:44

标签: r curl wget

我有一个类似http://example.com/files/01234的网址,当我从浏览器点击它时会下载一个标题为file-08.zip

的zip文件

使用wget,我可以通过运行

使用真实文件名下载
wget --content-disposition http://example.com/files/01234

basename等函数在这种情况下不起作用,例如:

> basename("http://example.com/files/01234")
[1] "01234"

我想从R中的URL获取文件名,并创建一个带有zip(文件)名称的tibble。无论使用包还是system(...)命令。有任何想法吗?我想要获得的是

url                            | file
--------------------------------------------
http://example.com/files/01234 | file-08.zip
http://example.com/files/03210 | file-09.zip
...

2 个答案:

答案 0 :(得分:1)

@Sathish贡献:

当URL不包含要在URL字符串中下载的文件时,有效的解决方案是

system("curl -IXGET -r 0-10 https://example.com/01234567 | grep attachment | sed 's/^.\\+filename=//'")

想法是在获取文件名之前从zip而不是完整文件中读取10个字节,它将返回file-789456.zip或该URL中的真实zip名称。

答案 1 :(得分:0)

使用httr库,您可以进行HEAD调用,然后解析其content-disposition标头,例如

library(httr)
hh <- HEAD("https://example.com/01234567")
get_disposition_filename <- function(x) {
  sub(".*filename=", "", headers(x)$`content-disposition`)
}
get_disposition_filename(hh)

此功能不会检查标头是否确实存在,因此它不是很可靠,但是在服务器返回下载文件的备用名称的情况下应该可以使用。