我有一个类似http://example.com/files/01234
的网址,当我从浏览器点击它时会下载一个标题为file-08.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
...
答案 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)
此功能不会检查标头是否确实存在,因此它不是很可靠,但是在服务器返回下载文件的备用名称的情况下应该可以使用。