|
Познающий
Регистрация: 07.02.2010
Сообщений: 70
Провел на форуме: 217996
Репутация:
56
|
|
Код скрипта, отправляющего файл: (форум может поставить пробелы где не надо, но я старался делить длинные строки)
<?
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..
|