我使用Python
很简单,我只需从响应对象上访问HTTP头中的
那么,我是否必须实现一个全面的解析器,还是可以通过对HTTP库进行一些调用来根据RFC 6266确定文件名(可能是
requests
库的get
函数下载文件。为了存储文件,我想确定与Web浏览器“保存”或“另存为...”对话框相同的文件名。很简单,我只需从响应对象上访问HTTP头中的
Content-Disposition
字段即可获取它。import re
d = r.headers['content-disposition']
fname = re.findall("filename=(.+)", d)
但是更仔细地看这个主题,它并不那么容易:
根据 RFC 6266第4.3节 中的语法以及 第4.1节,该值可以是未引用的标记(例如 the_report.pdf
)或带有空格(例如 "the report.pdf"
)和转义序列的带引号字符串。此外,
当单个头字段值中同时存在“filename”和“filename*”时,[我们]应选择“filename*”,并忽略“filename”。
filename*
的值比 filename
的值要复杂得多。
此外,RFC 似乎允许在 =
周围添加额外的空格。
-
filename:Content-Disposition: Attachment; filename=example.html
example.html
-
filename:Content-Disposition: INLINE; FILENAME= "an example.html"
an example.html
-
filename:Content-Disposition: attachment; filename*= UTF-8''%e2%82%ac%20rates
€ rates
-
filename:Content-Disposition: attachment; filename="EURO rates"; filename*=utf-8''%e2%82%ac%20rates
€ rates
here, too (notEURO rates
, asfilename*
takes precedence)
=
周围的可变空格,但是让它处理所有其他变化也会变得相当笨拙。 (由于引用和转义,我甚至不确定RegEx是否可以涵盖所有情况。也许可以,因为没有大括号嵌套。)那么,我是否必须实现一个全面的解析器,还是可以通过对HTTP库进行一些调用来根据RFC 6266确定文件名(可能是
requests
本身)?由于RFC 6266是HTTP标准的一部分,我可以想象一些专门处理HTTP的库已经涵盖了这一点。(所以我也在软件推荐SE上提出了问题。)
parse_headers
有一个relaxed
选项可以帮助解决这个问题。在 这里 查看代码。 - Alyssa Haroldsen