У меня есть следующий код, который успешно отображает файл, сохраненный на S3, в браузер, но я хотел бы иметь возможность загрузить файл на клиентский компьютер.
Что мне нужно сделать?
$result = S3::getObject($Bucketname,$uri);
header("Content-Type: ".$result->headers['type']);
die($result->body);
Я пробовал следующее, но он просто загружает нечитаемый файл...
$result = S3::getObject($Bucketname,$uri);
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=test.pdf');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . strlen($result->body));
ob_clean();
flush();
readfile($result->body);
exit;
вы можете создать URL-адрес загрузки, используя метод getObjectUrl
somthing like:
$downloadUrl = $s3->getObjectUrl($bucketname, $file, '+5 minutes', array(
'ResponseContentDisposition' => 'attachment; filename=$file,'Content-Type' => 'application/octet-stream',
));
и передать этот URL-адрес пользователю. который направит пользователя на страницу amzon, которая начнет загрузку файла (ссылка будет действительна в течение 5 минут, но вы можете это изменить)
другой вариант, сначала сохраняет этот файл на ваш сервер, а затем позволяет пользователю загружать файл с вашего сервера
Вы пытаетесь загрузить pdf файл в виде данных типа двоичного содержимого.
Используйте ответ вашего запроса getObject, чтобы получить соответствующий тип mime:
$result = S3::getObject($Bucketname,$uri);
header('Content-Description: File Transfer');
header('Content-Type: ' . $result['ContentType']);
header('Content-Disposition: attachment; filename=test.pdf');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . strlen($result->body));
ob_clean();
flush();
readfile($result->body);
exit;