|
|
|
| Подскажите пожалуйста код, отправляющий сокетом на удаленный сервер файл принятый из формы на сайте.
Форма:
<form action="stena.php" method="POST" enctype="multipart/form-data">
<input type="hidden" name="act" value="save_photo">
<input style="background: white; color:black;" type="file" name="up_photo"></td>
Название фотографии:
<input name="txText" size="20"></td>
Автор:
<input style="background: white; color:black;" type="text" name="sAvtor" size="20"></td>
<input type="submit" value="Повесить">
|
Перерерыл кучу примеров здесь на форуме, но адаптировать не выходит никак. | |
|
|
|
|
|
|
|
для: Loneliness
(21.06.2008 в 01:58)
| | В чем проблема, что и как пробовали - примеры дайте? | |
|
|
|
|
|
|
|
для: mihdan
(21.06.2008 в 02:25)
| | Пробовал так:
$host = 'www.host.ru';
$port = 80;
$path = '/stena.php';
$file_name = $_FILES['userfile']['name']; // the file
$tmp_name = $_FILES['userfile']['tmp_name']; // the file
$content_type = $_FILES['userfile']['type']; // the file mime type
$value = "";
srand((double)microtime()*1000000);
$boundary = "---------------------".substr(md5(rand(0,32000)),0,10);
// Build the header
$header = "POST $path HTTP/1.0\r\n";
$header .= "Host: $host\r\n";
$header .= "Content-type: multipart/form-data, boundary=$boundary\r\n";
// and attach the file
$data .= "--$boundary\r\n";
$content_file = join("", file($tmp_name));
$data .="Content-Disposition: form-data; txText=$txText&sAvtor=$sAvtor&act=$act&up_photo=$up_photo\r\n";
$data .= "Content-Type: $content_type\r\n\r\n";
$data .= "".$content_file."\r\n";
$data .="--$boundary--\r\n";
$header .= "Content-length: " . strlen($data) . "\r\n\r\n";
// Open the connection
$fp = fsockopen($host, 80);
// then just
fputs($fp, $header.$data);
$line = "";
while (!feof($fp))
{
$line .= fgets($fp, 1024);
}
fclose($fp);
|
Но явно что-то недоправил как надо, не загружает файлы.Как правильно переделать это конкретно под мою форму? | |
|
|
|
|
|
|
|
для: Loneliness
(21.06.2008 в 02:29)
| | Форму покажите полностью.
Сейчас у Вас в отправке мешанина. Часть полей упакована как application/x-www-urlencoded, в то же время идут попытки создать некое подобие multipart/formdata . Чего, однозначно, в одном запросе быть не должно. | |
|
|
|
|
|
|
|
для: Trianon
(21.06.2008 в 12:15)
| | Это вся форма
<form action="stena.php" method="POST" enctype="multipart/form-data">
<input type="hidden" name="act" value="save_photo">
<input style="background: white; color:black;" type="file" name="up_photo"></td>
Название фотографии:
<input name="txText" size="20"></td>
Автор:
<input style="background: white; color:black;" type="text" name="sAvtor" size="20"></td>
<input type="submit" value="Повесить">
|
Как мне ее правильно передать? | |
|
|
|
|
|
|
|
для: Loneliness
(21.06.2008 в 12:45)
| | Вся форма завершается тегом </form>
Как-то так.
Content-Type: multipart/form-data; boundary=--separator
Content-Length: длина-тела-запроса
----separator
Content-Disposition: form-data; name="act"
save_photo
----separator
Content-Disposition: form-data; name="up_photo"; filename="1234.jpg"
Content-Type: application/octet-stream
[тело
фотографии]
----separator
Content-Disposition: form-data; name="txText"
Название фотографии
----separator
Content-Disposition: form-data; name="sAvtor"
Author
----separator--
|
| |
|
|
|
|
|
|
|
для: Trianon
(21.06.2008 в 13:06)
| | Туплю, возможно, но как-то легче не стало... | |
|
|
|
|
|
|
|
для: Trianon
(21.06.2008 в 13:06)
| | Пробую так:
if($act == save_photo)
{
$pu = parse_url( 'http://host.ru/stena.php' );
$port = isset($pu['port']) ? $pu['port'] : 80;
$path = isset($pu['path']) ? $pu['path'] : '/';
$path = isset($pu['query']) ? $path . '?' . $pu['query'] : $path;
$host = $pu['host'];
$file_name = $_FILES['userfile']['name']; // the file
$tmp_name = $_FILES['userfile']['tmp_name']; // the file
$content_type = $_FILES['userfile']['type']; // the file mime type
function random_string($len)
{
$chrs = 'AaBbCcDdEeFf0123456789';
for($s = '', $i = 0; $i < $len; $i++)
{
$s .= $chrs[rand(0, strlen($chrs) - 1)];
}
return $s;
}
$fp = fsockopen($host, $port, $errno, $errstr, 10) or die();
$data = "";
$data .= "--separator\r\n";
$data .= "Content-Disposition: form-data; name='txText'\r\n\r\n";
$data .= "$txText\r\n";
$data .= "--separator\r\n";
$data .= "Content-Disposition: form-data; name='sAvtor'\r\n\r\n";
$data .= "$sAvtor\r\n";
$data .= "--separator\r\n\r\n";
$data .= "--separator\r\n";
$data .= "Content-Disposition: form-data; name='up_photo'; filename=''.$file_name.''\r\n";
$data .= "Content-Type: application/octet-stream \r\n";
$data .= "--separator--\r\n\r\n";
$headers[] = 'POST ' . $path . ' HTTP/1.0';
$headers[] = 'Host: ' . $host;
$headers[] = 'User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; ru) Opera 8.01';
$headers[] = 'Content-type: multipart/form-data; boundary=' . $boundary;
$headers[] = 'Content-Length: ' . strlen($data);
if($fp)
{
fwrite($fp, implode("\r\n", $headers) . "\r\n" . $data);
while(!feof($fp)) echo fread($fp, 1024);
fclose($fp);
}
}
|
Пишет ответ сервера: .........
Bad Request
Your browser sent a request that this server could not understand.
Request header field is missing ':' separator.
--separator
Что не так, подскажите? | |
|
|
|
|
|
|
|
для: Loneliness
(21.06.2008 в 20:44)
| | 1. $boundary Всё же имеет смысл а) вычислить и б) указать в качестве separator, как сделано у Вас в исходном варианте.
2. Вместо кавычек в content-disposition ... filename= у Вас почему-то стоят пары апострофов.
3. содержимое файла Вы куда-то подевали.
$data .= "--$boundary\r\n";
$data .= "Content-Disposition: form-data; name='up_photo'; filename=\"$file_name\"\r\n";
$data .= "Content-Type: application/octet-stream \r\n\r\n";
$data .= "$content_file\r\n";
$data .= "--$boundary--\r\n\r\n";
|
В исходном варианте оно у Вас читалось конструкцией $content_file = join("", file($tmp_name));
4. Между полями sAvtor и up_photo затесалась какая-то пустая секция.
Общий совет. Чем терроризировать через fsockopen чужой сервер кривыми запросами, лучше сперва выводите весь запрос в файл. Или хотя бы на экран. Когда отладите формирование запроса - вернете fsockopen.
Как выглядят HTTP-запросы, можно поглядеть через httpheaders-плагины к браузеру - если лениво изучать документацию. | |
|
|
|
|
|
|
|
для: Trianon
(21.06.2008 в 21:27)
| | В том и дело, что я уже до того затерроризировал своими кривыми запросами не менее кривой скрипт на удаленном сервере, что затер каким-то образом начисто все сообщения с их гребаной доски... :-( Если так продолжится, я скоро вообще сайт им в даун вынесу нечаянно своими запросами.. | |
|
|
|
|
|
|
|
для: Loneliness
(21.06.2008 в 23:20)
| | Что ж... Вы, похоже, человек редких талантов :)
Доиграетесь до того, что Ваш ip просто напросто забанят.
Какой смысл использовать в качестве тестера сервер, если то же самое можно сделать собственными глазами. И ошибки так определятся куда быстрей. | |
|
|
|
|
|
|
|
для: Trianon
(21.06.2008 в 23:32)
| | Дело прошлое, я настолько слабо представляю себе правильный HTTP запрос в данном случае, что визуально долго буду понимать, что к чему. Остается старый-добрый метод тыка. Да и пусть банят тестовый сервер, еще есть в запасе пару хостов, и окончательный вариант буду через анонимайзер делать.
С другой стороны, им и смысла меня банить нет- я им от себя буду визуальное движение в чате значительно оживлять своими пользователями, медиа базу их чата пополнять будут дополнительно также мои пользователи...
В общем, Enjoy полнейший для обеих сторон.
Единственное, что из-за моих навредивших запросов, может решат что я им бяку делаю...:( | |
|
|
|
|
|
|
|
для: Trianon
(21.06.2008 в 21:27)
| |
$host = 'host.ru';
$path = '/stena.php';
$file_name = $_FILES['userfile']['name']; // the file
$tmp_name = $_FILES['userfile']['tmp_name']; // the file
$content_type = $_FILES['userfile']['type']; // the file mime type
$content_file = join("", file($tmp_name));
srand((double)microtime()*1000000);
$boundary = "---------------------".substr(md5(rand(0,32000)),0,10);
$fp = fsockopen($host, 80) or die();
$data = "";
$data .= "--$boundary";
$data .= "Content-Disposition: form-data; name='txText'\r\n\r\n";
$data .= "$txText\r\n";
$data .= "--$boundary\r\n";
$data .= "Content-Disposition: form-data; name='sAvtor'\r\n\r\n";
$data .= "$sAvtor\r\n";
$data .= "--$boundary\r\n";
$data .= "Content-Disposition: form-data; name='act'\r\n\r\n";
$data .= "$act\r\n";
$data .= "--$boundary\r\n\r\n";
$data .= "Content-Disposition: form-data; name='up_photo'; filename="$file_name"\r\n";
$data .= "Content-Type: application/octet-stream\r\n";
$data .= "$content_file\r\n";
$data .= "--$boundary--\r\n\r\n";
$header = "POST $path HTTP/1.0\r\n";
$header .= "Host: $host\r\n";
$header .= "Content-type: multipart/form-data, boundary=$boundary\r\n";
$header .= 'User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; ru) Opera 8.01';
$header .= 'Content-Length: ' . strlen($data);
if($fp)
{
fwrite($fp,$header.$data);
$line="";
while(!feof($fp)) echo fread($fp, 1024);
fclose($fp);
}
|
Так правильно будет? И скажите, выделенная жирным часть кода $header .= 'Content-Length: ' . strlen($data); правильно построена, Не нужно ли в этот заголовок и размер файла вписывать как либо? Заранее благодарю. | |
|
|
|
|
|
|
|
для: Loneliness
(21.06.2008 в 23:32)
| | Всё-таки лучше заменить апострофы на кавычки:
> $data .= "Content-Disposition: form-data; name=\"txText\"\r\n\r\n";
и т.д. В документации про апострофы вроде ничего не сказано. Хотя вполне возможно, что с большинством серверов работать будет и так. Но расчитывать на такое не стоит. | |
|
|
|
|
|
|
|
для: mihdan
(21.06.2008 в 02:25)
| | На последний вариант кода их сервер реагирует нормально вроде, строкой:
HTTP/1.1 200 OK Date: Sat, 21 Jun 2008 19:45:14 GMT Server: Apache/2.0.54 (Linux/SUSE) X-Powered-By: PHP/4.4.0 Content-Length: 6333 Connection: close Content-Type: text/html
Однако помимо этого выдает ошибку:
Warning: join() [function.join]: Invalid arguments passed in /home/loneliness/domains/..../public_html//stena.php on line 86
В чем может причина скрываться? Какова вообще структура функции join? Как она работает? | |
|
|
|
|
|
|
|
для: Loneliness
(21.06.2008 в 10:56)
| | > Warning: join() [function.join]: Invalid arguments passed in /home/loneliness/domains/..../public_html//stena.php on line 86
> В чем может причина скрываться? Какова вообще структура функции join? Как она работает?
Только на join() выдаёт ошибку? Странно. По идее, если file() не может получить содержимое файла, то тоже генерирует ошибку типа Warning.
В любом случае, замените это на $content_file = file_get_contents($tmp_name); | |
|
|
|
|
|
|
|
для: BinLaden
(22.06.2008 в 01:00)
| | Запрос наконец таки принял успешно, несмотря на апострофы, в принципе, но поменял на кавычки.
Вот до чего докодился:
$host = 'host.ru';
$path = '/stena.php';
$file_name = $_FILES['up_photo']['name']; // the file
$tmp_name = $_FILES['up_photo']['tmp_name']; // the file
$content_type = $_FILES['up_photo']['type']; // the file mime type
$content_file = file_get_contents($tmp_name);
srand((double)microtime()*1000000);
$boundary = "---------------------".substr(md5(rand(0,32000)),0,10);
$fp = fsockopen($host, 80) or die();
$data = "";
$data .= "--$boundary\r\n";
$data .= "Content-Disposition: form-data; name='txText'\r\n\r\n";
$data .= "$txText\r\n";
$data .= "--$boundary\r\n";
$data .= "Content-Disposition: form-data; name=\"sAvtor\" \r\n\r\n";
$data .= "$sAvtor\r\n";
$data .= "--$boundary\r\n";
$data .= "Content-Disposition: form-data; name=\"act\"\r\n\r\n";
$data .= "$act\r\n";
$data .= "--$boundary\r\n";
$data .= "Content-Disposition: form-data; name=\"up_photo\"; filename='"$file_name\r\n";
$data .= "Content-Type: $content_type\r\n";
$data .= "$content_file\r\n";
$data .= "--$boundary--\r\n";
$content_lenght = strlen($data);
$header = "POST $path HTTP/1.0\r\n";
$header .= "Host: $host\r\n";
$header .= "Content-type: multipart/form-data, boundary=$boundary\r\n";
$header .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; ru) Opera 8.01\r\n";
$header .= "Content-Length: $content_lenght\r\n\r\n";
if($fp)
{
fwrite($fp,$header.$data);
$line="";
while(!feof($fp)) echo fread($fp, 1024);
fclose($fp);
}
|
Получаю в ответ Ошибка! Неподдерживаемый тип файла Хотя та же фота напрямую из формы на удаленном сервере загружается нормально. В чем косяк у меня? | |
|
|
|
|
|
|
|
для: Loneliness
(22.06.2008 в 01:29)
| |
$data .= "--$boundary\r\n";
$data .= "Content-Disposition: form-data; name=\"up_photo\"; filename=\"$file_name\"\r\n";
$data .= "Content-Type: $content_type\r\n\r\n";
$data .= "$content_file\r\n";
$data .= "--$boundary--\r\n";
|
| |
|
|
|
|
|
|
|
для: Trianon
(22.06.2008 в 13:21)
| | Великолепно!!! Огромное спасибо за посильную помощь в моем немного черном деле внедрения в чужой чат. Обещаю не использовать во вред.
P.S Теперь формы сокетами отправлять умею точно :) | |
|
|
|