2014-03-16 3 views
4

Я пытаюсь загрузить изображение на моем амазонке S3 через их PHP SDK. Поэтому я сделал небольшой сценарий для этого. Однако мой скрипт не работает, и мое исключение не отправляет мне сообщение об ошибке.Загрузить файл на amazon 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"; 
} 

?> 
+1

Вы используете это из Интернета или из командной строки? – Rico

+0

Из Интернета, почему? – casusbelli

+1

Попробуйте в командной строке, чтобы увидеть ошибки. – Rico

ответ

7

попробовать что-то вроде этого (от AWS docs):

<?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 файл, вы можете ommit что Content-type поле или вы можете просто указать: image/jpeg

+0

Зачем вы запускаете его из командной строки? – user3304007

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

должен быть

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

Альтернативный способ объяснить это, показывая завиток и как его построить в 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'") 
0

Ниже приведен код для загрузки изображения/файл в амазонка 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; 
} 
+0

$ source_path = $ _SERVER ['DOCUMENT_ROOT']. "/ Uploads /".$ advertImage; \t \t \t \t $ file_name = rand(); \t \t \t \t $ content_type = "image/jpeg"; \t \t \t \t $ target_path = "FreeImage"; \t \t \t \t $ this-> upload_agreement_data ($ target_path, $ source_path, $ file_name, $ content_type); –

+0

Функция getBucketURL ($ imageType, $ uri) \t { \t \t $ bucket = "pilateslogic"; \t \t $ newUri = $ imageType. "/". $ Uri; \t \t $ fileURL = $ this-> s3-> getAuthenticatedURL ($ bucket, $ newUri, 1000, $ hostBucket = false, $ https = false); \t \t return $ fileURL; \t} –

2

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

// 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; 
} 
Смежные вопросы