최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday

티스토리 뷰

■ 백엔드 ■/PHP

AWS SDK for PHP

serpiko 2020. 5. 14. 15:29

  AWS SDK for PHP

 

  SDK 설치

 

!!주의. PHP 버전 5.5 이상 사용 중인지 확인

 

다음 방법으로 AWS SDK for PHP 버전 3을 설치할 수 있습니다.

  • Composer를 통한 종속 항목 이용

  • 사전 패키지된 SDK의 phar 이용 (PHP 어카이브)

  • SDK의 ZIP 파일 이용 ( 다운로드 )

 

  SDK 기본 사용법

설치 기법 Require 명령문
생성자 사용 require '/path/to/vendor/autoload.php';
phar 사용 require '/path/to/aws.phar';
ZIP 사용 require '/path/to/aws-autoloader.php';

 

 

클라이언트 만들기

require 'vendor/autoload.php';

use Aws\S3\S3Client;

use Aws\Exception\AwsException;

//Create a S3Client
$s3 = new Aws\S3\S3Client([
    'version' => 'latest',
    'region' => 'us-east-2'
]);

 

  SDK 코드 준비

<?php
    // AWS SDK for PHP => ZIP => 
    require 'lib/aws/aws-autoloader.php';

    use Aws\S3\S3Client;
    use Aws\Exception\AwsException;

   // Hard-coded credentials
    $s3Client = new S3Client([
        'version'     => 'latest',
        'region'      => 'ap-northeast-2',
        'credentials' => [
            'key'    => 'key',
            'secret' => 'key',
        ],
    ]);

 

  에러 발생

 

에러 : Call to Undefined Function idn_to_ascii()

에러 발생 위치 : GuzzleHttp : idn_to_ascii

 



에러 해결 방법 : PHP > intl 익스텐션 설치 해야 함 > 동작해야하는 함수 : idn_to_ascii()

에러 원인 : 

PHP 에서 정의되지 않은 함수 idn_to_ascii() 는 내장함수라고 생각할 수 있지만 항상 그런것이 아님에 주의해야한다

int 모듈은 PHP 에 유니코드와 인터내셔널 함수를 제공한다

또한 날짜 및 시간 형식에 유용한 많은 기능을 제공하는데

그러한 함수중의 하나가 idn_to_ascii 이다

유니코드로된 도메인 이름을 IDNA ASCII 형식으로 변환하는데 사용한다

IDNA : Internationalized Domain Name 다국어도메인

말그대로 알파벳,아랍어,중국어,키릴문자,데바 나가리을, 히브리어, 라틴어.. 

 

문자 분음 합자 프랑스어등의 UTF-8 도메인을

 

Bücher.example => xn--bcher-kva.example 으로 인코딩 된다.

 

echo idn_to_ascii('Bücher.example'); //xn--bcher-kva.example

 

 

 

 

  s3.html

 

이미지 업로드 준비

<!DOCTYPE html>
<html>
    <head> 
        <meta http-equiv="Content-Type" content="text/html;charset=utf-8" >
    </head>
    <body>
        <form enctype="multipart/form-data" action="s3_receiver.php" method="POST">
            <p><label></label><input name="bn_img" type="file" /></p>
            <p><label></label><button type="submit">업로드</button></p>
        </form>
    </body>
</html>

 

 

 

  s3_receiver.php

 

이미지 업로드

 

