File upload 从浏览器将文件上载到其他域的最佳方式是什么?
我正在为一些社交网络创建一个定期发布的web服务。File upload 从浏览器将文件上载到其他域的最佳方式是什么?,file-upload,nginx,cross-domain,same-origin-policy,vk,File Upload,Nginx,Cross Domain,Same Origin Policy,Vk,我正在为一些社交网络创建一个定期发布的web服务。需要帮助处理高流量下的文件上传 流程概述: 用户将文件上传到SomeServer(不是我的) SomeServer然后用JSON字符串响应 我的web应用程序应该存储JSON响应 选项1:保存、卷发、删除tmp 我做这件事的愚蠢方式: 用户上传文件到MyWebApp MyWebApp将文件进一步发送到SomeServer,获取响应 选项2:JS magic 完美的智能方式: 用户从iFrame中直接将文件上传到SomeServer MyWeb
需要帮助处理高流量下的文件上传 流程概述:
- 用户将文件上传到SomeServer(不是我的)李>
- SomeServer然后用JSON字符串响应
- 我的web应用程序应该存储JSON响应
我做这件事的愚蠢方式:
完美的智能方式:
生产服务器的更好方法是:
这有什么意义吗?nginx配置用于什么,比如说,
/fileupload
位置来代理它到某个服务器?我只能看到解决这个问题的两种主要方法:服务器端代理和javascript/客户端跨站点上传。你的方法1
和3
是一样的。不管您是使用cURL还是nginx发布文件,这都无关紧要——不管怎样,性能都不重要。所以,如果您已经从您的问题中实现了方法1
,我看不出有任何理由切换到3
关于javascript和同源策略,似乎有很多方法可以实现您的目标,但在所有这些方法中,要么您的场景必须由SomeServer的开发人员支持,要么您必须对SomeServer具有某种访问权限。下面是一个大概的可能性列表:
- -必须允许您的域访问某些服务器的域李>
- -这要求您的页面和目标页面位于同一域的子域上李>
- 使用flash上传器(例如SWFUpload)-仍然需要通过跨域策略允许您的域,如果是flash,则通过SomeServer域根目录中的a李>
- (例如)-要求您至少可以将html页面上载到目标域。然后,此页面可以用作javascript代理,用于使用SomeServer的iframe进行操作
事实上,最后一个对你来说是很有可能的,因为你可以上传文件到某个服务器上。但当然,这取决于它的实现方式,例如,如果文件来自另一个域,或者如果有一些安全措施不允许您托管html文件,则可能无法运行。我没有一台服务器来代替某个服务器来测试我的建议,不过我还是要试一试。如果我错了,那么我想你只能这样了 使用iFrame将文件上传到SomeServer,接收JSON响应,然后使用
postMessage
将JSON响应从iFrame从站点传递到主窗口。据我所知,这就是最初创建postMessage
的动机
总的来说,我正在考虑添加postMessage
以绕过同源策略
或者在VK的情况下。在我看来,您可以向全局VK对象添加一个方法,然后使用VK.callMethod()
从VK源域调用该方法。您可以使用该解决方法创建一个函数,该函数可以从隐藏的iFrame读取响应
因此,您使用VK.api('photos.getUploadServer',…)来获取帖子URL
然后使用JS插入该URL,作为用于上载文件的表单的操作。按照中“以HTML格式上载文件”下的示例,在complete
函数中,使用postMessage
将JSON发回父窗口。看见(如果它不能与io()
一起工作,那么如果我对VK.callMethod()
的看法正确,您当然可以使用示例代码使其工作)
然后,为了响应
postMessage
,您可以使用常规AJAX将JSON响应上传回您的服务器。您可以克服同源策略,但要实现这一点,某些服务器应该为其响应添加头。检查它是否实现了CORS,或者您是否可以说服SomeServer的开发人员实现它。SomeServer确实实现了CORS头,但不幸的是,仅针对其自己的根域。“Access Control Allow Origin”HTTP头提供一个值。我怀疑他们的开发人员是否会为我的服务调整这一点。因此,回到nginx/post转发。您还可以使用postMessage
在帧之间进行通信,而不考虑源domain@tkone这是正确的,但是您不能上载带有postMessage
的文件。嗯,也许你可以对一个文件进行序列化/反序列化。但在任何情况下,使用postMessage
都需要在SomeServer端进行开发,而@SergikS似乎无法做到这一点。顺便说一句,postMessage
在EasyXDM中用作通信方式的一部分,我在下面的asnwer中提到过。@tkone:postMessage需要服务器端编程。但是你怎么能用postMessage上传文件呢!!有些服务器是vk,如果这更有意义的话。对于文件上载,它们首先提供可用的CDN服务器url,然后将文件上载到该url。它只接受图像/音频/视频,不接受html/js或其他内容。因此,我将回到配置nginx的初始问题。绕过php/tmp存储/curl将节省大量服务器资源,至少在