• Главная
  • » PHP
  • » Нужно передать файл методом пост на другой хост

#1 2009.12.01 00:54

TLENS
Moderator
Откуда: Украина
Зарегистрирован: 2009.04.05
Сообщений: 2402
Карма: 14
Профиль

Нужно передать файл методом пост на другой хост

Управится ли с етим курл если файл может весить до 200 мб. Или лутше использовать fsockopen?
но я В fsoockopen мало шарю если кому не трудно дайте шаблон.

Неактивен

#2 2009.12.01 11:53

Gemorroj
Administrator
Откуда: Белоруссия
Зарегистрирован: 2007.11.03
Сообщений: 6593
Карма: 107
Профиль Веб-сайт

Re: Нужно передать файл методом пост на другой хост

справится конечно. fsockopen как раз менее надежен.

Неактивен

#3 2009.12.03 16:15

TLENS
Moderator
Откуда: Украина
Зарегистрирован: 2009.04.05
Сообщений: 2402
Карма: 14
Профиль

Re: Нужно передать файл методом пост на другой хост

Вчем проблема написано что загружено но файла нет может проблема з заголовками?
Вот исходник:

Код:

1
span style="color: #0000BB"><?php$f1=file_get_contents('photo.jpg');$header[]='Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5';$header[]='Connection: Keep-Alive';$header[]='Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1';$header[]='Accept-Language: ru-RU,ru;q=0.9,en;q=0.8';$header[]='User-Agent: '.$_SERVER['HTTP_USER_AGENT'];$curl=curl_init(); $post='code=96950347&sid=xxx&id=0&f1='.$f1.'&upload=загрузить';curl_setopt($curl,CURLOPT_POST, true);curl_setopt($curl,CURLOPT_POSTFIELDS,$post);curl_setopt($curl, CURLOPT_URL,'http://xxx.xx/upload/index.php?');curl_setopt($curl,CURLOPT_HTTPHEADER,$header);curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);curl_setopt($curl,CURLOPT_HEADER,true);$get=curl_exec($curl); curl_close($curl);echo $get;

и форма приема:

Код:

1
lt;?<form method="post" action="/upload/index.php" enctype="multipart/form-data"><input type="hidden" name="code" value="96950347"><input type="hidden" name="id" value="0"><input type="hidden" name="sid" value="xxx"><input type="file" name="f1" size="12"><input type="submit" name="upload" value="загрузить"></form>

Отредактировано TLENS (2009.12.03 16:16)

Неактивен

#4 2009.12.03 17:39

Gemorroj
Administrator
Откуда: Белоруссия
Зарегистрирован: 2007.11.03
Сообщений: 6593
Карма: 107
Профиль Веб-сайт

Re: Нужно передать файл методом пост на другой хост

в данном коде ты даже не пытаешся отправить файл.
http://www.php.net/manual/en/function.curl-setopt.php
пример номер 2.

Неактивен

#5 2009.12.04 13:40

TLENS
Moderator
Откуда: Украина
Зарегистрирован: 2009.04.05
Сообщений: 2402
Карма: 14
Профиль

Re: Нужно передать файл методом пост на другой хост

Спасибо большое разобрался

Неактивен

#6 2010.01.24 01:34

TLENS
Moderator
Откуда: Украина
Зарегистрирован: 2009.04.05
Сообщений: 2402
Карма: 14
Профиль

Re: Нужно передать файл методом пост на другой хост

А можно как нибуть отправить файл сидящий в переменной или например с отрытого соединение fopen('http://site.ru/film.avi','r');
Ато фильм весит 700мб а на сервере Свободно гдето 1,5 гб, только стоит лимит размера лежаших файлов и импортировать>сохранить>отправить не получится.
Надо импортировать>отправить Без сохранение.
Ето скрипт для сибя делаю. Чтобы на обменник файлы выбрасывать.
Оперативной памяти для скрипта открыл 1 гб. Да и время выполнение 1 час.
Но 700 мб портировал в переменную гдето за 1,4 минуты.

Отредактировано TLENS (2010.01.24 01:36)

Неактивен

#7 2010.01.24 02:18

Gemorroj
Administrator
Откуда: Белоруссия
Зарегистрирован: 2007.11.03
Сообщений: 6593
Карма: 107
Профиль Веб-сайт

Re: Нужно передать файл методом пост на другой хост

потоками.
stream_context_create и file_put_contents

Неактивен

#8 2010.01.24 04:27

TLENS
Moderator
Откуда: Украина
Зарегистрирован: 2009.04.05
Сообщений: 2402
Карма: 14
Профиль

Re: Нужно передать файл методом пост на другой хост

Нашол какогото крокодила может есть вариант попроще?

Код:

