Ran*_*ang 7 django boto google-cloud-storage
在Heroku上部署的Django项目中,我曾经通过boto将文件上传到Google云存储.但是,最近我必须上传大文件,这会导致Heroku超时.
我正在关注Heroku关于直接文件上传到S3的文档,并按照以下方式进行自定义:
蟒蛇:
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)
Run Code Online (Sandbox Code Playgroud)
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,
});
Run Code Online (Sandbox Code Playgroud)
我收到以下错误消息:
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.
Run Code Online (Sandbox Code Playgroud)
编辑:
输出gsutil cors get gs://<bucketName>:
[{"maxAgeSeconds": 3600, "method": ["GET", "POST", "HEAD", "DELETE", "PUT"], "origin": ["*"], "responseHeader": ["Content-Type"]}]
Run Code Online (Sandbox Code Playgroud)
看来CORS还行.那么,我该如何解决这个问题呢?谢谢.
编辑2:
来自Firefox的OPTION请求的标题:
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
Run Code Online (Sandbox Code Playgroud)
来自Chrome的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
Run Code Online (Sandbox Code Playgroud)
小智 4
标头问题不是来自您的应用程序,我认为它来自云存储桶。我在设置 api 时遇到了同样的问题,您发布到的资源缺少标头。
https://cloud.google.com/storage/docs/cross-origin
虽然这种安全措施对于防止恶意行为很有用,但它还可以防止已知来源之间有用且合法的交互。例如,从 Google App Engine(example.appspot.com)托管的页面上的脚本可能想要使用存储在 Cloud Storage 存储桶(example.storage.googleapis.com)中的静态资源。但是,由于从浏览器的角度来看,这是两个不同的来源,因此浏览器将不允许来自 example.appspot.com 的脚本使用 XMLHttpRequest 从 example.storage.googleapis.com 获取资源,因为所获取的资源来自不同的起源。
因此,您似乎需要配置存储桶以允许 cors 请求。google 文档显示了要从 google cli 运行的以下代码。
https://cloud.google.com/storage/docs/cross-origin#Configuring-CORS-on-a-Bucket
gsutil cors set cors-json-file.json gs://example
[
{
"origin": ["http://mysite.heroku.com"],
"responseHeader": ["Content-Type"],
"method": ["GET", "HEAD", "DELETE", "PUT"],
"maxAgeSeconds": 3600
}
]
Run Code Online (Sandbox Code Playgroud)
这将允许您获取、上传和删除内容。希望有帮助。