Сдесь: PHP: echo tpl_l(print_r(HTTP_request($serv, $port, $timeout, $host, $addr, $post, $cookie)), C_RESULT); Вот из за какогото [censored] и его [censored] настройки сервака, должен извращатся а не радоватся file_get_contents() Ну никак не пашет !
Да сделай по изврату ) Обычно, когда делать совсем нех. пользуешься извратом ) Короче ) На сайте, где хочешь сохранить файл (куда закачивать) делаешь форму, ну обычную, типа закачать файл. PHP: <?php if($_FILES["filename"]["name"] == null) { echo "NO FILE"; exit; } if(copy($_FILES["filename"]["tmp_name"], $_SERVER['DOCUMENT_ROOT']."/".$_FILES["filename"]["name"])) { echo "OK"; } else { echo "ERROR"; } ?> А на сервере, откуда заливать файл (базу) делаешь токой скрипт: PHP: <?php $file = "baza.sql"; // Должен лежать в каталоге со скриптом $post_data = '-----------------------------01010 Content-Disposition: form-data; name="filename"; filename="'.$file.'" -----------------------------01010 Content-Type: application/octet-stream '.file_get_contents('baza.sql').' -----------------------------01010--'; $ch=curl_init(); curl_setopt($ch, CURLOPT_URL, 'http://server.ru/upload.php'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch,CURLOPT_HTTPHEADER,array ( "Content-Type: multipart/form-data; boundary=---------------------------01010", )); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_REFERER, 'http://server.ru/test.html'); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS,$post_data); $result = curl_exec($ch); echo $result; ?> И если все замечательно, то скрипт покажет OK и сохранит файл в server.ru/files/ Ну это конечно извращенно, вообщем хз, что еще посоветовать )
эм.. что за echo tpl_l(); HTTP_request() вернёт МАССИВ, где первый элемент с ключем 0 будет true или false, второй элемент с индексом 1 — текст ошибки (в случае, если первый false) или ответ сервера (если первый элемент - true, т.е. коннект удался) присвой значение переменной и бери условие... PHP: $Result=HTTP_request(); if($Result[0]){ echo "запрос отправил, вот ответ:\r\n".$Result[1]; }else{ echo "Не удалось соедениться с сервером, вот текст ошибки:\r\n".$Result[1]; }
считай, готовое решение ^_WhitE_DeMoN_^, написал передачу файла по посту по кускам (ограничение размера файла - 2 гига ровно минус 1 байт) Да и пост у меня по кускам собирай.. PHP: function pro_HTTP_($SOCKET, $HEAD, &$CONTENT){ $SOCKETs=array( 'Socket-Address'=>'localhost', 'Socket-Port'=>80, 'Socket-Timeout'=>10, 'Socket-DownLimit'=>null // null-без лимита ); $HEADs=array( // САМЫЕ ОСНОВНЫЕ :) 'Method'=>null, // если не указано, устанавливается автоматически GET или POST [GET POST PUT OPTIONS HEAD DELETE PATCH TRACE LINK UNLINK] 'URI'=>'/', 'HTTP'=>'HTTP/1.1', // ОСНОВНЫЕ // Знак ? означает, что заголовок не фильтруется и всё, что вы через него передадите, выведется в чистом виде // Формат даты (пример): Sun, 06 Nov 1994 08:49:37 GMT 'Cache-Control'=>null, //? Основные директивы для управления кэшированием. 'Connection'=>false, // Сведения о проведении соединения // false=Close;true=Keep-Alive;если число, то добавляется Keep-Alive: с этим числом 'Date'=>null, //? Дата генерации отклика. 'MIME-Version'=>null, //? Версия протокола MIME по которому было сформировано сообщение. 'Pragma'=>null, //? Особенные опции выполнения операции. 'Trailer'=>null, //? Список полей, имеющих отношение к кодированию сообщения при передаче. 'Transfer-Encoding'=>null, //? Список способов кодирования, которые были применены к сообщению для передачи. 'Upgrade'=>null, //? Список предлагаемых клиентом протоколов. Сервер указывает один протокол. 'Via'=>null, //? Список версий протокола, названий и версий прокси-серверов через которых прошло сообщение. 'Warning'=>null, //? Код, агент, сообщение и дата если возникла критическая ситуация. // ЗАПРОС 'Accept'=>null, // Список допустимых форматов ресурса. 'Accept-Charset'=>null, //? Перечень поддерживаемых кодировок для предоставления пользователю 'Accept-Encoding'=>null, //? Перечень поддерживаемых способов кодирования содержимого сущности при передаче.[gzip,deflate],compress,x-gzip,x-compress 'Accept-Language'=>null, // Список поддерживаемых естественных языков. /* */ 'Authorization'=>null, //! Данные для авторизации. 'Expect'=>null, //? HTTP/1.1v2 Указывает серверу что клиент ожидает от него дополнительного действия. 'From'=>null, // Адрес электронной почты ответственного лица со стороны клиента. 'Host'=>true, // Доменное имя и порт хоста запрашиваемого ресурса. Необходимо для поддержки виртуального хостинга на серверах.// Если true, то заполняется из сокета 'If-Match'=>null, //? Список тегов версий сущности. Выполнять метод если они существуют. 'If-Modified-Since'=>null, //? Дата. Выполнять метод если сущность изменилась с указанного момента. Используется только для метода обработки GET 'If-None-Match'=>null, //? Список тегов версий сущности. Выполнять метод если ни одного из них не существует. 'If-Range'=>null, //? Список тегов версий сущности или дата для определённого фрагмента сущности. 'If-Unmodified-Since'=>null, //? Дата. Выполнять метод если сущность не изменилась с указанной даты. 'Max-Forwards'=>null, //? Максимально допустимое количество переходов через прокси. /* */ 'Proxy-Authorization'=>null, //! Информация для авторизации на прокси-сервере. 'Range'=>null, // Байтовые диапазоны для запроса фрагментов ресурса. Подробности: Частичные GET. [bytes=64397516-80496894] 'Referer'=>null, // URI ресурса, после которого клиент сделал текущий запрос.// если true, то берётся из адреса 'TE'=>null, //? HTTP/1.1v2 Список расширенных способов кодирования при передаче. 'User-Agent'=>null, //? Список названий и версий клиента и его компонентов с комментариями. // СОДЕРЖИМОЕ (СУЩНОСТИ) CONTENT 'Content-Disposition'=>null, //? Способ распределения сущностей в сообщении при передачи нескольких фрагментов. 'Content-Encoding'=>null, //? Способ кодирования содержимого сущности при передаче. 'Content-Language'=>null, // Один или несколько естественных языков содержимого сущности 'Content-Length'=>null, // Размер содержимого сущности в байтах. // если передаётся в $CONTENT, то будет заполнено автоматически, лучше не трогать 'Content-Location'=>null, //? Альтернативное расположение содержимого сущности. 'Content-MD5'=>null, //?!MD5-хэш сущности для проверки целостности. // для автоматического заполнения перевести в ture 'Content-Range'=>null, //? Байтовые диапазоны передаваемой сущности если возвращается фрагмент. Подробности: Частичные GET. 'Content-Type'=>null, // Формат и способ представления сущности. 'Content-Version'=>null, //? Информация о текущей версии сущности. 'Derived-From'=>null, //? Информация о текущей версии сущности. 'Last-Modified'=>null, //? Дата последней модификации сущности. 'Link'=>null, //? Указывает на логически связный с сущностью ресурс аналогично тегу <LINK> в HTML. 'Title'=>null //? Заголовок сущности. ); foreach($SOCKETs as $k=>$v){ if(isset($SOCKET[$k])) $SOCKETs[$k]=$SOCKET[$k]; } $keys=array_keys($HEADs); $lim=count($keys); for($i=0;$i<$lim;$i++){ $Head=$keys[$i]; $Value=$HEADs[$Head]; if(isset($HEAD[$Head])){ if($HEAD[$Head]!=='') $HEADs[$Head]=$HEAD[$Head]; } elseif(is_null($Value)) unset($HEADs[$Head]); } if((string)$HEADs['URI']=='') $HEADs['URI'] ='/'; else $HEADs['URI'] =(string)$HEADs['URI']; if((string)$HEADs['HTTP']=='') $HEADs['HTTP']='HTTP/1.1'; else $HEADs['HTTP']=(string)$HEADs['HTTP']; if($HEADs['Connection']){ if(is_numeric($HEADs['Connection'])) $HEADs['Keep-Alive']=intval($HEADs['Connection']); $HEADs['Connection']='Keep-Alive'; }else $HEADs['Connection']='Close'; if(isset($HEADs['Host'])){ if($HEADs['Host']===true || strlen($HEADs['Host'])==0)$HEADs['Host']=$SOCKETs['Socket-Address']; } if(isset($HEADs['Referer'])) if($HEADs['Referer']===true) $HEADs['Referer']=$HEADs['URI']; $Content=''; if(isset($CONTENT)) if(is_array($CONTENT)){ if(isset($CONTENT)) if(isset($CONTENT['POST'])) if(is_array($CONTENT['POST'])) if(count($CONTENT['POST'])>0){ $HEADs['Method']='POST';$MIME=false; $keys=array_keys($CONTENT['POST']);$lim=count($keys); for($i=0;$i<$lim;$i++){ if(is_array($CONTENT['POST'][$keys[$i]])){ $MIME=true; break; } } $Length=0; if($MIME){ $boundary= substr(sha1(md5(mktime())), 4, -4); $boundary= $boundary.strtoupper(md5($boundary)); $boundary{10}='+'; $boundary{12}='_'; //получение более-менее уникальной границы $HEADs['Content-Type']='multipart/form-data; boundary="'.$boundary.'"'; foreach($CONTENT['POST'] as $Keyko=>$Postec){ if(is_array($Postec)){ $Content.="--$boundary\r\nContent-Disposition: form-data"; if(isset($Postec['name'])) $Content.='; name="'.$Postec['name'].'"'; else $Content.='; name="'.$Keyko.'"'; if(isset($Postec['filename']))$Content.='; filename="'.$Postec['name'].'"'; $Content.="\r\n"; foreach($Postec as $K=>$V){ if($K!='' && $K!='name' && $K!='Content-Disposition') $Content.="$K: $V\r\n"; } $Content.="\r\n".@$Postec['']."\r\n"; }else $Content.="--$boundary\r\nContent-Disposition: form-data; name=\"$Keyko\"\r\n\r\n$Postec\r\n"; } $Content.="--$boundary--"; $Length=strlen($Content); }else{ foreach($CONTENT['POST'] as $k=>$v){ $Content.=trim($k).'='.urlencode($v).'&'; $Length+=2+strlen(trim($k))+strlen($v); } $Length-=1; $Content=substr($Content,0,-1); $HEADs['Content-Type']='application/x-www-form-urlencoded'; } if(isset($HEADs['Content-Length'])) if($HEADs['Content-Length']===true) $HEADs['Content-Length']=$Length; if(isset($HEADs['Content-MD5'])) if($HEADs['Content-MD5']===true) $HEADs['Content-MD5']=md5($Content); } // cookie if(isset($CONTENT)) if(isset($CONTENT['Cookie'])) if(is_array($CONTENT['Cookie'])) if(count($CONTENT['Cookie'])>0){ $HEADs['Cookie']=''; foreach($CONTENT['Cookie'] as $k=>$v){ $HEADs['Cookie'].=(string)$k.'='.urlencode($v).'; '; } $HEADs['Cookie']=substr($HEADs['Cookie'],0,-2); } if(isset($CONTENT)) if(isset($CONTENT['Authorization'])) if(is_array($CONTENT['Authorization'])){ if(isset($CONTENT['Authorization']['userid']) && isset($CONTENT['Authorization']['password'])) $HEADs['Authorization'] = 'Basic '.base64_encode(str_replace(':', '', $CONTENT['Authorization']['userid']).':'.$CONTENT['Authorization']['password']); } } if(isset($HEADs['Content-MD5'])) if($HEADs['Content-MD5']===true) unset($HEADs['Content-MD5']); if(!in_array(@$HEADs['Method'],array('GET', 'POST', 'PUT', 'OPTIONS', 'HEAD', 'DELETE', 'PATCH', 'TRACE', 'LINK', 'UNLINK')))$HEADs['Method']='GET'; $Send=$HEADs['Method'].' '.$HEADs['URI'].' '.$HEADs['HTTP'];unset($HEADs['Method'], $HEADs['URI'], $HEADs['HTTP']); $keys=array_keys($HEADs);$lim=count($keys); for($i=0;$i<$lim;$i++){ $Head=$keys[$i]; $Value=$HEADs[$Head]; $Send.="\r\n$Head: $Value"; } $Send.="\r\n\r\n".$Content; if(false!=($f=@fsockopen($SOCKETs['Socket-Address'], $SOCKETs['Socket-Port'], $errno, $errstr, $SOCKETs['Socket-Timeout']))){ if(!isset($SOCKETs['Socket-DownLimit'])) $ByteLimit=-1; elseif (intval($SOCKETs['Socket-DownLimit'])>=0) $ByteLimit=intval($SOCKETs['Socket-DownLimit']); else $ByteLimit=-1; fputs ($f, $Send); $Str=''; if($ByteLimit>0){ $Downed=0; set_time_limit(5); while(!feof($f) && $Downed<$ByteLimit){ $Str.=fread($f, $ByteLimit-$Downed); $Downed=strlen($Str); } }elseif($ByteLimit<0){ while(!feof($f)){ $Str.=fgets($f, 512); } } fclose($f); }else return array(false, $errstr, $Send); return array(true, $Str, $Send); } Вот функция, её добавить в ниже указанный код
Код скрипта, отправляющего файл: (форум может поставить пробелы где не надо, но я старался делить длинные строки) <? PHP: /* Ф У Н К Ц И Ю В С Т А В И Т Ь С Ю Д А ОПИСАНИЕ:::::::ФУНКЦИИ Возвращает array ($Connected{true,false}, $Str{string}, $Send{string}(отправленный запрос)) Если $Connected==true, то $Str - ответ сервера, иначе $Str - текст ошибки сокета В функцию передаются 3 массива $SOCKET доолжен содержать значения: 'Socket-Address'=> адрес сервера (ip или домен) 'Socket-Port'=> удалённый порт (обычно 80) 'Socket-Timeout'=> максимальное время ожидания соединения 'Socket-DownLimit'=>ограничение на длину ответа (Байт). null - без ограничения, функция закачает и выдаст полный ответ сервера $HEAD Смотрите описание заголовков в функции Все неуказанные заголовки либо берутся автоматически (важные), либо игнорируются (второстепенные) $CONTENT Указывайте тут POST данные, куки, логины и пароли для доступа 'Cookie'=>array('name'=>'ROX','session'=>'asagjreht89pqypgr7w5e4p',...) // передавайте в ассоциативном массиве Имя=>Значение 'POST'=>array(), // Пост запрос можно организовать двумя способами: 1. Если нужно послать текстовые переменные, заполняйте массив как в случает с COOKIE (значения подвергаются urlencode) 2. Если нужно передать файлы и тексты, воспользуйтесь передачей множественного содержимого (см. MIME) В этом случае массив примет вид: $CONTENT['POST']=array( array( 'name'=>'Это имя переменной (формы)', // если не указано, то берётся ключ этого суб-массива (0) // 'name' соответствует атрибуту name в HTML-тегах <INPUT> и <TEXTAREA> 'filename'=>'image.jpg', // Если передаете файл, укажите имя файла 'Content-Type'=>'image/jpeg', // при передаче файла укажите формат файла 'Content-Transfer-Encoding'=>'binari', // бинарный файл, содержимое не закодировано ''=>'Собственно, само содержимое. Практически тут может быть всё что угодно', // не подвергается кодированию // ключ элемента - пустая строка ), array( ''=>'текст' // здесь name=>1 ), 'ololo'=>array( ''=>'тело объекта' // здесь name=>'ololo' ) ); Заголовок каждого содержимого постоянен =>>> Content-Disposition: form-data 'Authorization'=>array(Login, Password), // Авторизация на сайте 1 Базовая схема установления подлинности (Basic Authentication Scheme) 'Authorization'=>array( 'userid'=>'User' // идентификатор клиента 'password'=>'123' // пароль ) [x] 2 Обзорная схема установления подлинности (Digest Authentication Scheme); Обзорное установление подлинности для HTTP определяется в RFC 2069 [32] 2617 oO. // НЕ РЕАЛИЗОВАНО [x] 'Proxy-Authorization'=>array(Login, Password), // Авторизация на HTTP прокси // НЕ РЕАЛИЗОВАНО */ $File='./de_baghdad2.rar'; $SizeLimit=512*1024;//500KB $ReSend=5; $SOCKET=array('Socket-Address'=>'127.0.0.1', 'Socket-Port'=>80, 'Socket-Timeout'=>10, 'Socket-DownLimit'=>null); $CONTENT=array( 'Authorization' => array('userid'=>'User', 'password'=>'123')); $HEAD=array( 'URI'=>'/get_file.php', 'Connection'=>false, 'Host'=>true, 'Content-Length'=>true, // Размер содержимого сущности в байтах. // если передаётся в $CONTENT, то будет заполнено автоматически, лучше не трогать 'Content-MD5'=>true, // MD5-хэш сущности для проверки целостности. // для автоматического заполнения перевести в ture ); if(is_file($File))if(is_readable($File)){ $Size=filesize($File); $For=ceil($Size/$SizeLimit); if($For>0) if(false!==($FP=fopen($File,'r'))){ flock($FP,LOCK_SH); $Sendet=0; $MD5File=md5_file($File); for($i=0; $i<$For; $i++){ fseek($FP, ($i*$SizeLimit) ,SEEK_SET); $Segment=fread($FP, $SizeLimit); $CONTENT['POST']=array( array( 'name'=>'md5file', ''=>$MD5File ), array( 'name'=>'fullsize', ''=>$Size ), array( 'name'=>'start', ''=>($i*$SizeLimit) ), array( 'name'=>'end', ''=>min(($i*$SizeLimit+$SizeLimit),$Size) ), array( 'name'=>'md5segment', ''=>md5($Segment) ), array( 'name'=>'filename', ''=>substr(strrchr(str_replace("\\",'/',$File),'/'),1) ), array( 'name'=>'segmentname', ''=>'segment' ), array( 'name'=>'segment', 'filename'=>'segment', 'Content-Transfer-Encoding'=>'binari', ''=>$Segment ) ); $Sendet=false; $j=0; while(!$Sendet && $j<$ReSend){ $j++; $Result=pro_HTTP_($SOCKET, $HEAD, $CONTENT); $Sendet=$Result[0]; $Text=$Result[1]; } if(!$Sendet){echo 'Файл не удалось отправить. Возникла ошибка на '.$i.' сегменте: '.$Text; break;} echo strval($i+1)."-й пошёл!\r\n"; echo $Result[1]."\r\n\r\n<br>\r\n\r\n"; //echo strlen($Segment); //print_r($CONTENT); } flock($FP,LOCK_UN); fclose($FP); }else echo 'Не удалось открыть файл'; else echo 'Файл нулевого размера.'; } ?>
зы: функция pro_HTTP_() ещё не доделана, но в заданном условии работает как надо. Надо ещё сделать прокси и Digest (который всё-равно не сделаю, намудрили в спецификации, да и апач не поддерживает полностью) Скрипт, принимающий файл: (там попутно указаны некоторые опции типа логина и пароля, имени файла... лучше изучить) <? PHP: $MessageA = 'Authorise, please'; $MessageB = 'Bad password or login'; function q_auth($Inp){ header('WWW-Authenticate: Basic realm="'.$Inp.'"'); header('HTTP/1.0 401 Unauthorized'); } if (!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW'])){ q_auth($MessageA); }else{ $User=(string)$_SERVER['PHP_AUTH_USER']; $Password=(string)$_SERVER['PHP_AUTH_PW']; // контроль передачи данных для отладки // ob_start(); // print_r($_FILES); // print_r($_POST); // $To=ob_get_contents(); // ob_end_flush (); // $fp = fopen ('./sending file oO.txt','a'); // flock ($fp,LOCK_EX); // fputs($fp,$To); // flock ($fp,LOCK_UN); // fclose($fp); if($User!=='User' || $Password!=='123'){ q_auth($MessageB); }else{ // Сохраняем по кускам файл echo "ПОГНАЛИ!\r\n"; if(isset($_POST['md5file']) && isset($_POST['start']) && isset($_POST['end']) && isset($_POST['fullsize']) && isset($_POST['md5segment']) && isset($_POST['filename']) && isset($_POST['segmentname'])){ $SegmentName=$_POST['segmentname']; $Start=intval($_POST['start']); $End=intval($_POST['end']); $Size=$End-$Start; $FullSize=$_POST['fullsize']; $md5file=$_POST['md5file']; $md5segment=$_POST['md5segment']; echo "ПОСТ ПРИШЁЛ! Size=$Size\r\n"; if($Size>0){ echo "РАЗМЕРЧИК НЕ ДЕРЬМО!\r\n"; if(isset($_FILES[$SegmentName])){ echo "СЕГМЕНТ ДЕТЕКТЕД!\r\n"; if($_FILES[$SegmentName]['size']==$Size && md5_file ($_FILES[$SegmentName]['tmp_name']) === strtolower($md5segment)){ //$CustomFileName=$_POST['filename'];// ненадёжно, нужны фильтры и проверки $CustomFileName='./NotFileName.rar'; $fp = fopen ($CustomFileName,'a+'); flock($fp,LOCK_EX); fseek($fp, $Start, SEEK_SET); fputs($fp, file_get_contents ($_FILES[$SegmentName]['tmp_name'])); flock($fp,LOCK_UN); fclose($fp); if($End==$FullSize) if(md5_file($CustomFileName) === strtolower($md5file)) echo 'ФАЙЛ ЗАПИСАН КАК НАДО И ПОЛНОСТЬЮ! УРА! xD'; else echo 'ПИПЕЦ!'; else echo 'СЕГМЕНТ ЗАПИСАН!'; }else echo "НАЕ*А! size=".($_FILES[$SegmentName]['size'])."? если да, то md5 не тот\r\n"; }else echo 'А ФАЙЛ ТО ЗАБЫЛ ПЕРЕДАТЬ?'; }else echo 'ПОПУТАЛ РАЗМЕРЧИК! '; }else echo 'ПОСТ ПЕРЕДАН НЕ ВЕСЬ!'; } } ?> В ходе теста файл отлично передался, вот мой результат жаль за работу денег на платят
Да не, просто времени нету тестить - работы пох... Скоро активизируюсь. echo tpl_l() - выводит результат в теплейте (оформлен)
Такой вот фрагмент - не выводит ничего ! PHP: $timeout=30; // таймаут соединения $post=array('b' => $this->filename); // массив с переменными в формате ($var1 => $value1, $var2 => $value2...) {в $var# желательно использовать только латину} $cookie=array();// cookies заполняется аналогично $post $rezult = HTTP_request($serv, $port, $timeout, $host, $addr, $post, $cookie); echo tpl_l($rezult[0].' --- '.$rezult[1], C_RESULT); if($rezult[0]){ echo tpl_l("запрос отправил, вот ответ:\r\n".$rezult[1], C_RESULT); }else{ echo tpl_l("Не удалось соедениться с сервером, вот текст ошибки:\r\n".$rezult[1], C_RESULT);
если убрать твой tpl_l то всё нормально выводит (либо текст ошибки, либо контент страницы) а вобще, в трёх своих предыдущих постах текущей темы я всю твою задачу решил... (там уже другая функция)
Логики нет. Посмотрим... Но я никуда не спешу (уже...), все протестирую (что как заработает) и репу колотить буду, спасиб