Вы не зашли.
Главная » PHP » Нужно передать файл методом пост на другой хост
#1. TLENS Off (14)
Moderator
2009.12.01 00:12
Управится ли с етим курл если файл может весить до 200 мб. Или лутше использовать fsockopen?
но я В fsoockopen мало шарю если кому не трудно дайте шаблон.
#2. Gemorroj Off (107)
Administrator
2009.12.01 11:11
справится конечно. fsockopen как раз менее надежен.
#3. TLENS Off (14)
Moderator
2009.12.03 16:04
Вчем проблема написано что загружено но файла нет может проблема з заголовками?
Вот исходник:
Код:
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;
и форма приема:
Код:
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:04)
#4. Gemorroj Off (107)
Administrator
2009.12.03 17:05
в данном коде ты даже не пытаешся отправить файл.
http://www.php.net/manual/en/function.curl-setopt.php
пример номер 2.
#5. TLENS Off (14)
Moderator
2009.12.04 13:01
Спасибо большое разобрался
#6. TLENS Off (14)
Moderator
2010.01.24 01:01
А можно как нибуть отправить файл сидящий в переменной или например с отрытого соединение fopen('http://site.ru/film.avi','r');
Ато фильм весит 700мб а на сервере Свободно гдето 1,5 гб, только стоит лимит размера лежаших файлов и импортировать>сохранить>отправить не получится.
Надо импортировать>отправить Без сохранение.
Ето скрипт для сибя делаю. Чтобы на обменник файлы выбрасывать.
Оперативной памяти для скрипта открыл 1 гб. Да и время выполнение 1 час.
Но 700 мб портировал в переменную гдето за 1,4 минуты.
Отредактировано TLENS (2010.01.24 01:01)
#7. Gemorroj Off (107)
Administrator
2010.01.24 02:02
потоками.
stream_context_create и file_put_contents
#8. TLENS Off (14)
Moderator
2010.01.24 04:04
Нашол какогото крокодила может есть вариант попроще?
Код:
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:06)
#9. TLENS Off (14)
Moderator
2010.01.24 06:06
Gemorroj написал:
потоками.
stream_context_create и file_put_contents
Можеш поподробнее пожалуйста?
Добавлено спустя   4 минуты  1 секунду:
Погоди может щас з етим кодом розберусь
#10. TLENS Off (14)
Moderator
2010.01.24 07:07
Все вроди бы розобрался щас буду модерировать
Код:
lt;?$files['f1']['tmp_name']='http://site.ru/film.avi';$files['f1']['name']='film.avi.';do_post_request("http://обменник", $postdata, $files);
#11. Gemorroj Off (107)
Administrator
2010.01.24 13:01
нет, не пойдет, 19 строка $fileContents = file_get_contents($file['tmp_name']);
т.е. все сгружается в оперативную память.
я что-то не подумал над тем, что заголовок таким образом, без полного считывания файла не сделать.
тогда curl. 2 пример из мануала.
Код:
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. TLENS Off (14)
Moderator
2010.01.24 17:05
Геморой помоги пожалуйста упростить код.
Чтобы без цыклов фореарч, чтобы вставить переменную с файлом имя файла нужные заголовки для сайта и переменные пост.
Я мудровал 3 раза все чистил и начинал заново.
#13. TLENS Off (14)
Moderator
2010.01.24 17:05
Gemorroj написал:
нет, не пойдет, 19 строка $fileContents = file_get_contents($file['tmp_name']);
т.е. все сгружается в оперативную память.
я что-то не подумал над тем, что заголовок таким образом, без полного считывания файла не сделать.
тогда curl. 2 пример из мануала.
Код:
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:05)
#14. Gemorroj Off (107)
Administrator
2010.01.24 17:05
кто тебе даст сгрузить 700 мб в оперативную память??? забудь, делай курлом, как описано выше.
#15. TLENS Off (14)
Moderator
2010.01.24 18:06
ini_set() делает чудеса
#16. TLENS Off (14)
Moderator
2010.01.24 18:06
Вот что у меня получилось на свой сайт бросает
Код:
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. TLENS Off (14)
Moderator
2010.01.24 19:07
Код:
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. Gemorroj Off (107)
Administrator
2010.01.24 21:09
при чем тут ini_set ?
забивать наглухо оперативную память сервера - это страшное зло. я в этом помогать отказываюсь.
#19. TLENS Off (14)
Moderator
2010.01.24 21:09
Gemorroj написал:
при чем тут ini_set ?
забивать наглухо оперативную память сервера - это страшное зло. я в этом помогать отказываюсь.
Почему ето зло? Чем ето опасно?
#20. Gemorroj Off (107)
Administrator
2010.01.24 21:09
тем, что ты сжираешь все оперативную память. а она нужна не только тебе. если админы посмотрят в логи как пить дать хост забанят.
#21. TLENS Off (14)
Moderator
2010.01.24 22:10
Ты хочеш сказать что таким образом я забираю оперативную память всего сервера, а не отделенную имено мне?
#22. Gemorroj Off (107)
Administrator
2010.01.24 22:10
именно.
#23. TLENS Off (14)
Moderator
2010.01.24 22:10
Мне хостеры сказали ято я могу настраивать ini_set по своим удобствам
Добавлено спустя   2 минуты  47 секунд:
Всего полтора гига оперативной памяти дается я думал ето каждому дают по полтора.
Добавлено спустя   5 минут  9 секунд:
Да кстати спасибо что придупредил.
#24. TLENS Off (14)
Moderator
2010.01.24 23:11
Вощем вот что получилось
Код:
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:11)
#25. Gemorroj Off (107)
Administrator
2010.01.25 09:09
читай в теме про .htaccess изменение размера загружаемых файлов.
обойти курлом. как - написано выше.
#26. TLENS Off (14)
Moderator
2010.01.26 03:03
Gemorroj написал:
читай в теме про .htaccess изменение размера загружаемых файлов.
обойти курлом. как - написано выше.
Я и хотел изменить таким образом
Код:
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/
Страниц: 1 2 3 Все
Главная
WEB
PunBB Mod v0.6.2
0.035 s