0

我想在托管在同一个 App Engine 域上的以 AJAX 为中心的 webapp 中处理大文件上传到 App Engine(Blobstore -> Google Cloud Storage)。

从浏览器 javascript 客户端,我调用 App Engine 服务器并收到一个 URL 作为响应(从“create_upload_url”创建),但我不知道如何获取我的文件并将其上传到该 URL,而不会出现跨域错误。我似乎无法在 Blobstore 接收器上设置 CORS 标头,并且域与我的应用程序所服务的域不匹配('create_upload_url' 将 '1-dot-' 附加到子域的前缀)。

对此有任何想法或经验吗?

一个想法:由于“1-dot-”前缀似乎只是指一个特定的部署版本,也许如果我解析 url 并删除任何类似的前缀以使域相同并提交到该 url 以避免域错误-匹配。

4

2 回答 2

1

感谢您提出这个问题。这是由于请求处理的当前性质,我们在集思广益以找出最佳前进方式时将其视为一个错误。

目前,如果用户请求

https://myappid.appspot.com/_ah/api/myApi/v1/methodpath

然后它被谷歌的 API 基础设施路由到

https://version-dot-myappid.appspot.com/_ah/spi/MyApi.Method

version应用程序的默认版本在哪里myappid

更新:以前建议的解决方法 la如何将 URL 解析为 javascript 中的主机名和路径?已被证明不起作用。这是因为调用的 App Engine 实例create_upload_url“知道”它是哪个版本/主机,因此更改它会导致错误。

于 2013-06-19T21:31:06.007 回答
1

在我的程序中,此问题仅在某些情况下发生,并且仅在线,而不是在开发服务器中。我得到了问题的根源,但它是 appengine 的一个错误

在页面的javascript中,我有:

$.ajax({
          type: "POST",
          url: upload_url,
          data: formData,
          contentType: false,
          processData: false
            })....

我从 python 代码中获取 upload_url:upload_url = blobstore.create_upload_url('/uploadDragImage')

当我调用该页面时: https ://comunapp-dot-skilled-999.appspot.com/item?categ=news

ajax 调用完美,但如果我添加一个参数:

https://comunapp-dot-skilled-999.appspot.com/item?categ=news &pippo

生成的 upload_url 似乎没有意义,ajax 调用得到这个错误:

混合内容:“ https://comunapp-dot-skilled-999.appspot.com/item?categ=news&luca ”页面通过 HTTPS 加载,但请求了不安全的 XMLHttpRequest 端点“ http://temporary-blobstore-error ” .appspot.com/ '。此请求已被阻止;内容必须通过 HTTPS 提供。

页面 url 中的 '&' 会破坏 url 的生成: blobstore.create_upload_url('/uploadDragImage')

注意:开发服务器工作,问题只是在线

一个可能的解决方案是避免使用 &,并使用其他东西来分隔参数

于 2014-11-29T16:09:54.727 回答