1
span style="color: #0000BB"><?phpfunction do_post_request($url, $postdata, $files = null) {     $data = "";     $boundary = "---------------------".substr(md5(rand(0,32000)), 0, 10);            //Collect Postdata     foreach($postdata as $key => $val)     {         $data .= "--$boundary\n";         $data .= "Content-Disposition: form-data; name=\"".$key."\"\n\n".$val."\n";     }          $data .= "--$boundary\n";         //Collect Filedata     foreach($files as $key => $file)     {         $fileContents = file_get_contents($file['tmp_name']);                 $data .= "Content-Disposition: form-data; name=\"{$key}\"; filename=\"{$file['name']}\"\n";         $data .= "Content-Type: image/jpeg\n";         $data .= "Content-Transfer-Encoding: binary\n\n";         $data .= $fileContents."\n";         $data .= "--$boundary--\n";     }       $params = array('http' => array(            'method' => 'POST',            'header' => 'Content-Type: multipart/form-data; boundary='.$boundary,            'content' => $data         ));    $ctx = stream_context_create($params);    $fp = fopen($url, 'rb', false, $ctx);       if (!$fp) {       throw new Exception("Problem with $url, $php_errormsg");    }      $response = @stream_get_contents($fp);    if ($response === false) {       throw new Exception("Problem reading data from $url, $php_errormsg");    }    return $response; } //set data (in this example from post) //sample data$postdata = array(     'name' => $_POST['name'],     'age' => $_POST['age'],     'sex' => $_POST['sex'] ); //sample image$files['image'] = $_FILES['image']; do_post_request("http://example.com", $postdata, $files);?>

Отредактировано TLENS (2010.01.24 06:28)

Неактивен

#9 2010.01.24 06:31

TLENS
Moderator
Откуда: Украина
Зарегистрирован: 2009.04.05
Сообщений: 2402
Карма: 14
Профиль

Re: Нужно передать файл методом пост на другой хост

Gemorroj написал:

потоками.
stream_context_create и file_put_contents

Можеш поподробнее пожалуйста?
Добавлено спустя   4 минуты  1 секунду:
Погоди может щас з етим кодом розберусь

Неактивен

#10 2010.01.24 07:27

TLENS
Moderator
Откуда: Украина
Зарегистрирован: 2009.04.05
Сообщений: 2402
Карма: 14
Профиль

Re: Нужно передать файл методом пост на другой хост

Все вроди бы розобрался щас буду модерировать

Код:

1
lt;?$files['f1']['tmp_name']='http://site.ru/film.avi';$files['f1']['name']='film.avi.';do_post_request("http://обменник", $postdata, $files);

Неактивен

#11 2010.01.24 13:46

Gemorroj
Administrator
Откуда: Белоруссия
Зарегистрирован: 2007.11.03
Сообщений: 6593
Карма: 107
Профиль Веб-сайт

Re: Нужно передать файл методом пост на другой хост

нет, не пойдет, 19 строка $fileContents = file_get_contents($file['tmp_name']);
т.е. все сгружается в оперативную память.
я что-то не подумал над тем, что заголовок таким образом, без полного считывания файла не сделать.
тогда curl. 2 пример из мануала.

Код:

1
span style="color: #0000BB"><?php/* http://localhost/upload.php:print_r($_POST);print_r($_FILES);*/$ch = curl_init();$data = array('name' => 'Foo', 'file' => '@/home/user/test.png');curl_setopt($ch, CURLOPT_URL, 'http://localhost/upload.php');curl_setopt($ch, CURLOPT_POST, 1);curl_setopt($ch, CURLOPT_POSTFIELDS, $data);curl_exec($ch);?>

Неактивен

#12 2010.01.24 17:10

TLENS
Moderator
Откуда: Украина
Зарегистрирован: 2009.04.05
Сообщений: 2402
Карма: 14
Профиль

Re: Нужно передать файл методом пост на другой хост

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

Неактивен

#13 2010.01.24 17:26

TLENS
Moderator
Откуда: Украина
Зарегистрирован: 2009.04.05
Сообщений: 2402
Карма: 14
Профиль

Re: Нужно передать файл методом пост на другой хост

Gemorroj написал:

нет, не пойдет, 19 строка $fileContents = file_get_contents($file['tmp_name']);
т.е. все сгружается в оперативную память.
я что-то не подумал над тем, что заголовок таким образом, без полного считывания файла не сделать.
тогда curl. 2 пример из мануала.

Код:

1
span style="color: #0000BB"><?php/* http://localhost/upload.php:print_r($_POST);print_r($_FILES);*/$ch = curl_init();$data = array('name' => 'Foo', 'file' => '@/home/user/test.png');curl_setopt($ch, CURLOPT_URL, 'http://localhost/upload.php');curl_setopt($ch, CURLOPT_POST, 1);curl_setopt($ch, CURLOPT_POSTFIELDS, $data);curl_exec($ch);?>

Дак пускай считывает мне наоборот надо хранить в оперативке.
Так как фавайлову систему не запишу

Отредактировано TLENS (2010.01.24 17:29)

Неактивен

#14 2010.01.24 17:56

Gemorroj
Administrator
Откуда: Белоруссия
Зарегистрирован: 2007.11.03
Сообщений: 6593
Карма: 107
Профиль Веб-сайт

Re: Нужно передать файл методом пост на другой хост

кто тебе даст сгрузить 700 мб в оперативную память??? забудь, делай курлом, как описано выше.

Неактивен

#15 2010.01.24 18:31

TLENS
Moderator
Откуда: Украина
Зарегистрирован: 2009.04.05
Сообщений: 2402
Карма: 14
Профиль

Re: Нужно передать файл методом пост на другой хост

ini_set() делает чудеса

Неактивен

#16 2010.01.24 18:41

TLENS
Moderator
Откуда: Украина
Зарегистрирован: 2009.04.05
Сообщений: 2402
Карма: 14
Профиль

Re: Нужно передать файл методом пост на другой хост

Вот что у меня получилось на свой сайт бросает

Код:

1
span style="color: #0000BB"><?phpini_set('memory_limit',"999M");ini_set('max_execution_time',3600);list($generic_msec,$generic_sec)=explode(chr(32),microtime()); $generic_time=$generic_sec+$generic_msec; //-----------------//function do_post_request($url, $postdata, $files = null){$data = "";$boundary = "---------------------".substr(md5(rand(0,32000)), 0, 10);foreach($postdata as $key => $val){$data .= "--$boundary\n";$data .= "Content-Disposition: form-data; name=\"".$key."\"\n\n".$val."\n";}$data .= "--$boundary\n";foreach($files as $key => $file){$fileContents = file_get_contents($file['tmp_name']);$data .= "Content-Disposition: form-data; name=\"{$key}\"; filename=\"{$file['name']}\"\n";$data .= "Content-Type: image/jpeg\n";$data .= "Content-Transfer-Encoding: binary\n\n";$data .= $fileContents."\n";$data .= "--$boundary--\n";}$params = array('http' => array('method' => 'POST','header' => 'Content-Type: multipart/form-data; boundary='.$boundary,'content' => $data));$ctx = stream_context_create($params);$fp = fopen($url, 'rb', false, $ctx);if (!$fp) {throw new Exception("Problem with $url, $php_errormsg");}$response = @stream_get_contents($fp);if ($response === false) {throw new Exception("Problem reading data from $url, $php_errormsg");}return $response;}$postdata = array('sid' =>'XXX','send' =>'загрузить');$files['f1']['tmp_name']='http://site.ru/film.avi';$files['f1']['name']=preg_replace('/.*\/(.*)/','$1',$files['f1']['tmp_name']);do_post_request("http://обменник", $postdata, $files);//-----------------//list($generic_newmsec,$generic_newsec)=explode(chr(32),microtime()); echo round((($generic_newsec+$generic_newmsec)-$generic_time),4).' сек.<br>';?>

Неактивен

#17 2010.01.24 19:13

TLENS
Moderator
Откуда: Украина
Зарегистрирован: 2009.04.05
Сообщений: 2402
Карма: 14
Профиль

Re: Нужно передать файл методом пост на другой хост

Код:

1
span style="color: #0000BB"><?phpini_set('memory_limit',"999M");ini_set('max_execution_time',3600);list($generic_msec,$generic_sec)=explode(chr(32),microtime()); $generic_time=$generic_sec+$generic_msec; //-----------------//$f=file_get_contents('http://www.passov.net/loads/files/b_video/film/0a/m/Nasha_Russia_Jajca_Sudby.mp4');echo substr($f,0,50).'<hr>';//-----------------//list($generic_newmsec,$generic_newsec)=explode(chr(32),microtime()); echo round((($generic_newsec+$generic_newmsec)-$generic_time),4).' сек.<br>';?>

Розмер 150 мб
Результат:
ftypmp42mp42isomDGmdatѶ# o m
<hr>
27.1215 сек.
Добавлено спустя   2 минуты  52 секунды:
Как переменную $f отправить с заголовками дай пожалуйста простенький пример
Добавлено спустя   5 минут  51 секунду:
Но ето все желательно в одной строке чтобы не умножать обем оперативной памяти.

Неактивен

#18 2010.01.24 21:13

Gemorroj
Administrator
Откуда: Белоруссия
Зарегистрирован: 2007.11.03
Сообщений: 6593
Карма: 107
Профиль Веб-сайт

Re: Нужно передать файл методом пост на другой хост

при чем тут ini_set ?
забивать наглухо оперативную память сервера - это страшное зло. я в этом помогать отказываюсь.

Неактивен

#19 2010.01.24 21:26

TLENS
Moderator
Откуда: Украина
Зарегистрирован: 2009.04.05
Сообщений: 2402
Карма: 14
Профиль

Re: Нужно передать файл методом пост на другой хост

Gemorroj написал:

при чем тут ini_set ?
забивать наглухо оперативную память сервера - это страшное зло. я в этом помогать отказываюсь.

Почему ето зло? Чем ето опасно?

Неактивен

#20 2010.01.24 21:50

Gemorroj
Administrator
Откуда: Белоруссия
Зарегистрирован: 2007.11.03
Сообщений: 6593
Карма: 107
Профиль Веб-сайт

Re: Нужно передать файл методом пост на другой хост

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

Неактивен

#21 2010.01.24 22:33

TLENS
Moderator
Откуда: Украина
Зарегистрирован: 2009.04.05
Сообщений: 2402
Карма: 14
Профиль

Re: Нужно передать файл методом пост на другой хост

Ты хочеш сказать что таким образом я забираю оперативную память всего сервера, а не отделенную имено мне?

Неактивен

#22 2010.01.24 22:35

Gemorroj
Administrator
Откуда: Белоруссия
Зарегистрирован: 2007.11.03
Сообщений: 6593
Карма: 107
Профиль Веб-сайт

Re: Нужно передать файл методом пост на другой хост

именно.

Неактивен

#23 2010.01.24 22:38

TLENS
Moderator
Откуда: Украина
Зарегистрирован: 2009.04.05
Сообщений: 2402
Карма: 14
Профиль

Re: Нужно передать файл методом пост на другой хост

Мне хостеры сказали ято я могу настраивать ini_set по своим удобствам
Добавлено спустя   2 минуты  47 секунд:
Всего полтора гига оперативной памяти дается я думал ето каждому дают по полтора.
Добавлено спустя   5 минут  9 секунд:
Да кстати спасибо что придупредил.

Неактивен

#24 2010.01.24 23:46

TLENS
Moderator
Откуда: Украина
Зарегистрирован: 2009.04.05
Сообщений: 2402
Карма: 14
Профиль

Re: Нужно передать файл методом пост на другой хост

Вощем вот что получилось

Код:

1
span style="color: #0000BB"><?php$url='./fontan.jpg';$boundary="---------------------".substr(md5(rand(0,32000)),0,10);$fp=fopen('http://tlens.net16.net/sistem/file.php','rb',false,stream_context_create(array('http'=>array('method'=>'POST','header'=>'Content-Type: multipart/form-data; boundary='.$boundary,'content'=>'--'.$boundary."\n".'Content-Disposition: form-data; name="f2"'."\n\n".'privet'."\n".'--'.$boundary."\n".'Content-Disposition: form-data; name="f1"; filename="img.jpg"'."\n".'Content-Type: image/jpeg'."\n".'Content-Transfer-Encoding: binary'."\n\n".file_get_contents($url)."\n--".$boundary.'--'))));

Может можна как нибудь обойти?
В файловую систему можно писать 2 мб не больше.
Пробувал хитачесом изменить но низнаю как говорили что ето ограничение стоит в php.ini и изинить никак.
Должен быть какойто выход.
Но в голову ниче кроме как заплатить им 5$))

