아마존의 S3 서비스를 이용하여 php로 다운로드를 받는 API를 구현하였습니다.

그런 도중에 텍스트 파일의 인코딩 형식이 다양하여 발생하는 클라이언트 측의 오류가 있었고 이를 해결하기 위해 서버와 클라이언트를 고민하다 다양한 클라이언트에서 동작할 수 있도록 서버의 수정으로 작업하게 되었습니다.

 

[ 기존 코드]

<?php
	include '../lib/connect-s3.php'; // $s3Client
	//echo "success";


	// 변수
	$directory = addslashes($_REQUEST['directory']);
	$bucket = 'place-contents';
	$key_name = addslashes($_REQUEST['Key']);

	try {
	    // Get the object.
		$result = $s3Client->getObject([
			'Bucket' => $bucket,
			'Key'    => $key_name
		]);		
		$file_name = end(explode('/', $key_name));
		header('Content-Description: File Transfer');
	    header("Content-Type: {$result['ContentType']}");
		header('Content-Disposition: attachment; filename='.$file_name);
		header('Expires: 0');
		header('Cache-Control: must-revalidate');
		header('Pragma: public');
		echo $result['Body'];
	} catch (S3Exception $e) {
		echo $e->getMessage() . PHP_EOL;
	}
?>

- 정상적으로 다운로드를 진행하는데 echo $result['Body'] 부분을 수정하면 될 것 같습니다.

 

 

[ 인코딩 ]

- 해당 함수를 통해 변환을 하는 경우 해당 파일의 타입이 ANSI가 아니면 공백을 반환하게 됩니다.

		$encoded = iconv("CP949", "UTF-8", $result['Body']);

- 따라서 ANSI인 경우에만 인코딩을 해주고 그 외의 경우에는 그대로 출력할 수 있도록 해줍니다.

		// ANSI to UTF-8
		$encoded = iconv("CP949", "UTF-8", $result['Body']);
		if($encoded == "")
		{
			echo $result['Body'];
		}
		else
		{
			echo $encoded;
		}

 

 

[ 전체코드 ]

<?php
	include '../lib/connect-s3.php'; // $s3Client
	//echo "success";

	// 변수
	$directory = addslashes($_REQUEST['directory']);
	$bucket = 'mobile-posting';
	$key_name = addslashes($_REQUEST['Key']);

	try {
	    // Get the object.
		$result = $s3Client->getObject([
			'Bucket' => $bucket,
			'Key'    => $key_name
		]);		
		$file_name = end(explode('/', $key_name));
		
		header('Content-Description: File Transfer');
		header("Content-Transfer-Encoding", "binary");
	    header("Content-Type: {$result['ContentType']}");
		header('Content-Disposition: attachment; filename='.$file_name);
		header('Expires: 0');
		header('Cache-Control: must-revalidate');
		header('Pragma: public');		
		
		// ANSI to UTF-8
		$encoded = iconv("CP949", "UTF-8", $result['Body']);
		if($encoded == "")
		{
			echo $result['Body'];
		}
		else
		{
			echo $encoded;
		}
	} catch (S3Exception $e) {
		echo $e->getMessage() . PHP_EOL;
	}
?>

 

[다운로드 결과]

- ANSI 파일이 UTF-8 형태로 변환되어 다운로드가 잘되는 것을 볼 수 있습니다.

+ Recent posts