PHP: Как выполнить частичную загрузку содержимого из данных, которые не являются файлом. Например, данные, хранящиеся внутри переменной, извлеченной из корзины AWS S3

#php #amazon-s3 #http-headers #byte #http-content-range

Вопрос:

В приведенном ниже коде: В safari, где он выполняет частичную загрузку. Я продолжаю получать сообщение об ошибке:

 Failed to load resource: Plug-in handled load
 

Я забираюсь внутрь if (isset($_SERVER['HTTP_RANGE'])) ветки. Журнал ошибок Проверяет это.
Я проверил в google chrome, чтобы убедиться, что ресурс действительно был захвачен, и он действительно захвачен, и google chrome загружает весь файл внутри заявления else ранее упомянутого заявления if.

Что мне нужно сделать, чтобы исправить заголовки? Поток всегда захватывается в 1024 байтах или меньше из-за » — >чтение(1024)».

 $s3 = S3Client::factory([
        'version' => 'latest',
        'region' => 'A Region',
        'credentials' => [
            'key' => "A KEY",
            'secret' => "A SECRET",
        ]
    ]);

//echo "Step 4nn";
    
    $bucket = "bucket";
 
    $image_path = $_GET['video_path'];
    
    try {
        
        $result = $s3->getObject([
            'Bucket' => $bucket,
            'Key' => $image_path
        ]);
       

        header("Content-Type: {$result['ContentType']}");
        $fileSize = $result['ContentLength'];
       

        if (isset($_SERVER['HTTP_RANGE'])){ // do it for any device that supports byte-ranges not only iPhone
           // echo "partial";
            error_log("Error message We are good on safari in HTTP_RANGEn", 3, "error_log");
            // Read the body off of the underlying stream in chunks
           

            header('HTTP/1.1 206 Partial Content');
            header('Accept-Ranges: bytes');
            $start = 0;
            //$theLengthOfTheNextData = mb_strlen($data, '8bit');
            header("Content-Range: bytes 0-1023/$fileSize");
            header("Content-Length: 1024");
            while ($data = $result['Body']->read(1024))
            {

                //$theLengthOfTheNextData = mb_strlen($data, '8bit');
                //it starts at zero

                //$end = $start   $theLengthOfTheNextData - 1;


                //$theLengthOfTheNextData = mb_strlen(data);
                //echo "Length: $theLengthOfTheNextDatann";

                //header("Content-Range: bytes $start-$end/$fileSize");
                //header("Content-Length: $theLengthOfTheNextData");
                //$start = $start   $theLengthOfTheNextData;

                // header("Content-Range: bytes $start-$end/$size");

                set_time_limit(0);
                echo $data;


                // Flush the buffer immediately
                //@ob_flush();

                flush();

            }
            //header("Content-Length: $fileSize");

             //rangeDownload($result['Body'],$fileSize);
        }
        else {
           // echo "Just entire thing";
            error_log("Error message ---- NOT good on safari in HTTP_RANGEn", 4, "error_log");
            header("Content-Length: ".$fileSize);
            echo $result['Body'];

        }
        //echo "Step 7nn";
        //no need to cast as string
        // Cast as a string
        // $body = (string)$result->get('Body');
        //below should actually work too
        // $bodyAsString = (string) $result['Body'];
    } catch (S3Exception $e) {
        echo $e;
        //echo "Step 6Bnn";
        //grabbing the file was unsuccessful
        $successfulMove = 0;
    }
 

Ответ №1:

Если кто — то ищет ответ на этот вопрос. Вам нужно будет использовать «registerStreamWrapper» в функциях S3.

Ссылка на Ссылку

Вам также нужно будет прокрутить комментарий «tedchou12» вниз. Это работает!!!