【发布时间】:2012-04-22 12:42:56
【问题描述】:
我正在为某个社交网络创建预定帖子的网络服务。
需要帮助处理高流量下的文件上传。
流程概览:
- 用户将文件上传到 SomeServer(不是我的)。
- SomeServer 然后以 JSON 字符串响应。
- 我的网络应用应该存储 JSON 响应。
选项 1:保存、cURL POST、删除 tmpstupid 我让它工作的方式:
- 用户将文件上传到 MyWebApp;
- MyWebApp cURL 将文件进一步发送到 SomeServer,获取响应。
选项 2:JS 魔法
完美的智能方式:
- 用户从 iFrame 中将文件直接上传到 SomeServer;
- MyWebApp 通过 JavaScript 获取响应。
但这(?)由于“同源政策”是不可能的,不是吗?
选项 3:nginx 代理?
生产服务器的更好方法:
- 用户将文件上传到 MyWebApp;
- nginx拦截文件上传,直接发送到SomeServer;
- JSON 响应也会被 nginx 截获并由 MyWebApp 处理。
这有什么意义吗?例如,/fileupload Location 的 nginx 配置是什么,以将其代理到 SomeServer?
【问题讨论】:
-
您可以克服同源策略,但要做到这一点,SomeServer 应在其响应中添加 Cross-Origin Resource Sharing (CORS) 标头。检查它是否实现了 CORS,或者您是否可以说服 SomeServer 的开发人员实现它。
-
SomeServer 确实实现了 CORS 标头,但不幸的是,仅针对它们自己的根域。 “Access-Control-Allow-Origin”HTTP 标头提供单个值。我怀疑他们的开发人员会为我的服务进行调整。所以,回到 nginx/post 转发。
-
你也可以使用
postMessage在不同源域的框架之间进行通信 -
@tkone 确实如此,但您无法使用
postMessage上传文件。好吧,也许您可以以某种方式序列化/反序列化文件。但无论如何,使用postMessage需要在SomeServer 方面进行开发,而@SergikS 似乎无法做到这一点。顺便说一句,postMessage被用作 EasyXDM 中通信方式的一部分,我在下面的回答中提到了。 -
@tkone: postMessage 需要服务器端编程。但是你怎么能用 postMessage 上传文件!!
标签: file-upload nginx cross-domain same-origin-policy vk