[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Загрузка файла на сервер методом Post
Гость_Илья
Здравствуйте профессионалы!

Замучался копать инет и решил написать вам, надеюсь поможете..

нашел скрипт подправил немного под себя:
<?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

Спустя 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.

Спустя 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);

Спустя 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 минута, 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) Гость_Илья написал(а):
Вот что у меня на данный момент:
<?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 минута, 13 секунд (9.02.2012 - 14:18) Guest написал(а):
размер 4 kb

Спустя 1 минута, 18 секунд (9.02.2012 - 14:20) killer8080 написал(а):
Guest
подожди. Там что сервер сам себе отправляет файл через пост? 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)
как бы да комп один и тотже

А смысл? Ну так отправлял бы файл через форму.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.