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

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

Репутация: 56
Arrow

Код скрипта, отправляющего файл: (форум может поставить пробелы где не надо, но я старался делить длинные строки)
<?
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 
'Файл нулевого размера.';

?>

Последний раз редактировалось roxblnfk; 22.05.2010 в 00:19..
 
Ответить с цитированием