可以从客户端上传文件';s机器连接到托管表单的Web服务器外部的服务器


Possible to upload a file from client's machine to a server that is external to the webserver hosting the form?

要设置场景,有三台机器:(1)客户端的机器,(2)Web服务器,(3)和文件存储服务器。这三台机器不在同一局域网内,也不在同一域内。Web服务器运行的是带有PHP的Apache,存储服务器也运行带有PHP的IIS7。

我有一个网页——托管在网络服务器上——其中包含一个文件上传模块。当用户从该网页上传文件时,我希望该文件直接存储在存储服务器上,而不是网络服务器本身。我希望避免通过cURL或类似"scp"的系统级命令将文件从Web服务器传输到存储服务器,因为这似乎是在浪费网络资源和用户的时间。

这可能安全地实现吗?建议实现什么?

我确实在GitHub上通过blueimp找到了一个很好的多文件上传器,可以进行跨域上传,但在遵循设置跨域上传的指示后,我从浏览器的调试控制台收到了一个错误,内容是:

XMLHttpRequest无法加载http://storageserver.com/scripts/process_uploads.php。访问控制允许来源不允许来源http://webserver.com

虽然我意识到这不是最安全的代码,但出于故障排除的目的,我在process_uploads.php脚本中添加了以下内容:

标头("访问控制-允许原始:*");

为了澄清起见,以下是我编写jQuery File Upload插件解析的表单元素的方式:

<form id="fileupload" action="http://storageserver.com:8080/scripts/process_uploads.php" method="POST" enctype="multipart/form-data">

有人成功实现跨域文件上传吗?如果是这样的话,你能为什么可能是一个稳健的解决方案提供一些启示吗。

我建议您购买一台时间机器,它可以追溯到几年前,当时网络是一个更信任的地方,浏览器无法抵御这种情况。跨域规则似乎每隔几个月就会发生变化。如果可以的话,你最好避开那罐虫子。

我看到两种选择,都不太好。毫无疑问还有更多。

首先:将表单提交到您的文件服务器,并让它将表单提交给您的web服务器

这(当然在很大程度上)取决于两个服务器之间的可靠连接。您说过不想将文件从web服务器复制到文件管理器。因此,请改用其他方式移动数据。与向另一个方向复制文件相比,表单中的几个字节的命中率会更低。因此,将整个表单提交到文件服务器,并让PHP表单处理程序将非文件部分(包括源IP和会话标识符)提交到web服务器。您甚至不需要将表单数据存储在文件管理器上,只需让它将web服务器的结果中继回浏览器即可。在设计时,不要忘记考虑身份验证和安全性。

第二:使用JavaScript或Flash上传两个表单

将非文件表单内容放在一个表单中,将文件放在另一个表单。捕获一个表单的Submit,并让它提交另一个表格(到另一个服务器)。这是一个糟糕的解决方案,因为它依赖于浏览器上的JavaScript,而这并不总是存在的。(你可以通过要求它来破坏你的网站,但我不建议这样做。)由于你已经在使用jQuery,你可能可以自己找到解决方案。

我不知道你在Flash中会怎么做,但我相信这是可能的。我同样确信你不应该在Flash中这样做。Fie专注于所有闭源的"web"技术。始终使用开放式工具。

这就是我的全部。但我是系统管理员。我很想看看其他人有什么想法。