In Django-Projekten, die auf Heroku bereitgestellt wurden, habe ich Dateien über Boto in den Google Cloud-Speicher hochgeladen. In letzter Zeit muss ich jedoch große Dateien hochladen, die Heroku Timeout verursachen.Django, Heroku, boto: direkter Datei-Upload in Google Cloud-Speicher
Ich verfolge Heroku Dokumentation über direct file upload to S3 und Customizing wie folgt:
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,
});
Ich habe die folgende Fehlermeldung:
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.
EDIT:
Der Ausgang der gsutil cors get gs://<bucketName>
:
[{"maxAgeSeconds": 3600, "method": ["GET", "POST", "HEAD", "DELETE", "PUT"], "origin": ["*"], "responseHeader": ["Content-Type"]}]
Es scheint, der CORS in Ordnung ist. Also, wie löse ich das Problem? Vielen Dank.
EDIT 2:
Der Header der OPTION Anfrage von 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
Der Header der OPTION Anfrage von Chrome:
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
Es würde helfen, wenn Sie den Headern für die Preflight enthalten (OPTIONS) Anfrage und die Antwort er aders. Insbesondere die Header ACCESS-CONTROL-REQUEST- * und ORIGIN in der Anfrage und die Header ACCESS-CONTROL- * in der Antwort. –
Würden Sie mehr ausarbeiten, weil ich keine Ahnung habe, wie Sie diese Daten einbeziehen? Danke vielmals. –
Der einfachste Weg wäre, die Entwicklertools Ihres Browsers zu verwenden (normalerweise F12, aber nicht immer. Zum Beispiel verwendet Chrome unter OS X OPTION-COMMAND-i). Die Entwicklerwerkzeuge sollten eine Netzwerkregisterkarte haben. Stellen Sie sicher, dass es Verkehr erfasst, jeder Browser ist ein wenig anders. Dann mach weiter und mach deine AJAX-Anfrage, der Browser sollte die ausgehende Anfrage und die Antwort erfassen.Wenn Sie die entsprechende Anfrage auswählen, sollten Sie eine Reihe von Informationen sowohl über die Anfrage vom Browser als auch die Antwort vom Server sehen können. –