重定向POST请求并保留数据。可能?

时间:2011-04-09 13:50:36

标签: php html http redirect file-upload

我的问题很简单。我需要将文件直接上传到正确的服务器(目前工作负载较低)。

因此我做:

<?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) {
}

4 个答案:

答案 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 ..但这并不容易:)

祝你好运