Intereting Posts

Загруженные изображения 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.

В то время как следующий код работает нормально для теста в core 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"; } 

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

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

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

 'Body' => $filepath, 

Должно быть

 'Body' => file_get_contents($filepath),