<?php
	define("BUCKET", "project");
	define("KEY", "AABBCCDDEEFFGGHHII");
	define("SECRET", "Qweryt+Qwertyu+qwert/Qweerrt");
	define("S3_URL", 'https://s3.ap-northeast-2.amazonaws.com/');

	//
	define("S3_PATH", 'images/');
	define("IMAGE_PATH", $_SERVER['DOCUMENT_ROOT']."/include/files/");
        
	require $_SERVER['DOCUMENT_ROOT'].'/lib/aws/aws-autoloader.php'; // /home/web/project.com/public/lib/aws/aws-autoloader.php
    
	use Aws\S3\S3Client;
	use Aws\S3\Exception\S3Exception;

	$src = $_FILES["bn_img"]['tmp_name'];
	$ext = pathinfo($_FILES["bn_img"]['name'], PATHINFO_EXTENSION);
	$filename = uniqid(rand(), TRUE).".".$ext; // 변경된이미지이름.확장자
	$org_name = $_FILES["bn_img"]['name']; // 오리지널이미지이름.확장자

	// AWS S3
	$s3Config = array(
		'credentials' => array(
			'key'     => KEY,
			'secret' => SECRET,
		),
		'region'  => 'ap-northeast-2',
		'version' => 'latest',
	);

	$s3 = Aws\S3\S3Client::factory($s3Config);

	$filepath = IMAGE_PATH.$filename; // /home/web/project.com/include/files/imgname.png

	if (!move_uploaded_file($_FILES['bn_img']['tmp_name'], $filepath)) exit('Failed to upload');

	$key = S3_PATH.$filename; // images/imgname.png

	// Upload a file.
	$result = $s3->putObject(array(
		'Bucket'       => BUCKET,
		'Key'          => $key,
		'Body'         => fopen($filepath, 'rb'),
		'ContentType'  => mime_content_type($filepath)
	));

	@unlink($filepath);
?>
	
<!DOCTYPE HTML>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html;charset=utf-8" >
    </head>
    <body>
        <pre>
            <?php
                var_dump( $result->toArray() );
            ?>
        </pre>
        <img src="<?="https://s3.ap-northeast-2.amazonaws.com/".BUCKET."/{$key}"?>" />
		<form action="s3_delete.php" method="POST">
            <input type='hidden' name='key' value='<?=$key?>' />
            <p>이미지 : <?=$key?><p>
            <p><label></label><button type="submit">삭제</button></p>
        </form>
    </body>
</html>

 

 

 

 

 

  s3_delete.php

 

업로드 된 이미지 삭제 ( 이미지가 나오지 않아야 제대로 삭제된 것임 )

 

<?php
	define("BUCKET", "project");
	define("KEY", "AABBCCDDEEFFGGHHII");
	define("SECRET", "Qweryt+Qwertyu+qwert/Qweerrt");
	define("S3_URL", 'https://s3.ap-northeast-2.amazonaws.com/');

	//
	define("S3_PATH", 'images/');
	define("IMAGE_PATH", $_SERVER['DOCUMENT_ROOT']."/include/files/");
    
	require $_SERVER['DOCUMENT_ROOT'].'/lib/aws/aws-autoloader.php'; // /home/web/project.com/public/lib/aws/aws-autoloader.php

	use Aws\S3\S3Client;
	use Aws\S3\Exception\S3Exception;
	
	
	$s3Config = array(
        'credentials' => array(
            'key'     => KEY,
            'secret' => SECRET
        ),
        'region'  => 'ap-northeast-2',
        'version' => 'latest',
    );

    $s3 = Aws\S3\S3Client::factory($s3Config);

    $sql = "select bn_img from banner where bn_idx = {$bn_idx}";
    $key = $_POST['key'];

    $s3->deleteObject([
        'Bucket' => BUCKET,
        'Key'    => $key
    ]);

?>
	
<!DOCTYPE HTML>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html;charset=utf-8" >
    </head>
    <body>
        <p>삭제가 완료되었습니다 : 이미지가 안나오면 정상입니다</p>
        <p>삭제된 이미지 : <?=$key?><p>
        <img src="<?="https://s3.ap-northeast-2.amazonaws.com/".BUCKET."/{$key}"?>" />
    </body>
</html>

 

 

 

 

 

 

'■ 백엔드 ■ > PHP' 카테고리의 다른 글

기 로그인된 세션 삭제  (0) 2019.02.19
ajax 413 Request Entity Too Large error  (0) 2018.12.07
PDO SQL 인젝션을 막기위한 처리  (0) 2018.11.22
PDO Tutorial for MySQL Developers  (0) 2018.11.22
PhpSpreadsheet  (2) 2018.07.26
댓글