Webi Blog

웹아이에서 운영되고 있는 블로그입니다.

Server/AWS

PHP를 이용해 AWS S3 스토리지에 파일 업로드 하기

웹아이 2021. 8. 31. 11:16

 

요즘 AWS를 이용해 서버를 구축하시는 분들이 많습니다.

AWS에서 제공되는 많은 서비스 중 오늘은 PHP를 이용하여 AWS의 S3 스토리지에 파일을 업로드하는 방법에 대해 포스팅합니다.

S3 스토리지에 직접 업로드하는 방식이 아닌 PHP 코드로 파일 URL 또는 Form을 통한 파일 업로드하는 방식입니다.

 

우선 AWS에서 제공하는 SDK를 설치해야 합니다.

 

AWS PHP SDK : https://docs.aws.amazon.com/aws-sdk-php/v3/guide/getting-started/installation.html

 

Installing the AWS SDK for PHP Version 3 - AWS SDK for PHP

Using PHP with the Suhosin patch is not recommended, but is common on Ubuntu and Debian distributions. In this case, you might need to enable the use of phars in the suhosin.ini. If you don’t do this, including a phar file in your code will cause a silen

docs.aws.amazon.com

 

위 주소로 들어가면 여러 가지의 설치 방법들을 소개해주는데요. 저는 제일 하단에 FTP 다운로드 방식으로 했습니다.

Installing by Using the ZIP file 섹션의 설명글에 보시면 download the .zip file 링크를 통해 다운로드하실 수 있습니다.

 

다운로드하신 파일을 서버에 업로드해주시기만 하면 끝!!

 

파일을 업로드하셨다면 PHP 코드를 작성해야겠죠?

 

 

1. URL 주소를 통해 업로드하는 경우

<?php
// 다운로드한 SDK 파일의 autoloader를 불러옵니다. 저는 그누보드에 사용해서 G5_PATH를 이용했습니다.
include_once(G5_PATH.'/aws/aws-autoloader.php');

// AWS S3에 파일 업로드할 때 필요한 클래스들을 불러옵니다.
use Aws\S3\S3Client;
use Aws\Exception\AwsException;
use Aws\Credentials\CredentialProvider;

// 파일 업로드 하기 전 설정
$s3Client = S3Client::factory(array(
  'region' => 'ap-northeast-2', // S3 리전을 입력합니다.(저는 서울 리전)
  'version' => 'latest',
  'signature' => 'v4',
  'credentials' => [
    'key'    => 'AWS IAM 에서 등록한 사용자의 Key', 
    'secret' => 'AWS IAM 에서 등록한 사용자의 Secret Key',
  ],
));


// URL 주소를 통해 업로드 할 경우 아래와 같이 사용됩니다.
$s3_path = 'test/test.png'; // 업로드할 위치와 파일명 입니다.
$file_url = 'http://domain.com/image/test.png'; // 업로드할 이미지의 URL 주소 입니다.
$file_data = file_get_contents($file_url); // URL주소로 부터 데이터를 받아옵니다.
$result = $s3Client->putObject(array(
  'Bucket' => '업로드 하려는 버킷명',
  'Key'    => $s3_path,
  'Body'   => $file_data,
  'ACL'    => 'public-read'
));

 

2. Form 전송을 통한 업로드

<?php
// 다운로드한 SDK 파일의 autoloader를 불러옵니다. 저는 그누보드에 사용해서 G5_PATH를 이용했습니다.
include_once(G5_PATH.'/aws/aws-autoloader.php');

// AWS S3에 파일 업로드할 때 필요한 클래스들을 불러옵니다.
use Aws\S3\S3Client;
use Aws\Exception\AwsException;
use Aws\Credentials\CredentialProvider;

// 파일 업로드 하기 전 설정
$s3Client = S3Client::factory(array(
  'region' => 'ap-northeast-2', // S3 리전을 입력합니다.(저는 서울 리전)
  'version' => 'latest',
  'signature' => 'v4',
  'credentials' => [
    'key'    => 'AWS IAM 에서 등록한 사용자의 Key', 
    'secret' => 'AWS IAM 에서 등록한 사용자의 Secret Key',
  ],
));


// Form 전송을 통해 업로드 할 경우에는 아래와 같이 사용됩니다.
$s3_path = 'test/test.png'; // 업로드할 위치와 파일명 입니다.
$file_path = $_FILES['file']['tmp_name']; // Form 전송을 통해 받은 데이터 입니다.
$result = $s3Client->putObject(array(
  'Bucket' => '업로드 하려는 버킷명',
  'Key'    => $s3_path,
  'SourceFile' => $file_path,
  'ACL'    => 'public-read'
));

 

위와 같이 코드를 작성하시고 실행해보시면 S3 스토리지에 파일이 업로드되신 걸 확인하실 수 있습니다.

$result 변수를 print_r()로 확인해보시면 성공 여부와 파일 접근 경로 등 여러 가지 정보들을 얻을 수 있습니다.

근데 저는 파일 업로드가 실패했을 때도 항상 200 성공으로만 나오네요;;;

 

어렵게만 느껴지는 AWS인데 생각보다 간단하게 업로드를 할 수 있었습니다.

 

반응형