2017-03-06 49 views
0

我想要在Amazon S3上获取文件的大小而无需下载它。我尝试尝试发送HTTP HEAD,并且返回的请求将包含内容长度HTTP标头。获取403禁止请求Amazon S3文件

这里是我的代码:

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禁止,我也试图尝试添加一些标题,因为我认为亚马逊可能只返回似乎被浏览器请求的文件,但我继续得到403错误。

这是亚马逊需要特定参数来正确处理HTTP请求或我的代码不好的情况吗?

+1

你确定你需要额外的报价?即使没有这个也会返回403吗? – Scovetta

+0

你指的是多少额外的引用? – Peter

+0

对不起,拼写错误,我的意思是'urllib.unquote'。 – Scovetta

回答

0

好的....我通过使用解决方法找到了解决方案。我最好的猜测是curl/wget在S3的请求中缺少http头,所以它们都失败并且浏览器工作。试图开始分析请求,但没有。

最终,得到了它与下面的代码工作:

import urllib 
d = urllib.urlopen("S3URL") 
print d.info()['Content-Length'] 
0

403禁止轻度指向认证问题。你确定你的访问密钥和签名是正确的吗?

如果有疑问,您可以尝试通过Boto3获取元数据,该元数据为您处理所有auth物件(从配置文件或传入的数据中提取)。哎呀,如果它工作,你甚至可以打开调试模式,看看它实际发送的是什么。

+0

如果我将我的代码中的网址复制并粘贴到网络浏览器中,它会正常下载。 – Peter

+0

好吧,我可能不得不尝试。谢谢 – Peter

+0

用'curl'尝试将复制粘贴到命令行中 - 它比网页浏览器隐藏少了很多。 – pjz

相关问题