Загрузите файл на amazon 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";
}

?>

РЕДАКТИРОВАТЬ: Сейчас я использую этот код, но он все еще не работает. У меня даже нет сообщения об ошибке или исключении.

    <?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";
}

?>
Author: casusbelli, 2014-03-17

5 answers

Попробуйте что-то подобное (из документов 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

 8
Author: Rico, 2014-05-30 19:54:20
$s3 = S3Client::factory('config.php');

Должно быть

$s3 = S3Client::factory(include 'config.php');
 2
Author: Ryan Parman, 2014-03-20 06:33:38

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

// 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;
}
 2
Author: mrbarletta, 2017-07-10 18:20:43

Альтернативный способ объяснить - показать завиток и как его построить в 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
Author: maze, 2014-11-30 08:20:19

Ниже приведен код для загрузки изображения/файла в корзину 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;
}
 0
Author: Neeraj Sharma, 2015-12-08 07:32:15