4

我正在为某个社交网络创建预定帖子的网络服务。
需要帮助处理高流量下的文件上传。

工艺概述:

  • 用户将文件上传到 SomeServer(不是我的)。
  • SomeServer 然后以 JSON 字符串响应。
  • 我的网络应用程序应该存储那个 JSON 响应。

选项 1:保存,cURL POST,删除 tmp我让它工作
愚蠢方式:

  1. 用户上传文件到 MyWebApp;
  2. MyWebApp cURL 将文件进一步发送到 SomeServer,获取响应。

选项 2:JS 魔法
它可能是完美的聪明方式:

  1. 用户从 iFrame 中直接将文件上传到 SomeServer;
  2. MyWebApp 通过 JavaScript 获取响应。

但由于“同源政策”,这是(?)不可能的,不是吗?

选项 3:nginx 代理?
生产服务器的更好方法:

  1. 用户上传文件到 MyWebApp;
  2. nginx拦截文件上传,直接发送到SomeServer;
  3. JSON 响应也被 nginx 拦截并由 MyWebApp 处理。

这有什么意义吗,例如,/fileupload将其代理到 SomeServer 的位置的 nginx 配置是什么?

4

2 回答 2

1

我没有服务器可以用来代替 SomeServer 来测试我的建议,但无论如何我都会试一试。如果我错了,那么我猜你只需要使用 Flash(来自 VK 的示例代码)

如何使用 iFrame 将文件上传到SomeServer,接收 JSON 响应,然后使用postMessage将来自 iFrame 的 JSON 响应从您的站点传递到您的主窗口。据我了解,这几乎postMessage是最初创作的动机。

总的来说,我正在考虑类似这个YUI 的io()模块,但postMessage添加了一些内容以绕过相同的来源策略。

或者在 VK 的情况下,使用他们明确的 iFrame 支持。在我看来,您可以向全局 VK 对象添加一个方法,然后使用VK.callMethod(). 您可以使用该解决方法来创建一个可以从隐藏 iFrame 读取响应的函数。

所以你使用 VK.api('photos.getUploadServer', ...) 来获取 POST URL。

然后,您使用 JS 将该 URL 作为您用于上传文件的 FORM 的操作插入。io()按照文档complete函数中“在 HTML 表单中上传文件”下的示例,使用postMessage将 JSON 发布回您的父窗口。在此处查看示例和文档。(如果它不适用于,您当然可以使用自己滚动的io()示例代码使其工作,如果我是对的。)VK.callMethod()

然后作为响应,postMessage您可以使用常规 AJAX 将 JSON 响应上传回您的服务器。

于 2012-04-19T01:02:41.423 回答
1

我只能看到解决这个问题的两种主要方法:服务器端代理和 javascript/客户端跨站点上传。你的方法13是一回事。您是否使用 cURL 或 nginx 发布文件并不重要 - 无论如何都不是性能方面的。因此,如果您已经1从您的问题中实施了方法,我认为没有任何理由切换到3.

关于 javascript 和同源策略,似乎有很多方法可以实现您的目标,但在所有这些方法中,您的方案必须得到 SomeServer 的开发人员的支持,或者您必须对 SomeServer 具有某种访问权限。以下是可能的大致列表:

  • CORS — 必须允许您的域访问 SomeServer 的域;
  • 更改 document.domain — 这要求您的页面和目标页面托管在同一域的子域上;
  • 使用 Flash 上传器(例如 SWFUpload)——仍然需要通过跨域策略允许您的域,如果是 Flash,则通过SomeServer 域根目录中的crossdomain.xml ;
  • xdcomm(例如EasyXDM)——要求您至少可以将一个 html 页面上传到目标域。然后,此页面可以用作您使用 SomeServer 的 iframe 进行操作的 javascript 代理。

实际上,最后一个可能对您来说是真正的可能性,因为您可以将文件上传到 SomeServer。但是,当然,这取决于它是如何实现的——例如,如果有另一个域提供文件,或者如果有一些安全措施不允许您托管 html 文件,它可能无法正常工作。

于 2012-04-18T00:47:22.787 回答