Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как отправить файл через сокеты?
 
 автор: JIEXA   (07.05.2006 в 12:10)   письмо автору
 
 

Меня интересует, какие заголовки нужно отправить, чтобы отправить файл.
Тоесть представьте, на удаленном сервере есть форма для отправки файлов, и мне нужно через пшп скрипт отправить файл, который лежит на моем сервере. Думую понятно объяснил :).

   
 
 автор: cheops   (07.05.2006 в 12:48)   письмо автору
 
   для: JIEXA   (07.05.2006 в 12:10)
 

Примерное описание можно найти в теме по ссылке http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=1324, но конкретного программного решения нет...

   
 
 автор: JIEXA   (07.05.2006 в 13:53)   письмо автору
 
   для: cheops   (07.05.2006 в 12:48)
 

Вообщем вот что получилось примерно:

 
<?
$host 
$url['host'];
$port 80;
$path $url['path']."?".$url['query'];

      
$file_name $_FILES['userfile']['name'];    // the file
       
$tmp_name $_FILES['userfile']['tmp_name'];    // the file
       
$content_type $_FILES['userfile']['type'];    // the file mime type
       
$value "";
       
       
srand((double)microtime()*1000000);
       
$boundary "---------------------".substr(md5(rand(0,32000)),0,10);
       
       
// Build the header
       
$header "POST $path HTTP/1.0\r\n";
       
$header .= "Host: $host\r\n";
       
$header .= "Content-type: multipart/form-data, boundary=$boundary\r\n";

       
// and attach the file
       
$data .= "--$boundary\r\n";
       
$content_file join(""file($tmp_name));
       
$data .="Content-Disposition: form-data; name=\"filecontent\"; filename=\"$file_name\"\r\n";
       
$data .= "Content-Type: $content_type\r\n\r\n";
       
$data .= "".$content_file."\r\n";
       
$data .="--$boundary--\r\n";
       
$header .= "Content-length: " strlen($data) . "\r\n\r\n";

       
// Open the connection
       
$fp fsockopen($host80);
       
// then just 
       
fputs($fp$header.$data);
       
$line "";
       while (!
feof($fp)) 
       { 
          
$line .= fgets($fp1024); 
       }
       
fclose($fp);
?>


Это я пример на php.net чуток отредактировал. Так вот проблема, если файл много весит, то получается что PHP начинает жрать много памяти, к примеру чтобы отправить файл 40Мб - пшп уже получается забивает память на 40Мб. Вопрос: как можно отправить файл не сразу по 40Мб а как бы пакетами к примеру по 5 Мб.

   
 
 автор: JIEXA   (08.05.2006 в 00:17)   письмо автору
 
   для: JIEXA   (07.05.2006 в 13:53)
 

-

   
 
 автор: isset   (08.05.2006 в 00:49)   письмо автору
 
   для: JIEXA   (08.05.2006 в 00:17)
 

думаю никак, можно конечно sleep заюзать + fseek и какую функцию для получения текущего места

   
 
 автор: cheops   (08.05.2006 в 00:49)   письмо автору
 
   для: JIEXA   (07.05.2006 в 13:53)
 

А 40Мб где хотите резать на куски на клиенте или на сервере?

   
 
 автор: JIEXA   (08.05.2006 в 02:40)   письмо автору
 
   для: cheops   (08.05.2006 в 00:49)
 

На сервере. Я просто делаю автоматический загрузчик файлов на несколько бесплатных файл-сервисов, типа rapidshare.de, filefactory.com и т.д. Очень удобно заливать через одну форму сразу на несколько хостингов :)

   
 
 автор: cheops   (08.05.2006 в 09:39)   письмо автору
 
   для: JIEXA   (08.05.2006 в 02:40)
 

Скрипт, который разбивает файл на части и затем склеивает его обратно можно найти в теме по ссылке http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=827.

   
 
 автор: JIEXA   (08.05.2006 в 12:05)   письмо автору
 
   для: cheops   (08.05.2006 в 09:39)
 

Я думаю разбить - не проблема.
Меня больше интересует, как его отправить частями можно.

   
 
 автор: JIEXA   (08.05.2006 в 15:07)   письмо автору
 
   для: JIEXA   (08.05.2006 в 12:05)
 

сделал!! может кому понадобится - прикрепил в атаче

   
 
 автор: JIEXA   (09.05.2006 в 14:44)   письмо автору
 
   для: JIEXA   (08.05.2006 в 15:07)
 

Вообщем мне понадобилось ещё сделать отправку дополнительных полей вместе с файлом.. Но никак не получается:
<? 
function sendfile($host$port$path$filename$name$field$fields=array())  

    
$fdata "name=".urlencode("jiexa")."&pass=".urlencode("mypass")."\r\n\r\n"

    
srand((double)microtime()*1000000);  
    
$boundary "---------------------".substr(md5(rand(0,32000)),0,10);  

    
$clength "--$boundary\r\n";  
    
$clength.= "Content-Disposition: form-data; name=\"$field\"; filename=\"$name\"\r\n";  
    
$clength.= "Content-Type: ".mime_content_type($filename)."\r\n\r\n"
    
$clength.= "\r\n--$boundary--\r\n";  

    
$header  "POST $path HTTP/1.0\r\n";  
    
$header .= "Host: $host\r\n"
    
$header .= "Referer: $host\r\n"
    
$header .= "Content-type: multipart/form-data, boundary=$boundary\r\n";  
    
$header .= "Content-length: ".intval(filesize($filename)+strlen($clength)+strlen($fdata))."\r\n\r\n"
    
$header .= "--$boundary\r\n";  
    
$header .= "Content-Disposition: form-data; name=\"$field\"; filename=\"$name\"\r\n";  
    
$header .= "Content-Type: ".mime_content_type($filename)."\r\n\r\n";  

    
$fp fsockopen($host$port);  
    
fputs($fp$header); 
    
fputs($fp$fdata);  

    
$fp2 fopen($filename"r");  

    while (!
feof($fp2))   
    {  
        
fputs($fpfgets($fp21024*10));  
    }  

    
fclose($fp2);  

    
fputs($fp"\r\n--$boundary--\r\n");  

    
$line "";  

    while (!
feof($fp))   
    {   
        
$line .= fgets($fp1024);   
    }  

    
fclose($fp);  

    return 
$line;  

?>


Файл отправляется, а данные из переменной $fdata не отправляются. В чем ошибка?

   
 
 автор: JIEXA   (10.05.2006 в 00:11)   письмо автору
2.2 Кб
 
   для: JIEXA   (09.05.2006 в 14:44)
 

Мне тут друг помогал, но тоже ничего не вышло. Теперь ни файл ни данные не шлются.
Прикрепляю то, что получилось в аттач, пожалуйста помогите привести в рабочие состояние скрипт, очень надо.

Функция вызывается так:

<?
print sendFile("sitename.ru"80"/read.php""./probe.txt""probe.txt",  
         
"filecontent", array("mirror" => "on"));
?>

   
 
 автор: JIEXA   (10.05.2006 в 08:26)   письмо автору
 
   для: JIEXA   (10.05.2006 в 00:11)
 

-

   
 
 автор: JIEXA   (10.05.2006 в 15:12)   письмо автору
 
   для: JIEXA   (10.05.2006 в 00:11)
 

вопрос все ещё актуален

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования