我的问题很简单。我需要将文件直接上传到正确的服务器(目前工作负载较低)。
因此我做:
<?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"...
此网址应该重定向到“真正的”服务器。
所以上传页面不会减慢加载速度,我有静态HTML代码,我可以缓存,嵌入等......
问题是,这对于get请求很好,但不适用于post请求。
使用location头重定向时,请求似乎会转换为get请求。所有帖子数据都将丢失。
这是不可能的还是我做错了?是的,我考虑了一个远程动态JavaScript,它首先用正确的服务器打印html代码。我宁愿不这样做......
任何想法? Maby替代uplod技术?
编辑:
这是我使用的确切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) {
}
答案 0 :(得分:3)
如果您真的希望通过代码加载余额,同时可能使用上传表单缓存页面,请先选择默认下载服务器(url);然后,onSubmit调用服务器并找到最佳上传目标并相应地调整action属性。
使用此方法,不激活JS的用户仍然可以获得他们想要的内容,启用了JS的用户可以获得更好的上载目标,并且您仍然可以缓存。此外,缓存请求的时间可能更具机会性,因为URL请求将在实际上载之前不久发生。
唯一的障碍是获取URL的调用,您可以比上面描述的过程更容易地进行性能调整(我想象)。通过头指令和/或cURL调用两次上传文件似乎不是缓存单个html文件IMO的良好权衡。但我也不知道你的反对意见。
如果您不想大量管理服务器环境并引入负载平衡,这是我建议的选项。
另请注意,我不是交易服务器管理员。
答案 1 :(得分:2)
您可以尝试返回代码302(临时移动),而不是100%会让您的浏览器将数据发布到更改后的网址,但是值得查看。
[编辑]
根据this wikipedia article,POST数据将转换为GET,这可能不适用于文件上传。
答案 2 :(得分:1)
这不是一个好的解决方案。在PHP脚本启动之前,文件将完整地上传到文件中。这意味着如果您成功完成了尝试,客户端必须上传文件两次!
我建议您在创建表单时尝试确定将请求发送到哪个服务器,因此表单标记中的action属性将直接指向较少加载的计算机。
甚至更好:使用服务器端负载均衡器并使您的HTTP基础架构对浏览器透明。这本质上是一个系统管理员问题。
答案 3 :(得分:0)
我可能错了,但是......你的表格的动作指向?action=target
,而你的rest.php你会对"?action=test"
做一个标题,当然你不会找到你的$ POST或你的$ FILES! ...... header()
不会发送这些变量..
如果您想将帖子和文件发送到不同的位置,则需要使用cUrl library ..但这并不容易:)
祝你好运