Загруженные изображения AWS S3 портятся

Я работаю на машине AWS EC2 Ubuntu. Мой код в CakePHP. Когда я пытаюсь загрузить любое изображение в AWS S3, оно будет повреждено.

в то время как он работает нормально в коде PHP.

вот мой код контроллера

 if ($this->User->saveAll($this->request->data)) {

// upload on s3
//create file name
// echo "<pre>"; print_r($_FILES); die;
$temp = explode(".", $_FILES["data"]["name"]["User"]['image']);
$newfilename = round(microtime(true)) . '.' . end($temp);

$filepath = $_FILES['data']['tmp_name']['User']['image'];
$id = $this->request->data['User']['id'];

try {
$result = $this->Amazon->S3->putObject(array(
'Signature' => 'v4',
'Bucket' => 'abc.sample',
'ACL' => 'authenticated-read',
'Key' => 'files/user/image/' . $id . "/" . $newfilename,
'ServerSideEncryption' => 'aws:kms',
'SourceFile' => $filepath,
'Body' => $filepath,
'ContentType' => $_FILES['data']['type']['User']['image'],

));
} catch (S3Exception $e) {
echo $e->getMessage() . "\n";
}
}

Еще одна вещь, если я не использовал body параметр, то он показывает мне следующую ошибку

Вы должны указать ненулевое значение для Body или SourceFile
параметры.

Пока следующий код работает нормально для тестирования в ядре PHP

$filepath = "/var/www/html/for_testing_aws/assets/img/avtar.png";

try {
$result = $s3->putObject(array(
'Bucket' => $bucketName,
'ACL' => 'authenticated-read',
'Key' => "avtar-auth.png",
'ServerSideEncryption' => 'aws:kms',
'SourceFile' => $filepath,
'ContentType' => mime_content_type($filepath),
'debug' => [
'logfn' => function ($msg) {
echo $msg . "\n";
},
'stream_size' => 0,
'scrub_auth' => true,
'http' => true,
],
));
} catch (S3Exception $e) {
echo $e->getMessage() . "\n";
}

Я создаю пользовательский компонент для доступа ко всем функциям SDK. со ссылкой на https://github.com/Ali1/cakephp-amazon-aws-sdk.

Проверь это

введите описание изображения здесь

Изображения сохраняются в моем хранилище ec2. для загрузки изображений на сервер ec2 я использую этот плагин https://github.com/josegonzalez/cakephp-upload

я попробую putobject с простым подходом загрузки форм, которые также работают для меня
вот код

require 'aws-autoloader.php';

$credentials = new Aws\Credentials\Credentials('key 1', 'key2');
$bucketName = "";
$s3 = new Aws\S3\S3Client([
// 'signature' => 'v4',
'version' => 'latest',
'region' => 'ap-southeast-1',
'credentials' => $credentials,
'http' => [
'verify' => '/home/ubuntu/cacert.pem'
],
'Statement' =>[
'Action '=> "*",
],
//    'debug' => [
//        'logfn' => function ($msg) {
//            echo $msg . "\n";
//        },
//        'stream_size' => 0,
//        'scrub_auth' => true,
//        'http' => true,
//    ]
]);

$result = $s3->listBuckets();
foreach ($result['Buckets'] as $bucket) {
// Each Bucket value will contain a Name and CreationDate

$bucketName = $bucket['Name'];
}

<form name="uploadimage" id="uploadimage" method="post" action="saveimg.php" enctype="multipart/form-data">
<input type="file" name="file" value="file"/>
<input type="submit" name="submit" value="submit" />
</form>

и saveimg.php это

$filepath = $_FILES['file']['tmp_name'];
try {
$result = $s3->putObject(array(
'Bucket' => $bucketName,
'ACL' => 'authenticated-read',
'Key' => $_FILES['file']['name'],
'ServerSideEncryption' => 'aws:kms',
'SourceFile' => $filepath,
'ContentType' => mime_content_type($filepath),
'debug' => [
'logfn' => function ($msg) {
echo $msg . "\n";
},
'stream_size' => 0,
'scrub_auth' => true,
'http' => true,
],
));
} catch (S3Exception $e) {
echo $e->getMessage() . "\n";
}

Когда я пытаюсь открыть этот файл, показывается следующее сообщение.

введите описание изображения здесь

2

Решение

Попробуйте прочитать ваш файл — вы передаете путь, а не содержимое файла:

'Body' => $filepath,

Должно быть

'Body' => file_get_contents($filepath),
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]