Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File upload 从浏览器将文件上载到其他域的最佳方式是什么?_File Upload_Nginx_Cross Domain_Same Origin Policy_Vk - Fatal编程技术网

File upload 从浏览器将文件上载到其他域的最佳方式是什么?

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

我正在为一些社交网络创建一个定期发布的web服务。
需要帮助处理高流量下的文件上传

流程概述:

  • 用户将文件上传到SomeServer(不是我的)
  • SomeServer然后用JSON字符串响应
  • 我的web应用程序应该存储JSON响应
选项1:保存、卷发、删除tmp
我做这件事的愚蠢方式:

  • 用户上传文件到MyWebApp
  • MyWebApp将文件进一步发送到SomeServer,获取响应
  • 选项2:JS magic
    完美的智能方式:

  • 用户从iFrame中直接将文件上传到SomeServer
  • MyWebApp通过JavaScript获得响应
  • 但由于“同一原产地政策”,这是不可能的,不是吗

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

  • 用户上传文件到MyWebApp
  • nginx拦截上传的文件并直接发送到SomeServer
  • JSON响应也被nginx截获并由MyWebApp处理

  • 这有什么意义吗?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将节省大量服务器资源,至少在