2017-03-06 149 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