Загрузить файл на amazon S3 с помощью PHP SDK

Я пытаюсь загрузить изображение на моем амазонке S3 через их PHP SDK. Поэтому я сделал небольшой сценарий для этого. Однако мой скрипт не работает, и мое исключение не отправляет мне сообщение об ошибке.

Я новичок в AWS, спасибо за вашу помощь.

Вот код:

config.php

<?php return array( 'includes' => array('_aws'), 'services' => array( 'default_settings' => array( 'params' => array( 'key' => 'PUBLICKEY', 'secret' => 'PRIVATEKEY', 'region' => 'eu-west-1' ) ) ) ); ?> 

Index.php

  <?php //Installing AWS SDK via phar require 'aws.phar'; use Aws\S3\S3Client; use Aws\S3\Exception\S3Exception; $bucket = 'infact'; $keyname = 'myImage'; // $filepath should be absolute path to a file on disk $filepath = 'image.jpg'; // Instantiate the client. $s3 = S3Client::factory('config.php'); // Upload a file. try { $result = $s3->putObject(array( 'Bucket' => $bucket, 'Key' => $keyname, 'SourceFile' => $filePath, 'ContentType' => 'text/plain', 'ACL' => 'public-read', 'StorageClass' => 'REDUCED_REDUNDANCY' )); // Print the URL to the object. echo $result['ObjectURL'] . "\n"; } catch (S3Exception $e) { echo $e->getMessage() . "\n"; } ?> 

EDIT: Я использую этот код, но он все еще не работает. У меня даже нет сообщения об ошибке или исключении.

  <?php require 'aws.phar'; use Aws\S3\S3Client; use Aws\S3\Exception\S3Exception; $bucket = 'infactr'; $keyname = 'sample'; // $filepath should be absolute path to a file on disk $filepath = 'image.jpg'; // Instantiate the client. $s3 = S3Client::factory(array( 'key' => 'key', 'secret' => 'privatekey', 'region' => 'eu-west-1' )); try { // Upload data. $result = $s3->putObject(array( 'Bucket' => $bucket, 'Key' => $keyname, 'SourceFile' => $filePath, 'ACL' => 'public-read', 'ContentType' => 'image/jpeg' )); // Print the URL to the object. echo $result['ObjectURL'] . "\n"; } catch (S3Exception $e) { echo $e->getMessage() . "\n"; } ?> 

Попробуйте что-то вроде этого (из документов AWS ):

 <?php require 'aws.phar'; use Aws\S3\S3Client; use Aws\S3\Exception\S3Exception; $bucket = '<your bucket name>'; $keyname = 'sample'; // $filepath should be absolute path to a file on disk $filepath = '/path/to/image.jpg'; // Instantiate the client. $s3 = S3Client::factory(array( 'key' => 'your AWS access key', 'secret' => 'your AWS secret access key' )); try { // Upload data. $result = $s3->putObject(array( 'Bucket' => $bucket, 'Key' => $keyname, 'SourceFile' => $filepath, 'ACL' => 'public-read' )); // Print the URL to the object. echo $result['ObjectURL'] . "\n"; } catch (S3Exception $e) { echo $e->getMessage() . "\n"; } ?> 

Назовите файл sample.php и запустите его из командной строки:

 php sample.php 

Он отлично работает для меня, пока у вас есть правильные полномочия. Имейте в виду, что имя ключа – это имя вашего файла в S3, поэтому, если вы хотите, чтобы ваш ключ имел то же имя вашего файла, вам нужно сделать что-то вроде: $keyname = 'image.jpg'; , Кроме того, jpg обычно не является файлом типа plain/text , вы можете опустить это поле Content-type или просто указать: image/jpeg

 $s3 = S3Client::factory('config.php'); 

должно быть

 $s3 = S3Client::factory(include 'config.php'); 

Для тех, кто ищет актуальную рабочую версию, это то, что я использую

 // Instantiate the client. $s3 = S3Client::factory(array( 'credentials' => [ 'key' => $s3Key, 'secret' => $s3Secret, ], 'region' => 'us-west-2', 'version' => "2006-03-01" )); try { // Upload data. $result = $s3->putObject(array( 'Bucket' => $s3Bucket, 'Key' => $fileId, 'SourceFile' => $filepath."/".$fileName )); return $result['ObjectURL']; } catch (S3Exception $e) { return false; } 

Альтернативный способ объяснить – показать завиток и как его построить в php – прагматичный подход. Пожалуйста, не качайте меня за уродливый код, просто подумайте, что этот пример легко проследить для загрузки на Azure с PHP или на другой язык.

 $azure1 ='https://viperprodstorage1.blob.core.windows.net/bucketnameAtAzure/'; $azure3 ='?sr=c&si=bucketnameAtAzure-policy&sig=GJ_verySecretHashFromAzure_aw%3D'; $shellCmd='ls -la '.$outFileName; $lsOutput=shell_exec($shellCmd); #print_r($lsOutput); $exploded=explode(' ', $lsOutput); #print_r($exploded); $fileLength=$exploded[7]; $curlAzure1="curl -v -X PUT -T '" . $outFileName . "' -H 'Content-Length: " . $fileLength . "' "; $buildedCurlForUploading=$curlAzure1."'".$azure1.$outFileName.$azure3."'"; var_dump($buildedCurlForUploading); shell_exec($buildedCurlForUploading); 

Это фактический завиток

 shell_exec("curl -v -X PUT -T 'fileName' -H 'Content-Length: fileSize' 'https://viperprodstorage1.blob.core.windows.net/bucketnameAtAzure/fileName?sr=c&si=bucketNameAtAzure-policy&sig=GJ_verySecretHashFromAzure_aw%3D'") 

Ниже приведен код для загрузки изображения / файла в ведро amazon s3.

 function upload_agreement_data($target_path, $source_path, $file_name, $content_type) { $fileup_flag = false; /*------------- call global settings helper function starts ----------------*/ $bucketName = "pilateslogic"; //$global_setting_option = '__cloud_front_bucket__'; //$bucketName = get_global_settings($global_setting_option); /*------------- call global settings helper function ends ----------------*/ if(!$bucketName) { die("ERROR: Template bucket name not found!"); } // Amazon profile_template template js upload URL $target_profile_template_js_url = "/".$bucketName."/".$target_path; // Chatching profile_template template js upload URL //$source_profile_template_js_url = dirname(dirname(dirname(__FILE__))).$source_path."/".$file_name; // file name $template_js_file = $file_name; $this->s3->setEndpoint("s3-ap-southeast-2.amazonaws.com"); if($this->s3->putObjectFile($source_path, $target_profile_template_js_url, $template_js_file, S3::ACL_PUBLIC_READ, array(), array("Content-Type" => $content_type))) { $fileup_flag = true; } return $fileup_flag; }