使用PHP上传到Amazon S3

7

我花了几个小时跟随使用php实现文件上传到亚马逊S3的教程。我将最新版本的Donovan Schönknecht的S3类(命名为S3.php)上传到了我的服务器,并尝试使用以下代码测试上传能力。我知道这段代码会起作用,因为我已经看过很多类似的示例。

<?php

require('S3.php');

$s3 = new S3('KEY', 'SECRET KEY');

//insert into s3
$new_name = time() . '.txt';

S3::putObject(
'upload-me.txt',
'bucketName',
$new_name,
S3::ACL_PUBLIC_READ,
array(),
array(),
S3::STORAGE_CLASS_RRS

);

?>

当我尝试加载此页面时,出现了500服务器错误。此外,每个其他有声望的类似教程都给了我相同的500错误。

我通过使用Cyberduck连接到S3验证了我的密钥和秘密密钥是有效的。

有人知道我可能做错了什么吗?

谢谢,

肖恩


2
500错误可能是您的PHP代码中的错误。打开display_errors或检查日志以查看错误消息。 - datasage
9个回答

12

事实证明,我缺少 PHP 的 cURL 扩展,而这正是问题所在,因为我使用的 S3 类需要使用 cURL。现在一切都正常了。


9

官方的AWS PHP SDK只能使用composer,不再提供ZIP文件下载。我无法在某些网站的共享托管平台上使用composer。 - andrebruton
7
每次发布都包含一个zip和phar文件,其中包含整个闭包依赖项,因此不需要Composer。 - Jeremy Lindblom
1
SDK的README和用户指南都展示了下载zip文件的位置。你认为SDK只能与Composer一起使用,有什么特别的原因吗? - Jeremy Lindblom
太好了!我原本以为在1.6版本之后,2.0版本需要使用composer。我这周稍后会尝试一下。 - andrebruton

8

您可以通过运行以下composer命令下载最新版本的Amazon PHP SDK:

composer require aws/aws-sdk-php

以下是在Amazon S3上上传文件的进一步配置:

// Include the SDK using the Composer autoloader
require 'vendor/autoload.php';
use Aws\S3\S3Client;
use Aws\S3\Exception\S3Exception;

// Set Amazon s3 credentials
$client = S3Client::factory(
  array(
    'key'    => "your-key",
    'secret' => "your secret key"
  )
);

try {
  $client->putObject(array(
    'Bucket'=>'your-bucket-name',
    'Key' =>  'your-filepath-in-bucket',
    'SourceFile' => 'source-filename-with-path',
    'StorageClass' => 'REDUCED_REDUNDANCY'
  ));

} catch (S3Exception $e) {
  // Catch an S3 specific exception.
  echo $e->getMessage();
}

点击此处获取详细步骤:使用PHP上传文件至Amazon S3


3

以下示例适用于我:

<?php
use Aws\S3\S3Client;
use Aws\S3\Exception\S3Exception;

$client = S3Client::factory([
    'version' => 'latest',
    'region'  => 'us-west-1',
    'credentials' => [
        'key'    => "<scret-key>",
        'secret' => "<my-secret>"
    ]
 ]);

try {
    $client->putObject([
        'Bucket'     =>'<my-bucket-name>',
        'Key'        => '<file-name>',
        'SourceFile' => '<file-path-on-server>',    // like /var/www/vhosts/mysite/file.csv
        'ACL'        => 'public-read',
    ]);
} catch (S3Exception $e) {
    // Catch an S3 specific exception.
    echo $e->getMessage();
}

获取安全凭证:

获取区域代码:


1

使用这个表格上传图片,对我来说很有效。你可以尝试在你的代码中使用它。

$name = $_FILES['photo']['name'];
$size = $_FILES['photo']['size'];
$tmp = $_FILES['photo']['tmp_name'];

//////Upload Process


    // Bucket Name
    $bucket = 'bucket-name';
    require_once('S3.php');

    //AWS access info
    $awsAccessKey = 'awsAccessKey';
    $awsSecretKey = 'awsSecretKey';

    //instantiate the class
    $s3 = new S3($awsAccessKey, $awsSecretKey);

    $s3->putBucket($bucket, S3::ACL_PUBLIC_READ);


    //Rename image name. 
    $actual_image_name = time();

        //Upload to S3
    if($s3->putObjectFile($tmp, $bucket , $actual_image_name, S3::ACL_PUBLIC_READ) )
    {
        $image='http://'.$bucket.'.s3.amazonaws.com/'.$actual_image_name;
    }else{
        echo 'error uploading to S3 Amazon';
    }

1

我从来没有找到一个带有亚马逊最新sdk的更新脚本。我已经自己制作了一个。它可以作为php命令行解释器脚本运行。你可以试试:

https://github.com/arizawan/aiss3clientphp


0

这里是上传图片到Amazon S3的示例代码。

// Bucket Name
$bucket="BucketName";
if (!class_exists('S3'))require_once('S3.php');

    //AWS access info
    if (!defined('awsAccessKey')) define('awsAccessKey', 'ACCESS_KEY');
    if (!defined('awsSecretKey')) define('awsSecretKey', 'ACCESS_Secret_KEY');

    $s3 = new S3(awsAccessKey, awsSecretKey);
    $s3->putBucket($bucket, S3::ACL_PUBLIC_READ);
    if($s3->putObjectFile($tmp, $bucket , $image_name_actual,S3::ACL_PUBLIC_READ) )
    {
        $message = "S3 Upload Successful.";
        $s3file='http://'.$bucket.'.s3.amazonaws.com/'.$actual_image_name;
        echo "<img src='$s3file'/>";
        echo 'S3 File URL:'.$s3file;
    }
    else{
        $message = "S3 Upload Fail.";
    }
}

0

我不熟悉S3 API,但我使用它作为https://github.com/KnpLabs/Gaufrette的存储。Gaufrette是一个库,它在S3和其他文件服务/系统上提供了相当不错的抽象层。


0

以下是最佳解决方案。它使用多部分上传。在使用之前,请确保安装了 PHP 的 AWS SDK。

require 'vendor/autoload.php';
use Aws\S3\S3Client;
use Aws\Exception\AwsException;
use Aws\S3\MultipartUploader;
use Aws\Exception\MultipartUploadException;

try {
  $s3Client = new S3Client([
    'version'     => 'latest',
    'region'      => 'us-east-1',
    'credentials' => [
        'key'    => 'AKIAUMIZJR5U5IO7M3',
        'secret' => 'BmcA3vFso1bc/9GVK7nHJtFk0tQL6Vi5OoMySO',
    ],
  ]);
 
  // Use multipart upload
  $source = 'https://b8q9h6y2.stackpathcdn.com/wp-content/uploads/2016/08/banner-for-website-4.png';
  $uploader = new MultipartUploader($s3Client, $source, [
      'bucket' => 'videofilessandeep',
      'key' => 'my-file.png',
      'ACL' => 'public-read',
  ]);
  
  try {
      $result = $uploader->upload();
      echo "Upload complete: {$result['ObjectURL']}\n";
  } catch (MultipartUploadException $e) {
      echo $e->getMessage() . "\n";
  }
 } catch (Exception $e) {
    print_r($e);
}
  

2
这些是你真实的凭据吗?最好不要公开分享! - Masoud Tahmasebi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接