Замучался копать инет и решил написать вам, надеюсь поможете..
нашел скрипт подправил немного под себя:
<?php
$socket = fsockopen('tmptmp.ru', 80, $errno, $errstr, 30);
if(!$socket)die("$errstr($errno)");
//разделитель
$boundary = md5(uniqid(time()));//тупой набор символов
/*собираем часть с файлом:
сначала разделитель\r\n
со следующей строки заголовки\r\n
потом пустая строка\r\n
после чего сам файл\r\n
*/
$file = "--$boundary\r\n";
$file.= "Content-Disposition: form-data; name=\"myfile\"; filename=\"test.txt\"\r\n";
$file.= "Content-Type: text/plain\r\n\r\n";
$file.= file_get_contents('C:\\qwe\test.txt');// это файл у юзера на компе
$file.= "\r\n";
$file .= "--$boundary--\r\n";
$file .= "\r\n";
//пишем в сокет метод, URI и протокол
$headers = "POST /get.php HTTP/1.1\r\n";
//а также имя хоста
$headers .= "Host: tmptmp.ru\r\n";
//размер передаваемых данных передаем в заголовке
//Content-length
$headers .= "Content-length: ".strlen($file)."\r\n";
$headers .= "Content-Disposition: multipart/form-data; boundary=$boundary\r\n";
$headers .= "Connection: Close\r\n\r\n";
//передаем файл
$headers .= "$file";
fwrite($socket, $headers);
//теперь читаем и выводим ответ
$answer = '';
while(!feof($socket)){
$answer= fgets($socket, 4096);
echo $answer;
}
//закрываем сокет
fclose($socket);
?>
но сервак "denwer" выдает:
HTTP/1.1 200 OK
Date: Thu, 09 Feb 2012 06:56:55 GMT
Server: Apache/2.2.4 (Win32) mod_ssl/2.2.4 OpenSSL/0.9.8k PHP/5.3.3
X-Powered-By: PHP/5.3.3
Content-Length: 0
Connection: close
Content-Type: text/html; charset=windows-1251
Подскажите почему неработет? почему Content-Length: 0 ? плиз!..
Спустя 2 часа, 10 минут, 46 секунд (9.02.2012 - 11:21) sergeiss написал(а):
Цитата (Гость_Илья @ 9.02.2012 - 10:10) |
Подскажите почему неработет? почему Content-Length: 0 ? плиз!.. |
Сложно сказать... Может быть, Денвер "дурит"? У тебя же тут в переменную записывается не только содержимое файла, но и заголовки. Так что даже если файла и не будет, то все равно заголовки должны быть.
Попробуй сделать следующее.
1. Сразу же после создания переменной $file выведи её. Чтобы быть уверенным, что данные есть.
echo '<pre>'.$file.'</pre>'.strlen($file).'<br>';
2. Замени слэши
file_get_contents('C:/qwe/test.txt');
Ошибку это не должно давать, но просто будет более универсально - и для Винды, и для линуха.
3. К твоей проблеме не имеет отношения :) Но всё равно исправь:
//В такой ситуации кавычки не нужны!
$headers .= "$file";
// можно и нужна писать вот так, быстрее немного будет работать
$headers .= $file;
Спустя 19 минут, 18 секунд (9.02.2012 - 11:40) Гость_Илья написал(а):
Все это исправил никаких изменений
echo strlen($file); //выводит 174
echo strlen($file); //выводит 174
Спустя 17 минут, 20 секунд (9.02.2012 - 11:57) Guest написал(а):
gckt того как иправил кавычки на апострофы..
//размер передаваемых данных передаем в заголовке
//Content-length
$headers .= 'Content-length: '.strlen($file).'\r\n';
получилось вот что:
The requested resource
/get.php
does not allow request data with POST requests, or the amount of data provided in the request exceeds the capacity limit.
//размер передаваемых данных передаем в заголовке
//Content-length
$headers .= 'Content-length: '.strlen($file).'\r\n';
получилось вот что:
The requested resource
/get.php
does not allow request data with POST requests, or the amount of data provided in the request exceeds the capacity limit.
Спустя 9 минут, 35 секунд (9.02.2012 - 12:07) sergeiss написал(а):
Ну да, всё правильно :) Именно тут и "собака порылась" :)
Попробуй запустить этот код
и ты поймешь разницу между обработкой строк в одинарных и двойных кавычках. Я думаю, что полученное тобой при этом понимание позволит изменить код в правильную сторону.
Попробуй запустить этот код
$a='C:\\qwe\r\n\test.txt';
$b="C:\\qwe\r\n\test.txt";
$c="C:\\qwe\\r\\n\\test.txt";
echo "1:$a<br>2:$b<br>3:$c<br>";
и ты поймешь разницу между обработкой строк в одинарных и двойных кавычках. Я думаю, что полученное тобой при этом понимание позволит изменить код в правильную сторону.
Спустя 24 минуты, 40 секунд (9.02.2012 - 12:32) Guest написал(а):
чето я всерав но непонимаю где, как должно быть правильно..
Спустя 7 минут, 7 секунд (9.02.2012 - 12:39) Guest написал(а):
если тут меня ю на апострофы
//пишем в сокет метод, URI и протокол
$headers = "POST /get.php HTTP/1.1\r\n";
он зависает и выдает ошибку в этой строчке
$answer= fgets($socket, 4096);
//пишем в сокет метод, URI и протокол
$headers = "POST /get.php HTTP/1.1\r\n";
он зависает и выдает ошибку в этой строчке
$answer= fgets($socket, 4096);
Спустя 1 час, 7 минут, 7 секунд (9.02.2012 - 13:46) sergeiss написал(а):
Цитата (Guest @ 9.02.2012 - 13:32) |
чето я всерав но непонимаю где, как должно быть правильно.. |
Если ты запустишь мой код, то должен понять: в одном случае текст передается без изменений, в другом случае происходит замена "слэш+буква" на спецсимвол, в третьем случае для записи слэша в текстовую строку его надо "экранировать".
Похоже, что мою рекомендацию, данную ранее, ты не выполнил. А писал я про то, чтобы ты запустил ИМЕННО ЕЩЕ И ТАКОЙ КОД, НЕ ИЗМЕНЯЯ ЕГО:
echo '<pre>'.$file.'</pre>'.strlen($file).'<br>';
а потом надо посмотреть, что же там будет записано на самом деле. В т.ч. надо будет посмотреть через код страницы - фича доступна в любом браузере.
Спустя 10 минут, 54 секунды (9.02.2012 - 13:57) Guest написал(а):
да запустил я твой код вот что выдало
1:C:\qwe\r\n\test.txt
2:C:\qwe est.txt
3:C:\qwe\r\n\test.txt
всеравно мне не ясно как правильно у меня должно быть..
1:C:\qwe\r\n\test.txt
2:C:\qwe est.txt
3:C:\qwe\r\n\test.txt
всеравно мне не ясно как правильно у меня должно быть..
Спустя 1 минута, 41 секунда (9.02.2012 - 13:58) killer8080 написал(а):
Цитата (Гость_Илья @ 9.02.2012 - 08:10) |
$file.= file_get_contents('C:\\qwe\test.txt');// это файл у юзера на компе |
Не у юзера, а на сервере, где запущен этот скрипт
Цитата (Гость_Илья @ 9.02.2012 - 08:10) |
но сервак "denwer" выдает: HTTP/1.1 200 OK Date: Thu, 09 Feb 2012 06:56:55 GMT Server: Apache/2.2.4 (Win32) mod_ssl/2.2.4 OpenSSL/0.9.8k PHP/5.3.3 X-Powered-By: PHP/5.3.3 Content-Length: 0 Connection: close Content-Type: text/html; charset=windows-1251 Подскажите почему неработет? почему Content-Length: 0 ? плиз!.. |
Ноль, потому что после обработки пост данных, скрипт не выдал никакого контента. Обычно после этого делают редирект. Там случано не было заголовка Location?
Спустя 10 минут, 17 секунд (9.02.2012 - 14:09) Гость_Илья написал(а):
Вот что у меня на данный момент:
выдает:
HTTP/1.1 413 Request Entity Too Large Date: Thu, 09 Feb 2012 11:01:12 GMT Server: Apache/2.2.4 (Win32) mod_ssl/2.2.4 OpenSSL/0.9.8k PHP/5.3.3 Connection: close Content-Type: text/html; charset=iso-8859-1
Request Entity Too Large
The requested resource
/get.php
does not allow request data with POST requests, or the amount of data provided in the request exceeds the capacity limit.
--------------------------------------------------------------------------------
Apache/2.2.4 (Win32) mod_ssl/2.2.4 OpenSSL/0.9.8k PHP/5.3.3 Server at tmptmp.ru Port 80
1:C:\qwe\r\n\test.txt
2:C:\qwe est.txt
3:C:\qwe\r\n\test.txt
<?php
$socket = fsockopen("tmptmp.ru", 80, $errno, $errstr, 30);
if(!$socket)die('$errstr($errno)');
//разделитель
$boundary = md5(uniqid(time()));//тупой набор символов
/*собираем часть с файлом:
сначала разделитель\r\n
со следующей строки заголовки\r\n
потом пустая строка\r\n
после чего сам файл\r\n
*/
$file = '--$boundary\r\n';
$file.= "Content-Disposition: form-data; name=\'myfile\'; filename=\'test.txt\'\r\n";
$file.= "Content-Type: text/plain\r\n\r\n";
$file.= file_get_contents('C://qwe/test.txt');// это файл у юзера на компе
$file.= "\r\n";
$file .= "--$boundary--\r\n";
$file .= "\r\n";
//пишем в сокет метод, URI и протокол
$headers = "POST /get.php HTTP/1.1\r\n";
//а также имя хоста
$headers .= "Host: tmptmp.ru \r\n";
//размер передаваемых данных передаем в заголовке
//Content-length
$headers .= 'Content-length: '.strlen($file).'\r\n';
$headers .= "Content-Disposition: multipart/form-data; boundary=$boundary\r\n";
$headers .= "Connection: Close\r\n\r\n";
//передаем файл
$headers .= $file;
fwrite($socket, $headers);
//теперь читаем и выводим ответ
$answer = '';
while(!feof($socket)){
$answer= fgets($socket, 4096);
echo $answer;
}
//закрываем сокет
fclose($socket);
$a='C:\\qwe\r\n\test.txt';
$b="C:\\qwe\r\n\test.txt";
$c="C:\\qwe\\r\\n\\test.txt";
echo "1:$a<br>2:$b<br>3:$c<br>";
?>
выдает:
HTTP/1.1 413 Request Entity Too Large Date: Thu, 09 Feb 2012 11:01:12 GMT Server: Apache/2.2.4 (Win32) mod_ssl/2.2.4 OpenSSL/0.9.8k PHP/5.3.3 Connection: close Content-Type: text/html; charset=iso-8859-1
Request Entity Too Large
The requested resource
/get.php
does not allow request data with POST requests, or the amount of data provided in the request exceeds the capacity limit.
--------------------------------------------------------------------------------
Apache/2.2.4 (Win32) mod_ssl/2.2.4 OpenSSL/0.9.8k PHP/5.3.3 Server at tmptmp.ru Port 80
1:C:\qwe\r\n\test.txt
2:C:\qwe est.txt
3:C:\qwe\r\n\test.txt
Спустя 7 минут, 44 секунды (9.02.2012 - 14:16) Guest написал(а):
Это Get.php:
<?php
// Загрузка файлов на сервер
// Если register_globals=Off
// Если upload файла
if(isset($_FILES["myfile"]))
{ echo ("проверка");
$myfile = $_FILES["myfile"]["tmp_name"];
$myfile_name = $_FILES["myfile"]["name"];
$myfile_size = $_FILES["myfile"]["size"];
$myfile_type = $_FILES["myfile"]["type"];
$error_flag = $_FILES["myfile"]["error"];
// Если ошибок не было
if($error_flag == 0)
{
print("Имя файла на нашем сервере (во время запроса): ".$myfile."<br>");
print("Имя файла на компьютере пользователя: ".$myfile_name."<br>");
print("MIME-тип файла: ".$myfile_type."<br>");
print("Размер файла: ".$myfile_size."<br><br>");
$catalog = $myfile_name;
copy($myfile, $catalog);
// Получаем содержимое файла
$fp = fopen($myfile,"r");
$content = fread($fp, filesize($myfile));
fclose($fp);
// Вывод содержимого файла
//print($content);
} // end of if 2
} // end of if 1
?>
Спустя 51 секунда (9.02.2012 - 14:17) killer8080 написал(а):
Гость_Илья
1 какой размер файла?
2 возможно проблемы с заголовком Content-Length, размер тела запроса должен быть корректно сформирован.
3 попробуй этот вариант.
1 какой размер файла?
2 возможно проблемы с заголовком Content-Length, размер тела запроса должен быть корректно сформирован.
3 попробуй этот вариант.
Спустя 1 минута, 13 секунд (9.02.2012 - 14:18) Guest написал(а):
размер 4 kb
Спустя 1 минута, 18 секунд (9.02.2012 - 14:20) killer8080 написал(а):
Guest
подожди. Там что сервер сам себе отправляет файл через пост?
подожди. Там что сервер сам себе отправляет файл через пост?
![blink.gif](http://phpforum.ru/html/emoticons/blink.gif)
Спустя 15 минут, 54 секунды (9.02.2012 - 14:36) Guest написал(а):
ну на моем компе стоит денвер пытаюсь отправить файл на сайт
Спустя 1 минута, 44 секунды (9.02.2012 - 14:37) Guest написал(а):
как бы да комп один и тотже
Спустя 20 минут, 22 секунды (9.02.2012 - 14:58) Guest написал(а):
Fatal error: Maximum execution time of 30 seconds exceeded in Z:\home\tmptmp.ru\www\index.php
Спустя 32 минуты, 57 секунд (9.02.2012 - 15:31) killer8080 написал(а):
Цитата (Guest @ 9.02.2012 - 13:37) |
как бы да комп один и тотже |
А смысл? Ну так отправлял бы файл через форму.