簡體   English   中英

無法通過 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.ZFC35FDC70D5FC69D236988C3

use Aws\S3\S3Client;

$options = [
    'region'            => 'us-east-1',
    'version'           => '2006-03-01',
    'signature_version' => 'v4'
];

$s3Client = new S3Client($options);

它還說,“我們不建議在生產應用程序中使用最新版本,因為引入包含 API 更新的 SDK 的新次要版本可能會破壞您的生產應用程序。”

我解決了它,但我使用了作曲家。 所以這里有一個分步指南。

這是假設您已創建具有完全 S3 訪問權限或至少附加了 PutObject 策略的 IAM 角色,並且 IAM 角色已附加到 EC2 實例。 此外,您的 EC2 實例已安裝 web 服務器。

  1. 在 EC2 實例/var/www/html (您的 web 服務器托管您的網頁的文件夾)中,按照此處在您的項目文件夾中的指導安裝 composer。 為了方便起見,我選擇全局安裝 composer。
  2. 按照本指南中的說明安裝 AWS PHP SDK。
  3. 如果您遇到要求 simplexml 擴展的錯誤,只需yum install php-xml並重新運行 AWS PHP SDK 的安裝。
  4. 現在您已經安裝了 SDK,您現在可以將所需的文件上傳到 S3 存儲桶。

這是我的上傳代碼,我的供應商文件夾是根級別的,其中 php 文件用於將文件上傳到 S3 存儲桶。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM