Пересылка файла без сохранения на сервере

Q_BASIC

Хранитель порядка
Регистрация
30 Ноя 2013
Сообщения
516
Реакции
1.240
Приветствую,

Есть ссылка на файл, типа site1.ru/video.mp4
Есть ссылка для загрузки: site2.ru/upload.php

Файл весит несколько ГБ, поэтому полностью скачивать, а потом загружать нецелесообразно.

Надо считывать файл, например, 1 КБ, и сразу отправлять на скрипт загрузки. После опять считывать понемногу и отправлять.

Файл передается в поле video_file

Написал пока это, от загрузчика не получаю ответ. В $response пустая строка

Отметил в коде, где загвоздка
PHP:
function download_upload_video($from, $to)
{
    $from = parse_url($from);

    $fp = fsockopen('ssl://'.$from['host'], 443, $errno, $errstr, 30);
    if (!$fp) {
        echo "$errstr ($errno)<br />\n";
    } else {
        $out  = "GET {$from['path']}?{$from['query']} HTTP/1.1\r\n";
        $out .= "Host: {$from['host']}\r\n";
        $out .= "User-Agent: Uploader/1.0.0\r\n";
        $out .= "Connection: Close\r\n\r\n";
     
        // echo $out;
     
        fwrite( $fp, $out);
     
        $row = '';
        $is_headers = true;
        while ( !feof($fp)) {
         
            $line = fread( $fp, 128);
         
            if( $line === "") break;
         
            if( $is_headers)
            {
                $row .= $line;
             
                if( strpos($row, "\r\n\r\n"))
                {
                    $is_headers = false;
                 
                    if( !preg_match("#Content-Length:([\s0-9]*)#i", $row, $matches))
                    {
                        die('#1;'.$row);
                    }
                 
                    $to = parse_url($to);

                    $header  = "POST {$to['path']}?{$to['query']} HTTP/1.1\r\n";
                    $header .= "Host: ". $to['host'] ."\r\n";
                    $header .= "User-Agent: Uploader/1.0.0\r\n";
                    $header .= "Content-Type: multipart/form-data; boundary=1d24d998140483c22f78b0ef1bd425f4\r\n";
                    $header .= "Content-Length: ".(186+trim($matches[1]))."\r\n";
                    $header .= "Connection: keep-alive\r\n";
                    $header .= "Keep-Alive: 300\r\n\r\n";

                    $body  = "--1d24d998140483c22f78b0ef1bd425f4\r\n";
                    $body .= "Content-Disposition: form-data; ";
                    $body .= "name=\"video_file\"; filename=\"file\"\r\n";
                    $body .= "Content-Type: application/octet-stream\r\n\r\n";

                    $f = fsockopen('ssl://'.$to['host'], 443, $errno, $errstr, 30);
                 
                    // echo $header.$body;
                 
                    fputs($f, $header.$body);
                 
                    $parts = explode("\r\n\r\n", $row);
                 
                    if( isset($parts[1]))
                    {
                        // echo $parts[1];
                        fputs( $f, $parts[1]);
                    }
                }
            }
            else
            {
                fputs( $f, $line);
            }
        }
        fclose($fp);
     
        $body = "\r\n--1d24d998140483c22f78b0ef1bd425f4\r\n\r\n";

        // echo $body;
        fputs($f, $body);

        $response="";
        while( !feof( $f)) {
            $line=fgets($f,1000);
         
            if( $line=="") { break; }
            $response.=$line;
        }

        fclose($f);

        return $response;
    }

}
 
Последнее редактирование:
какой то душевный ананизм прямо, а что мешает сразу загрузить куда нужно его
 
Видеофайл это бинарник, поэтому вместо fgets надо пользовать fread Для просмотра ссылки Войди или Зарегистрируйся
 
Последнее редактирование:
PHP:
$header .= "Content-Type: multipart/form-data; boundary=--1d24d998140483c22f78b0ef1bd425f4\r\n";
Тут лишние -- и дальше там размер заголовков не 191 а 186.
PHP:
    $boundary = "1d24d998140483c22f78b0ef1bd425f4";
   
    $body_head  = "--{$boundary}\r\n";
    $body_head .= "Content-Disposition: form-data; name=\"video_file\"; filename=\"file\"\r\n";
    $body_head .= "Content-Type: application/octet-stream\r\n\r\n";
    $body_tail  = "\r\n--{$boundary}\r\n\r\n";

    $body_size  = $file_size + strlen($body_head.$body_tail);
   
    $header  = "POST {$to['path']}?{$to['query']} HTTP/1.1\r\n";
    $header .= "Host: ". $to['host'] ."\r\n";
    $header .= "User-Agent: Uploader/1.0.0\r\n";
    $header .= "Content-Type: multipart/form-data; boundary=$boundary\r\n";
    $header .= "Content-Length: $body_size\r\n";
    $header .= "Connection: keep-alive\r\n";
    $header .= "Keep-Alive: 300\r\n\r\n";
 
PHP:
$header .= "Content-Type: multipart/form-data; boundary=--1d24d998140483c22f78b0ef1bd425f4\r\n";
Тут лишние -- и дальше там размер заголовков не 191 а 186.
PHP:
    $boundary = "1d24d998140483c22f78b0ef1bd425f4";
 
    $body_head  = "--{$boundary}\r\n";
    $body_head .= "Content-Disposition: form-data; name=\"video_file\"; filename=\"file\"\r\n";
    $body_head .= "Content-Type: application/octet-stream\r\n\r\n";
    $body_tail  = "\r\n--{$boundary}\r\n\r\n";

    $body_size  = $file_size + strlen($body_head.$body_tail);
 
    $header  = "POST {$to['path']}?{$to['query']} HTTP/1.1\r\n";
    $header .= "Host: ". $to['host'] ."\r\n";
    $header .= "User-Agent: Uploader/1.0.0\r\n";
    $header .= "Content-Type: multipart/form-data; boundary=$boundary\r\n";
    $header .= "Content-Length: $body_size\r\n";
    $header .= "Connection: keep-alive\r\n";
    $header .= "Keep-Alive: 300\r\n\r\n";
Смотрел тут: Для просмотра ссылки Войди или Зарегистрируйся
Там тире и при указании boundary 27 штук, и при использовании

А так, всё по прежнему - в ответе пустая строка
 
Последнее редактирование:
Смотрел тут: Для просмотра ссылки Войди или Зарегистрируйся
Там тире и при указании boundary 27 штук, и при использовании

А так, всё по прежнему - в ответе пустая строка
На той странице есть ссылка на rfc7233 Для просмотра ссылки Войди или Зарегистрируйся
так вот там
Код:
Content-Type: multipart/byteranges; boundary=THIS_STRING_SEPARATES

--THIS_STRING_SEPARATES
Content-Type: application/pdf
 
PHP:
function download_upload_video($from, $to)
{
    $from = parse_url($from);

    $f1 = fsockopen('ssl://'.$from['host'], 443, $errno, $errstr, 30);
    if (!$f1) {
        echo "$errstr ($errno)<br />\n";
        return false;
    }

    $header  = "GET {$from['path']}?{$from['query']} HTTP/1.1\r\n";
    $header .= "Host: {$from['host']}\r\n";
    $header .= "User-Agent: Uploader/1.0.0\r\n";
    $header .= "Connection: Close\r\n\r\n";
   
    fwrite($f1, $header);
   
    $out = fread($f1, 4096);
   
    $out = explode("\r\n\r\n", $out, 2);
   
    if (count($out) != 2) {
        echo "Bad header";
        die;
    }
   
    if (!preg_match('~Content-Length: *(\d+)~i', $out[0], $match)) {
        echo "Bad content-length";
        die;
    }

    $file_size = (int) $match[1];
   
    $to = parse_url($to);
   
    $boundary = "1d24d998140483c22f78b0ef1bd425f4";
   
    $body_head  = "--{$boundary}\r\n";
    $body_head .= "Content-Disposition: form-data; name=\"video_file\"; filename=\"file\"\r\n";
    $body_head .= "Content-Type: application/octet-stream\r\n\r\n";
    $body_tail  = "\r\n--{$boundary}--\r\n";

    $body_size  = $file_size + strlen($body_head.$body_tail);
   
    $header  = "POST {$to['path']}?{$to['query']} HTTP/1.1\r\n";
    $header .= "Host: ". $to['host'] ."\r\n";
    $header .= "User-Agent: Uploader/1.0.0\r\n";
    $header .= "Content-Type: multipart/form-data; boundary=$boundary\r\n";
    $header .= "Content-Length: $body_size\r\n";
    $header .= "Connection: close\r\n\r\n";
   
    $f2 = fsockopen('ssl://'.$to['host'], 443, $errno, $errstr, 30);
    if (!$f2) {
        echo "$errstr ($errno)<br />\n";
        return false;
    }

    fwrite($f2, $header . $body_head . $out[1]);

    while (!feof($f1)) {
        fwrite($f2, fread($f1, 4096));
    }

    fclose($f1);

    fwrite($f2, $body_tail);

    $resp = "";
    while(!feof($f2)) {
        $resp .= fread($f2, 4096);
    }
   
    fclose($f2);
   
    var_dump($resp);
}
 
Назад
Сверху