在Heroku上部署的Django項目中,我曾經通過boto將文件上傳到Google雲存儲。但是,最近我不得不上傳大文件,這會導致Heroku超時。Django,Heroku,boto:直接將文件上傳到Google雲存儲
我下面Heroku的文檔有關direct file upload to S3,和定製如下:
的Python:
conn = boto.connect_gs(gs_access_key_id=GS_ACCESS_KEY,
gs_secret_access_key=GS_SECRET_KEY)
presignedUrl = conn.generate_url(expires_in=3600, method='PUT', bucket=<bucketName>, key=<fileName>, force_http=True)
JS:
url = 'https://<bucketName>.storage.googleapis.com/<fileName>?Signature=...&Expires=1471451569&GoogleAccessId=...'; // "presignUrl"
postData = new FormData();
postData.append(...);
...
$.ajax({
url: url,
type: 'PUT',
data: postData,
processData: false,
contentType: false,
});
,我得到了以下錯誤消息:
XMLHttpRequest cannot load http:/... Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8000' is therefore not allowed access.
編輯:
的gsutil cors get gs://<bucketName>
輸出:
[{"maxAgeSeconds": 3600, "method": ["GET", "POST", "HEAD", "DELETE", "PUT"], "origin": ["*"], "responseHeader": ["Content-Type"]}]
看來CORS是OK。那麼,我該如何解決這個問題呢?謝謝。
編輯2:
的OPTION請求的從Firefox頭:
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: zh-TW,zh;q=0.8,en-US;q=0.5,en;q=0.3
Access-Control-Request-Method: PUT
Connection: keep-alive
Host: <bucketName>.storage.googleapis.com
Origin: http://localhost:8000
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:48.0) Gecko/20100101 Firefox/48.0
從鉻的OPTION請求的報頭:
Accept:*/*
Accept-Encoding:gzip, deflate, sdch
Accept-Language:zh-TW,zh;q=0.8,en;q=0.6,en-US;q=0.4,zh-CN;q=0.2
Access-Control-Request-Headers:
Access-Control-Request-Method:PUT
Connection:keep-alive
Host:directupload.storage.googleapis.com
Origin:http://localhost:8000
Referer:http://localhost:8000/
User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36
X-Client-Data:CIe2yQEIprbJAQjznMoB
這將有助於如果您包括了預檢頭(OPTIONS)請求和響應aders。特別是請求上的ACCESS-CONTROL-REQUEST- *和ORIGIN頭以及響應上的ACCESS-CONTROL- *頭。 –
你會詳細解釋一下,因爲我不知道如何包含這些數據。非常感謝。 –
最簡單的方法是使用瀏覽器的開發工具(通常是F12,但並非總是如此,例如OS X上的Chrome使用OPTION-COMMAND-i)。開發人員工具應該有一個網絡選項卡。確保它正在捕獲流量,每個瀏覽器都有點不同。然後繼續併發出您的AJAX請求,瀏覽器應捕獲傳出請求和響應。如果您選擇適當的請求,您應該能夠看到關於瀏覽器請求和服務器響應的大量信息。 –