#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» вниз. Это работает!!!