Отредактировано TLENS (2010.01.24 23:47)

Неактивен

#25 2010.01.25 09:39

Gemorroj
Administrator
Откуда: Белоруссия
Зарегистрирован: 2007.11.03
Сообщений: 6593
Карма: 107
Профиль Веб-сайт

Re: Нужно передать файл методом пост на другой хост

читай в теме про .htaccess изменение размера загружаемых файлов.
обойти курлом. как - написано выше.

Неактивен

#26 2010.01.26 03:50

TLENS
Moderator
Откуда: Украина
Зарегистрирован: 2009.04.05
Сообщений: 2402
Карма: 14
Профиль

Re: Нужно передать файл методом пост на другой хост

Gemorroj написал:

читай в теме про .htaccess изменение размера загружаемых файлов.
обойти курлом. как - написано выше.

Я и хотел изменить таким образом

Код:

1
2
3
LimitRequestBody 0
php_value upload_max_filesize 10M
php_value post_max_size 10M

Вот можеш посмотреть мож у тибя получится http://tested.webuda.com/beta/beta/
Добавлено спустя   6 минут  58 секунд:
Папка /home/a5901223/public_html/dir/

Неактивен

  • Главная
  • » PHP
  • » Нужно передать файл методом пост на другой хост

Дополнительно

forum.wapinet.ru

PunBB Mod v0.6.2
0.018 s