首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何解码HTTP中Content-Disposition头部的filename参数?

如何解码HTTP中Content-Disposition头部的filename参数?
EN

Stack Overflow用户
提问于 2013-07-06 03:00:17
回答 1查看 3.6K关注 0票数 1

question提供此filename参数的背景。

我需要写一个脚本来访问web服务器上的一些文件。文件名包含无法用ASCII编码的CJK字符。

代码语言:javascript
复制
$ curl -I 'http://bj.baidupcs.com/file/f6f258963f3c5daaa154ed441db232e1?xcode=f5a142e99df965f6a3b4c502a3c55a73283ef282da2f5c14&fid=1107408242-250528-2625488475&time=1373046574&sign=FDTAXER-DCb740ccc5511e5e8fedcff06b081203-QSIMrWw%2FICWQuExpdtyijM0vbMM%3D&to=bb&fm=N,Q,U&expires=8h&rt=sh&r=210487178&logid=3893215518&sh=1'
......
Content-Disposition: attachment;filename="【动漫之家汉化组】[最强会长黑神][第192话][黑神目泷依然健在][END].zip"
......

如您所见,cURL正确地解码了文件名。Firefox还可以找出正确的文件名。

我用Python写了我的脚本。我首先尝试了requests

代码语言:javascript
复制
>>> import requests
>>> r=requests.head('http://bj.baidupcs.com/file/f6f258963f3c5daaa154ed441db232e1?xcode=f5a142e99df965f6a3b4c502a3c55a73283ef282da2f5c14&fid=1107408242-250528-2625488475&time=1373046574&sign=FDTAXER-DCb740ccc5511e5e8fedcff06b081203-QSIMrWw%2FICWQuExpdtyijM0vbMM%3D&to=bb&fm=N,Q,U&expires=8h&rt=sh&r=210487178&logid=3893215518&sh=1')
>>> r.headers['content-disposition']
'attachment;filename="ã\x80\x90å\x8a¨æ¼«ä¹\x8bå®¶æ±\x89å\x8c\x96ç»\x84ã\x80\x91[æ\x9c\x80强ä¼\x9aé\x95¿é»\x91ç¥\x9e][第192è¯\x9d][é»\x91ç¥\x9eç\x9b®æ³·ä¾\x9dç\x84¶å\x81¥å\x9c¨][END].zip"'

文件名看起来像是Python字节的奇怪表示形式。问题是整个东西已经是一个Python字符串了。我想不出一种方法来获得实际要解码的字节。

代码语言:javascript
复制
>>> type(r.headers['content-disposition'])
<class 'str'>

requests使用的底层库是http.client标准库。我试过了,但得到的结果是一样的:

代码语言:javascript
复制
>>> import http.client
>>> conn = http.client.HTTPConnection("bj.baidupcs.com")
>>> conn.request('HEAD', '/file/f6f258963f3c5daaa154ed441db232e1?xcode=f5a142e99df965f6a3b4c502a3c55a73283ef282da2f5c14&fid=1107408242-250528-2625488475&time=1373046574&sign=FDTAXER-DCb740ccc5511e5e8fedcff06b081203-QSIMrWw%2FICWQuExpdtyijM0vbMM%3D&to=bb&fm=N,Q,U&expires=8h&rt=sh&r=210487178&logid=3893215518&sh=1')
>>> r=conn.getresponse()
>>> r.getheader('content-disposition')
'attachment;filename="ã\x80\x90å\x8a¨æ¼«ä¹\x8bå®¶æ±\x89å\x8c\x96ç»\x84ã\x80\x91[æ\x9c\x80强ä¼\x9aé\x95¿é»\x91ç¥\x9e][第192è¯\x9d][é»\x91ç¥\x9eç\x9b®æ³·ä¾\x9dç\x84¶å\x81¥å\x9c¨][END].zip"'

我在Windows上使用Python 3。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-06 03:14:20

看起来您将得到一个UTF8编码的(字节)字符串作为Python3 (Unicode)字符串。你得做一些像这样的事情。

代码语言:javascript
复制
>>> s = 'attachment;filename="ã\x80\x90å\x8a¨æ¼«ä¹\x8bå®¶æ±\x89å\x8c\x96ç»\x84ã\x80\x91[æ\x9c\x80强ä¼\x9aé\x95¿é»\x91ç¥\x9e][第192è¯\x9d][é»\x91ç¥\x9eç\x9b®æ³·ä¾\x9dç\x84¶å\x81¥å\x9c¨][END].zip"'
>>> s = s.encode('latin-1').decode('utf-8')
>>> s
'attachment;filename="【动漫之家汉化组】[最强会长黑神][第192话][黑神目泷依然健在][END].zip"'
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17495334

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档