GCS可恢复上传的PUT响应标头中缺少“ access-control-allow-origin”

use*_*396 6 google-cloud-storage

我目前正在尝试实现从网络浏览器到Google云存储桶的可恢复上传。我正在使用记录的程序,如下所示:

1)通过从Web服务器发送到GCS的http POST启动可恢复的上传。

2)将返回的上传网址发送到浏览器,并通过XmlHttpRequest发出Http PUT以上传数据。

直到最后一切似乎都运作良好。也就是说,浏览器首先发送OPTIONS预检请求,该请求返回OK(200),然后发送一个PUT请求,在此期间上传文件。PUT还返回OK(200),但标头中不包含Access-Control-Allow-Origin。然后,这将导致XmlHttpRequest触发错误。

我不知道为什么不返回此标头字段。我认为从GCS端上传成功,因为文件实际上出现在存储桶中。但是,浏览器认为发生了错误。这是直接从Chrome开发者控制台获取的HTTP记录。

选项要求

请求URL: “https://开头” BUCKET.storage-upload.googleapis.com/1485967698353.e57?upload_id=AEnB2UohgRBG272hoHLZ9i-wLeTn45KKoMjTDEQGu-GoUl-1JQf5_sOnf7IjtpN0wuYzHgzEu3Qi9tpVHGrru--cwY7q2jNQdw
请求方法:OPTIONS
状态代码:200
远程地址:[2607:f8b0 :4009:811 :: 2010]:443

选项响应头

access-control-allow-credentials:true
access-control-allow-headers:content-range,content-type,x-upload-content-type
access-control-allow-methods:PUT
access-control-allow-origin:http ://www.example.com
alt-svc:quic =“:443”; ma = 2592000; v =“ 35,34”
content-length:0
content-type:text / html; charset = UTF-
8日期
:2017年2月1日星期三16:48:18 GMT 服务器:UploadServer
状态:200

PUT请求

请求URL: “https:”开头// BUCKET.storage-upload.googleapis.com/1485967698353.e57?upload_id=AEnB2UohgRBG272hoHLZ9i-wLeTn45KKoMjTDEQGu-GoUl-1JQf5_sOnf7IjtpN0wuYzHgzEu3Qi9tpVHGrru--cwY7q2jNQdw
请求方法:PUT
状态代码:200
远程地址:[2607:f8b0 :4009:811 :: 2010]:443

PUT响应标题

alt-svc:quic =“:443”; ma = 2592000; v =“ 35,34”
content-length:0
content-type:text / html; charset = UTF-
8日期
:2017年2月1日,星期三16:48:19 GMT etag:“ c6f30652db5986aec4c00e80a9d00f25”
服务器:UploadServer
状态:200个
不同:来源
x-goog代:1485967699029000
x-goog-hash:md5 = xvMGUttZhqd7AwQ6
x-goog-hash:crc32c = / vx4zQ ==
x-goog-metageneration:1个
x-goog存储的内容编码:身份
x-goog存储的内容长度:743424
x-guploader-uploadid:AEnB2UohgRBG272hoHLZ9i-wLeTnQ45KKoMjT -GoUl-1JQf5_sOnf7IjtpN0wuYzHgzEu3Qi9tpVHGrru--cwY7q2jNQdw

因此,PUT响应中没有“ access-control-allow-origin”。当我使用签名的URL进行上传时,GCS实际上会返回“ Access-Control-Allow-Origin”。但是,这不是我绝对需要的可恢复上传。

这个问题几乎与

XMLHttpRequest CORS到Google Cloud Storage仅在预检请求中起作用

但是给出的解决方案没有效果。这是发起上传的原始请求(令牌不是真实的,“ http / s”周围有引号来加扰链接)。“来源”在请求中。

POST “HTTPS”://BUCKET.storage-upload.googleapis.com/1485967698353.e57
的Accept-Encoding:gzip的
授权:承载2342342234234234234234234234-234234234234234234234234234234234234234234234234sxx-FSpWkCqI0BCRWoG2342423s423423423A4234_234E23s423i423423423423423423423423423234234234234234234234234234234234234234234234234X
的User-Agent:谷歌-HTTP-Java的客户端/ 1.22.0(gzip的)
x-goog-resumable:起始
来源:“ http:” / www.example.com
内容长度:0

我可能可以通过简单地忽略XmlHttpRequest错误来解决此问题,但这会在客户端上导致一些奇怪的编码。理想情况下,有一个答案...

use*_*396 0

在我忘记这篇文章之前,我想留下我最终找到的解决方案。问题出在这些步骤上

1) 通过从 Web 服务器发送到 GCS 的 http POST 启动可断点上传。

2)将返回的上传url发送到浏览器,并通过XmlHttpRequest发出Http PUT来上传数据。

我最终在客户端上执行了 1) 和 2)。为此,我在服务器上为初始帖子创建了一个签名 URL,并将其发送到浏览器。然后,浏览器发出 POST 来启动上传,随后发出 PUT 来发送文件。

这里的一些解决方案建议您可以在服务器上执行初始 POST,但这对我来说不起作用。