当前位置: 首页 > 知识库问答 >
问题:

无法通过PHP将图像文件上载到S3 bucket

房学
2023-03-14

我正试图通过AWS PHP SDK将一个图像上传到我的S3 Bucket。对于我的EC2实例,我附加了一个角色,允许我的S3 Bucket使用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类时,会抛出500内部错误。我能够从CLI访问S3存储桶,但无法使用AWS PHP SDK这样做。

有人能在这方面提出建议吗?谢谢你的阅读。

共有2个答案

曹铭晨
2023-03-14

我解决了它,但我用了作曲家。这里有一个分步指南。

这是在假设您已创建具有完全S3访问权限或至少附加PutObject策略的IAM角色,并且IAM角色附加到EC2实例的情况下进行的。另外,您的EC2实例已经安装了一个web服务器。

  1. 在EC2实例/var/www/html(您的Web服务器托管您的网页的文件夹)中,按照此处的指导在您的项目文件夹中安装作曲家。为了方便起见,我选择全局安装作曲家。
  2. 按照本指南中的内容安装AWS PHP SDK。
  3. 如果您遇到要求简单扩展的错误,只需yum install php-xml并重新运行AWS PHP SDK的安装。
  4. 现在您已经安装了SDK,您现在可以将您想要的文件上传到S3存储桶。

这是我上传的代码,我的供应商文件夹是根级别的php文件,用于将文件上传到S3 bucket。

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;
}
司徒运锋
2023-03-14

根据文档,S3Client类的使用如下: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的新次要版本可能会破坏您的生产应用程序。”

 类似资料:
  • 我目前正在做一个个人项目,我想上传一张个人资料图片到我的服务器上。通过以表单数据的形式发送图像,我可以轻松地将图像发送到带有postman的服务器上,但当我对其进行相同的改造时,它不起作用,有时它会创建一个1kb的文件,在打开时显示错误。 如果我提供文件到请求Body.create喜欢, 设置新配置文件pic的代码不会执行,如果我只传递URI。getPath()输入。create()方法id在服务

  • 问题内容: 我正在使用MEDIUMBLOB将图像存储在DB中。当我尝试通过servlet加载图像时,可以看到这些图像。但是,如果图像很大(1 MB或更大),我可以在浏览器中看到一半或3/4的图像。 当我下载相同的图像并将其放在公共Web内容中时,它可以完美运行。任何想法如何克服这个问题?我需要在servlet或MySQL中设置任何变量吗? (由JSF生成的)HTML代码如下: 图像servlet执

  • 遇到了一个奇怪的问题,试图通过模型内的url从这里下载任何照片->https://jsonplaceholder.typicode.com/photos,例如“https://via.placeholder.com/150/92c952”,但得到错误: 另外,如果我试图从其他链接加载图像,例如->https://avatars.mds.yandex.net/get-pdb/1088712/8b19

  • 我正在尝试上载文件,但无法工作: 有用信息:运行IIS Express(使用PHP5.3)-Windows 7 Professional 32位 代码: move_uploaded_file($_FILES[图像][名称],/图像/。$_FILES["Imagem"]["name"])或die("Error:".print_r($_FILES)); 它打印:数组([imagem]= 我确信路径是正

  • 我一直在尝试使用graph API将文件上传到一个频道。我可以使用请求https://graph.microsoft.com:443/v1.0/me/drive/root:/filename:/content成功上载到我的个人OneDrive 但是,我无法上传到一个频道。我尝试了很多组合,但不断得到invalidrequest。以下是我尝试过的一些请求: XX:xxxxxxxxxxxxxxxxxx

  • 我正在通过我的Rails4应用程序中的CarrierWave将图像上传到AWS3的桶中。我也有Cloudfront设置,它目前为我的所有statis资产提供服务(不包括公共上传)。 我如何通过Cloudfront而不是S3服务上传的图像,即使它们存储在S3桶中?我已经找到了这样的教程,但是由于我已经有一个CloudFront发行版在运行,我想知道是否应该为我的公共映像上载添加另一个,或者有没有一种