我的问题很简单。我需要将文件直接上传到正确的服务器(目前工作负载较低)。
所以我做:
<?php
$server = file_get_contents('http://my-api.com/upload-server.php'); // returns url
?>
然后像
一样打印表单<form method="post" action="<?php echo $server; ?>"...
现在我想把这一步移到上传开始时,像这样:
<form method="post" action="http://my-api.com/upload-gateway.php"...
这个url应该重定向到真正的服务器。
所以上传页面不会减慢加载速度,我有静态的html代码,我可以缓存,嵌入等…
问题是,这与get请求工作得很好,但不与post请求。
当使用location头重定向时,请求似乎被转换为get请求。所有post数据将丢失。
这是不可能的还是我做错了?是的,我考虑了一个远程动态javascript,它首先用正确的服务器打印html代码。我宁愿不那样做。
任何想法?也许有其他的上传技术?
编辑:这是我使用的确切的HTML代码:
<form method='post' enctype='multipart/form-data' action='http://storage.ivana.2x.to/rest.php?action=target'>
<input type=hidden name=testfield value="test">
File to upload: <input type=file name=upfile><br>
Notes about the file: <input type=text name=note><br>
<br>
<input type=submit value=Press> to upload the file!
</form>
这是我使用的重定向代码:
if($_GET["action"] == "target") {
header("Location: http://storage.ivana.2x.to/rest.php?action=test");
}
这是我用来查看结果的输出代码:
if($_GET["action"] == "test") {
echo "<pre>";
var_dump($_POST);
var_dump($_GET);
var_dump($_FILES);
}
上传小文件的结果如下:
array(0) {
}
array(1) {
["action"]=>
string(4) "test"
}
array(0) {
}
如果您真的想通过代码实现负载平衡,同时可能会缓存带有上传表单的页面,请首先选择默认下载服务器(url);然后,onSubmit调用服务器,找到最佳上传目标,并相应地调整action属性。
使用此方法,未激活JS的用户仍然可以获得他们想要的,启用JS的用户可以获得更好的上传目标,并且您仍然可以缓存。此外,缓存请求的时间可能更有机会,因为URL请求将在实际上传之前不久发生。
唯一的障碍将是获取URL的调用,与您上面描述的过程相比,您可以更容易地对其进行性能调整(我认为)。在我看来,通过头指令和/或cURL调用上传文件两次似乎不像是缓存单个html文件的一个很好的权衡。但我也不知道你面对的是什么。
如果您不想大量管理服务器环境并引入负载平衡,那么我建议您使用此选项。
您可以尝试返回代码302(临时移动),而不是100%,这会让您的浏览器将数据发布到更改后的url,但这是值得检查的东西。
[编辑]根据这篇维基百科文章,POST数据将被转换为GET,这可能不适用于文件上传。
这不是一个好的解决方案。该文件将在PHP脚本启动之前完整地上传。这意味着,如果您成功地完成了您尝试做的事情,客户端将不得不上传文件两次!
我建议您在创建表单时尝试找出将请求发送到哪台服务器,因此表单标记中的action属性将直接指向加载较少的机器。
或者更好:使用服务器端负载均衡器,使您的HTTP基础设施对浏览器透明。
我可能错了,但是…你的表单的动作点到?action=target
和在你的rest.php你做一个标题到"?action=test"
当然你不会找到你的$POST或$FILES!a header()
不发送这些变量..
如果你想把你的帖子和文件发送到另一个位置,你需要使用cUrl库。但这并不容易:)
好运