Показать сообщение отдельно

считай, готовое решение
  #26  
Старый 22.05.2010, 00:16
roxblnfk
Познающий
Регистрация: 07.02.2010
Сообщений: 70
Провел на форуме:
217996

Репутация: 56
По умолчанию считай, готовое решение

^_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){
                
$boundarysubstr(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($f512); } }
        
fclose($f);
    }else return array(
false$errstr$Send);
    return array(
true$Str$Send);

Вот функция, её добавить в ниже указанный код
 
Ответить с цитированием