【发布时间】:2017-06-18 13:17:10
【问题描述】:
我目前正在尝试实现从网络浏览器到谷歌云存储桶的可恢复上传。我正在使用以下记录的程序:
1) 通过从网络服务器发送到 GCS 的 http POST 启动可恢复上传。
2) 将返回的上传 url 发送到浏览器,并通过 XmlHttpRequest 发出 Http PUT 来上传数据。
直到最后,一切似乎都运行良好。 IE。浏览器首先发送返回 OK (200) 的 OPTIONS 预检请求,然后发送一个上传文件的 PUT 请求。 PUT 也返回 OK(200) 但在标头中不包含 Access-Control-Allow-Origin。这将导致 XmlHttpRequest 触发错误。
我无法弄清楚为什么不返回此标头字段。我认为从 GCS 端上传是成功的,因为文件实际上出现在存储桶中。但是,浏览器认为发生了错误。这是直接从 Chrome 开发者控制台中取出的 HTTP 记录。
选项请求
请求网址:“https://”BUCKET.storage-upload.googleapis.com/1485967698353.e57?upload_id=AEnB2UohgRBG272hoHLZ9i-wLeTn45KKoMjTDEQGu-GoUl-1JQf5_sOnf7IjtpN0wuYzHgzEu3Qi9tpVHGrru--cwY7qq2jNHGrru--cwY7
请求方法:OPTIONS
状态码:200
远程地址:[2607:f8b0:4009:811::2010]:443
OPTIONS 响应标头
访问控制允许凭据:true
访问控制允许标头:内容范围、内容类型、x-上传内容类型
访问控制允许方法:PUT
访问控制允许来源:http://www.example.com
alt-svc:quic=":443";马=2592000; v="35,34"
内容长度:0
内容类型:文本/html;字符集=UTF-8
日期:格林威治标准时间 2017 年 2 月 1 日星期三 16:48:18
服务器:上传服务器
状态:200
PUT 请求
请求网址:“https://BUCKET.storage-upload.googleapis.com/1485967698353.e57?upload_id=AEnB2UohgRBG272hoHLZ9i-wLeTn45KKoMjTDEQGu-GoUl-1JQf5_sOnf7IjtpN0wuYzHgzEu3Qi9tpVHGrdw--cw7
请求方法:PUT
状态码:200
远程地址:[2607:f8b0:4009:811::2010]:443
PUT 响应标头
alt-svc:quic=":443";马=2592000; v="35,34"
内容长度:0
内容类型:文本/html;字符集=UTF-8
日期:格林威治标准时间 2017 年 2 月 1 日星期三 16:48:19
etag:“c6f30652db5986aec4c00e80a9d00f25”
服务器:上传服务器
状态:200
不同:产地
x-goog-generation:1485967699029000
x-goog-hash:md5=xvMGUttZhq7EwA6AqdAPJQ==
x-goog-hash:crc32c=/vx4zQ==
x-goog-metageneration:1
x-goog-stored-content-encoding:身份
x-goog-stored-content-length:743424
x-guploader-uploadid:AEnB2UohgRBG272hoHLZ9i-wLeTn45KKoMjTDEQGu-GoUl-1JQf5_sOnf7IjtpN0wuYzHgzEu3Qi9tpVHGrru--cwY7q2jNQdw
因此,PUT 响应中没有“access-control-allow-origin”。当我使用签名 URL 执行上传时,GCS 实际上返回“Access-Control-Allow-Origin”。但是,这不是我绝对需要的可恢复上传。
这个问题和
几乎一模一样XMLHttpRequest CORS to Google Cloud Storage only working in preflight request
但是那里给出的解决方案没有效果。这是启动上传的原始请求(令牌不是真实的,“http/s”周围有引号来打乱链接)。 “来源”在请求中。
发布“https”://BUCKET.storage-upload.googleapis.com/1485967698353.e57
接受编码:gzip
授权:承载2342342234234234234234234234-234234234234234234234234234234234234234234234234sxx-FSpWkCqI0BCRWoG2342423s423423423A4234_234E23s423i423423423423423423423423423234234234234234234234234234234234234234234234234X结果
用户代理:Google-HTTP-Java-Client/1.22.0 (gzip)
x-goog-resumable: 开始
来源:“http:”/www.example.com
内容长度:0
我可以通过简单地忽略 XmlHttpRequest 错误来解决这个问题,但这会导致客户端出现一些奇怪的编码。理想情况下,有一个答案......
【问题讨论】:
-
观察到同样的事情。看起来像一个 GCP 错误,我可以在 JS 和 Python 中确认。我已经在这里开票了:issuetracker.google.com/issues/123304569