我想在Amazon S3上获取文件大小而无需下载。我的尝试是尝试发送HTTP HEAD,返回的请求将包含内容长度的HTTP标头。
这是我的代码:
import httplib
import urllib
urlPATH = urllib.unquote("/ticket/fakefile.zip?AWSAccessKeyId=AKIAIX44POYZ6RD4KV2A&Expires=1495332764&Signature=swGAc7vqIkFbtrfXjTPmY3Jffew%3D")
conn = httplib.HTTPConnection("cptl.s3.amazonaws.com")
conn.request("HEAD", urlPATH, headers={'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3',
'Accept-Encoding': 'none',
'Accept-Language': 'en-US,en;q=0.8',
'Connection': 'keep-alive'}
)
res = conn.getresponse()
print res.status, res.reason
错误信息是:
403 Forbidden
为了逃避URL中的“%”,我使用了urllib.unquote,在获得403 Forbidden之后,我还尝试添加一些标题,因为我认为亚马逊可能只返回看似请求的文件一个浏览器,但我继续得到403错误。
这是亚马逊需要特定参数来正确提供HTTP请求还是我的代码不好的情况?
答案 0 :(得分:0)
403 Forbidden温和地指出了一个身份验证问题。您确定您的访问密钥和签名是否正确?
如果有疑问,您可以随时尝试通过Boto3获取元数据,{{3}}可以为您处理所有身份验证内容(从配置文件或您传入的数据中提取)。哎呀,如果它有效,你甚至可以打开调试模式,看看它实际发送的是什么。
答案 1 :(得分:0)
好的....我通过使用变通方法找到了解决方案。我最好的猜测是curl / wget在S3的请求中缺少http标头,因此它们全都失败并且浏览器正常工作。试图开始分析请求,但没有。
最终,让它使用以下代码:
import urllib
d = urllib.urlopen("S3URL")
print d.info()['Content-Length']