아마존의 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 형태로 변환되어 다운로드가 잘되는 것을 볼 수 있습니다.