Перенаправить POST-запрос и сохранить данные. Возможный? - PullRequest
2 голосов
/ 09 апреля 2011

Моя проблема проста. Мне нужно загрузить файл напрямую на правильный сервер (который в настоящее время имеет низкую рабочую нагрузку).

Поэтому я делаю:

<?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.

Похоже, что запрос преобразуется в запрос get при перенаправлении с использованием заголовка location. Все почтовые данные потеряны.

Это невозможно или я делаю это неправильно? И да, я рассмотрел удаленный динамический 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) {
}

Ответы [ 4 ]

3 голосов
/ 09 апреля 2011

Если вы действительно хотите балансировать нагрузку с помощью кода, одновременно потенциально кэшируя страницу с помощью формы загрузки, сначала выберите сервер загрузки по умолчанию (url);затем onSubmit позвоните на сервер и найдите лучшую цель загрузки и соответственно измените атрибут действия.

С помощью этого метода пользователи, которые не активируют JS, по-прежнему получают то, что им нужно, пользователи с включенной JS получают лучшую цель загрузки, и вы все еще можете кэшировать.Кроме того, время запроса кеша потенциально может быть более подходящим, поскольку запрос URL будет происходить незадолго до фактической загрузки.

Единственным препятствием будет вызов для получения URL, который можно упростить.производительность мелодия (я представляю), чем процесс, который вы описываете выше.Загрузка файла дважды с помощью директивы заголовка и / или вызова cURL не кажется хорошим компромиссом для кэширования одного HTML-файла, IMO.Но я тоже не знаю, с чем вы столкнулись.

Если вы не хотите интенсивно администрировать серверную среду и вводить балансировку нагрузки, я бы предложил этот вариант.

Обратите внимание, я также не являюсь администратором сервера по профессии.

2 голосов
/ 09 апреля 2011

Вы можете попытаться вернуть код 302 (временно перемещенный), но не 100%, который позволил бы вашему браузеру публиковать данные на измененном URL-адресе, но стоит кое-что проверить.

[Редактировать]

Согласно этой статье википедии данные POST будут преобразованы в GET, что, вероятно, не будет работать для загрузки файла.

1 голос
/ 09 апреля 2011

Это не хорошее решение. Файл будет загружен полностью до того, как скрипт PHP будет запущен. Это означает, что если вам удастся выполнить то, что вы пытаетесь сделать, клиенту придется загрузить файл дважды!

Я рекомендую вам попытаться выяснить, на какой сервер отправлять запрос при создании формы, чтобы атрибут действия в теге формы указывал непосредственно на менее загруженный компьютер.

Или даже лучше: используйте серверный балансировщик нагрузки и сделайте свою HTTP-инфраструктуру прозрачной для браузера. По сути, это проблема системного администратора.

0 голосов
/ 09 апреля 2011

я могу ошибаться, но .. действие вашей формы указывает на ?action=target и в вашем rest.php вы делаете заголовок для "?action=test" ну, конечно, вы не найдете ни $ POST, ни ваши $ FILES! ... aheader() не отправляет эти переменные ..

, если вы хотите отправить свое сообщение и файл в другое место, вам нужно использовать библиотеку cUrl .. но это небыть легким:)

Удачи

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...