Create TOC

2006년 3월 16일

파일 이름이 깨지지 않도록 HTTP Header 처리하기

opera등의 웹브라우저에서 파일 다운로드시 파일명이 깨지는 경우가 있다.

파일명에 한글이 들어가 있고 파일 직접 링크가 아니고 별도 서버 프로그램(php 등)을 통해서 다운 받는 경우 발생하는데, 서버쪽 프로그램을 수정해줘야 한다.

php 경우 아래처럼 수정해주면 된다.

<?php
$fname = "파일명";
function id_browser() {
    $browser=$_SERVER['HTTP_USER_AGENT'];

    if(ereg('Opera(/| )([0-9].[0-9]{1,2})', $browser))
    {
        return 'OPERA';
    }
    else if(ereg('MSIE ([0-9].[0-9]{1,2})', $browser))
    {
        return 'IE';
    }
    else if(ereg('OmniWeb/([0-9].[0-9]{1,2})', $browser))
    {
        return 'OMNIWEB';
    }
    else if(ereg('(Konqueror/)(.*)', $browser))
    {
        return 'KONQUEROR';
    }
    else if(ereg('Mozilla/([0-9].[0-9]{1,2})', $browser))
    {
        return 'MOZILLA';
    }
    else
    {
        return 'OTHER';
    }
}

$browser = id_browser();

$download_size = filesize($fname);
header("Content-Type: application/x-download");
if ($browser == 'IE')
{
    header("Content-Disposition: attachment; filename=" . urlencode(iconv("cp949", "utf-8", $fname)) );
}
else
{
    header("Content-Disposition: attachment; filename=" . iconv("cp949", "utf-8", $fname) );
}
header("Accept-Ranges: bytes");
header("Content-Transfer-Encoding: binary");
header("Content-Length: " . $download_size );

@readfile($fname);
?>

HTTP 헤더중 Content-Disposition: 에 파일 이름을 기술하는데 브라우저마다 인식하는 방법이 다르기 때문에 별도 처리들 해줘야 한다.

IE 경우는 utf-8 문자열을 urlencode 해줘야 하고, Opera나 Firefox 는 그냥 utf-8 로 써주면 된다.