无法通过 PHP 将图像文件上传到 S3 存储桶
unable to upload image file to S3 bucket via PHP
我正在尝试通过 AWS PHP SDK 将图像上传到我的 S3 存储桶。对于我的 EC2 实例,我附加了一个角色,允许对我的 S3 存储桶使用 PutObject 和 GetObject。因此,据推测,我不需要在创建 S3Client 时附加凭据。我还在学习中。
这是我的 PHP 脚本:
<?php
require './aws/aws-autoloader.php';
use Aws\S3\S3Client;
use Aws\Exception\AwsException;
use Aws\Credentials\Credentials;
$s3 = new Aws\S3\S3Client([
'version' => 'latest',
'region' => 'us-east-1'
]);
$filename = $_FILES['file']['name'];
try {
$result = $s3->putObject([
'Bucket' => 'bucket name',
'Key' => 'testimage1',
'Body' => $filename
]);
echo 'DONE';
} catch (Exception $e) {
echo $e;
}
我一直收到此表单中的 500 内部错误。显然错误发生在创建 S3Client 时,我不确定为什么。
进一步探测证实,当我尝试实例化 S3Client class 时,引发了 500 内部错误。我可以从 CLI 访问 S3 存储桶,但无法使用 AWS PHP SDK。
错误图片如下:
任何人都可以在这方面提供建议吗?感谢阅读。
根据文档,S3Client Class 的使用是这样的:https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/guide_configuration.html
use Aws\S3\S3Client;
$options = [
'region' => 'us-east-1',
'version' => '2006-03-01',
'signature_version' => 'v4'
];
$s3Client = new S3Client($options);
它还说,“我们不建议在生产应用程序中使用最新版本,因为引入包含 API 更新的 SDK 的新次要版本可能会破坏您的生产应用程序。”
我解决了但是我用的是composer。所以这里有一个分步指南。
这是假设您创建了一个具有完全 S3 访问权限或至少附加了 PutObject 策略的 IAM 角色,并且 IAM 角色附加到 EC2 实例。另外,您的 EC2 实例已安装 Web 服务器。
- 在 EC2 实例
/var/www/html
(您的 Web 服务器托管网页的文件夹)中,按照 here 的指导在您的项目文件夹中安装 Composer。为了方便起见,我选择全局安装 composer。
- 安装 AWS PHP SDK,如此 guide。
- 如果您遇到请求 simplexml 扩展的错误,只需
yum install php-xml
并重新运行 AWS PHP SDK 的安装。
- 现在您已经安装了 SDK,您现在可以将您想要的文件上传到 S3 存储桶。
这是我的上传代码,我的 vendor 文件夹是根目录,包含用于将文件上传到 S3 存储桶的 php 文件。
require 'vendor/autoload.php';
use Aws\S3\S3Client;
try{
$sharedConfig = [
'region' => 'us-east-1',
'version' => 'latest'
];
$sdk = new Aws\Sdk($sharedConfig); /*Instantiate SDK class with configs for API use*/
$s3Client = $sdk->createS3(); /*creates the S3 Client for API use*/
$file_name = $_FILES['file']['name']; /*file name e.g. name.jpg */
$file_tmp_name = $_FILES['file']['tmp_name']; /*!!! IMPORTANT - this is what you need to supply the SourceFile to properly upload the file*/
$file_type = $_FILES['file']['type']; /*file type*/
/*print_r($_FILES['file']);*/
$result = $s3Client->putObject([
'Bucket' => 'bucket-name',
'Key' => 'testimage.jpg',
'SourceFile' => $file_tmp_name,
'ContentType'=>$file_type,
'ContentDisposition'=>'attachment'
]);
echo "FILE SENT";
}catch(Exception $e){
echo $e;
}
我正在尝试通过 AWS PHP SDK 将图像上传到我的 S3 存储桶。对于我的 EC2 实例,我附加了一个角色,允许对我的 S3 存储桶使用 PutObject 和 GetObject。因此,据推测,我不需要在创建 S3Client 时附加凭据。我还在学习中。
这是我的 PHP 脚本:
<?php
require './aws/aws-autoloader.php';
use Aws\S3\S3Client;
use Aws\Exception\AwsException;
use Aws\Credentials\Credentials;
$s3 = new Aws\S3\S3Client([
'version' => 'latest',
'region' => 'us-east-1'
]);
$filename = $_FILES['file']['name'];
try {
$result = $s3->putObject([
'Bucket' => 'bucket name',
'Key' => 'testimage1',
'Body' => $filename
]);
echo 'DONE';
} catch (Exception $e) {
echo $e;
}
我一直收到此表单中的 500 内部错误。显然错误发生在创建 S3Client 时,我不确定为什么。
进一步探测证实,当我尝试实例化 S3Client class 时,引发了 500 内部错误。我可以从 CLI 访问 S3 存储桶,但无法使用 AWS PHP SDK。
错误图片如下:
任何人都可以在这方面提供建议吗?感谢阅读。
根据文档,S3Client Class 的使用是这样的:https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/guide_configuration.html
use Aws\S3\S3Client;
$options = [
'region' => 'us-east-1',
'version' => '2006-03-01',
'signature_version' => 'v4'
];
$s3Client = new S3Client($options);
它还说,“我们不建议在生产应用程序中使用最新版本,因为引入包含 API 更新的 SDK 的新次要版本可能会破坏您的生产应用程序。”
我解决了但是我用的是composer。所以这里有一个分步指南。
这是假设您创建了一个具有完全 S3 访问权限或至少附加了 PutObject 策略的 IAM 角色,并且 IAM 角色附加到 EC2 实例。另外,您的 EC2 实例已安装 Web 服务器。
- 在 EC2 实例
/var/www/html
(您的 Web 服务器托管网页的文件夹)中,按照 here 的指导在您的项目文件夹中安装 Composer。为了方便起见,我选择全局安装 composer。 - 安装 AWS PHP SDK,如此 guide。
- 如果您遇到请求 simplexml 扩展的错误,只需
yum install php-xml
并重新运行 AWS PHP SDK 的安装。 - 现在您已经安装了 SDK,您现在可以将您想要的文件上传到 S3 存储桶。
这是我的上传代码,我的 vendor 文件夹是根目录,包含用于将文件上传到 S3 存储桶的 php 文件。
require 'vendor/autoload.php';
use Aws\S3\S3Client;
try{
$sharedConfig = [
'region' => 'us-east-1',
'version' => 'latest'
];
$sdk = new Aws\Sdk($sharedConfig); /*Instantiate SDK class with configs for API use*/
$s3Client = $sdk->createS3(); /*creates the S3 Client for API use*/
$file_name = $_FILES['file']['name']; /*file name e.g. name.jpg */
$file_tmp_name = $_FILES['file']['tmp_name']; /*!!! IMPORTANT - this is what you need to supply the SourceFile to properly upload the file*/
$file_type = $_FILES['file']['type']; /*file type*/
/*print_r($_FILES['file']);*/
$result = $s3Client->putObject([
'Bucket' => 'bucket-name',
'Key' => 'testimage.jpg',
'SourceFile' => $file_tmp_name,
'ContentType'=>$file_type,
'ContentDisposition'=>'attachment'
]);
echo "FILE SENT";
}catch(Exception $e){
echo $e;
}