2015-08-20 5 views
2

Я работаю над машиной AWS ec2 ubuntu. Мой код находится в cakephp. Когда я пытаюсь загрузить какое-либо изображение в AWS S3, он будет поврежден.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.

проверить это

enter image description here

Изображения сберегательные должным образом на моей памяти 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"; 
} 

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

enter image description here

+0

$ путь_к_файлу не является нулевым. и нет никаких исключений. – urfusion

+0

Это временное расположение файла. – urfusion

+0

он получит поврежденное означает, что я загружаю файл в два места на моем сервере ec2, а другой - на s3. Файл сервера Ec2 загружается корректно, при этом он сталкивается с коррупцией на s3. – urfusion

ответ

2

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

'Body' => $filepath, 

Должно быть

'Body' => file_get_contents($filepath), 
+0

, но его работа без file_get_contents в моем тестовом файле. И никакого успеха в живом проекте с этим. – urfusion

+0

@timstermatic представляется правильным. Прочтите документы - вы должны указать SourceFile или Body. Если вы укажете SourceFile, вы можете просто передать путь к файлу. Но если вы используете Body, вы * должны * передать содержимое файла (используя что-то вроде file_get_contents(). Http://docs.aws.amazon.com/AmazonS3/latest/dev/UploadObjSingleOpPHP.html –

+0

Вы можете проверить это, загрузив «поврежденный» файл с S3 и открыв его текстовым редактором. Я считаю, что это будет текстовый файл, содержащий путь к исходному файлу. –

Смежные вопросы