Я решил использовать азаботы нового шифрования на стороне сервера с помощью s3, однако у меня возникла проблема, которую я не могу решить.
Я использую класс PHP s3, найденный здесь: https://github.com/tpyo/amazon-s3-php-class
Я использовал этот код для первоначального размещения объектов (и он работал):
S3::putObjectFile($file, $s3_bucket_name, $file_path, S3::ACL_PRIVATE, array(), array( "Content-Disposition" => "attachment; filename=$filename", "Content-Type" => "application/octet-stream" ) );
Затем я сделал следующее: http://docs.amazonwebservices.com/AmazonS3/latest/API/index.html?RESTObjectPUT.html и добавил заголовок запроса « x-amz-server-side -encryption ». Но теперь, когда я пытаюсь поместить объект, он выходит из строя без ошибок.
Мой новый код:
S3::putObjectFile($file, $s3_bucket_name, $file_path, S3::ACL_PRIVATE, array(), array( "Content-Disposition" => "attachment; filename=$filename", "Content-Type" => "application/octet-stream", "x-amz-server-side-encryption" => "AES256" )
);
Кто-нибудь экспериментировал с этой новой функцией или может кто-нибудь увидеть ошибку в коде.
Приветствия.
Этот заголовок должен быть частью массива $metaHeaders
а не массивом $requestHeaders
.
S3::putObjectFile($file, $s3_bucket_name, $file_path, S3::ACL_PRIVATE, array( "x-amz-server-side-encryption" => "AES256" ), array( "Content-Disposition" => "attachment; filename=$filename", "Content-Type" => "application/octet-stream" ) );
Вот определение метода из документов :
putObject (mixed $input, string $bucket, string $uri, [constant $acl = S3::ACL_PRIVATE], [array $metaHeaders = array()], [array $requestHeaders = array()])
Вы также можете использовать SDK для PHP ?
Мы можем загружать файлы с помощью шифрования, используя следующий код: $s3->create_object($bucket_name,$destination,array( 'acl'=>AmazonS3::ACL_PUBLIC, 'fileUpload' => $file_local, 'encryption'=>"AES256"));
И вы можете скачать последнюю версию sdk отсюда
С официальным SDK:
use Aws\S3\S3Client; $bucket = '*** Your Bucket Name ***'; $keyname = '*** Your Object Key ***'; // $filepath should be absolute path to a file on disk $filepath = '*** Your File Path ***'; // Instantiate the client. $s3 = S3Client::factory(); // Upload a file with server-side encryption. $result = $s3->putObject(array( 'Bucket' => $bucket, 'Key' => $keyname, 'SourceFile' => $filepath, 'ServerSideEncryption' => 'AES256', ));
use Aws\S3\S3Client; $sourceBucket = '*** Your Source Bucket Name ***'; $sourceKeyname = '*** Your Source Object Key ***'; $targetBucket = '*** Your Target Bucket Name ***'; $targetKeyname = '*** Your Target Object Key ***'; // Instantiate the client. $s3 = S3Client::factory(); // Copy an object and add server-side encryption. $result = $s3->copyObject(array( 'Bucket' => $targetBucket, 'Key' => $targetKeyname, 'CopySource' => "{$sourceBucket}/{$sourceKeyname}", 'ServerSideEncryption' => 'AES256', ));
Источник: http://docs.aws.amazon.com/AmazonS3/latest/dev/SSEUsingPHPSDK.html
С laravel 5+ это можно легко сделать с помощью файловой системы config.php, вам не нужно получать драйвер или объект низкого уровня.
's3' => [ 'driver' => 's3', 'key' => "Your Key", 'secret' => "Your Secret", 'region' => "Bucket Region", 'bucket' => "Bucket Name", 'options' => [ 'ServerSideEncryption' => 'AES256', ] ], //Code $disk->put("filename", "content", "public"); // will have AES for file