php를 이용해 zip파일 다운로드시 윈도 기본 압축 및 알집에서 제대로 열리지 않는 문제
php를 이용해 서버상의 파일을 다운로드 하도록 했을 때, 일반적인 파일을 여는데엔 문제가 없으나 zip 압축파일을 열 때 아래와 같은 오류와 함께 압축을 풀 수 없는 현상이 있습니다.
특이한 점은 반디집 으로는 정상적으로 열리는데, 알집이나 윈도8이상의 기본 압축도구로는 열리지 않는 문제입니다.
php의 다운로드 소스는 대략 다음과 같습니다.
<?php
function mb_basename($path) { return end(explode('/',$path)); }
function utf2euc($str) { return iconv("UTF-8","euc-kr", $str); }
function is_ie() {
if(!isset($_SERVER['HTTP_USER_AGENT']))return false;
if(strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false) return true; // IE8
if(strpos($_SERVER['HTTP_USER_AGENT'], 'Trident') !== false) return true; // IE11
return false;
}
$fp = $_REQUEST['fp']; // filename
// 폴더명 지정
$filepath = "/data/report/".$fp;
$filesize = filesize($filepath);
$filename = mb_basename($filepath);
if( is_ie() ) $filename = utf2euc($filename);
header("Pragma: public");
header("Expires: 0");
//header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"$filename\"");
header("Content-Transfer-Encoding: binary");
header("Content-Length: $filesize");
readfile($filepath);
?>
문제가 되는 구문은 헤더 정의 부분에 있습니다. header("Content-Type: application/octet-stream"); 에서 octet-stream 을 사용하면 이와 같은 현상이 발생합니다.
여기서는 모든 파일 다운로드를 zip으로 제공했었기 때문에 위 구문을 주석처리 하는 것으로 간단히 해결 되었습니다만,
다른 확장자도 다운로드 해야 할 경우에는 파일이름에서 확장자를 확인해서 zip일 경우와 그렇지 않을 경우에 대해 Content-Type을 따로 지정해 주면 됩니다.
참고 URL : https://stackoverflow.com/questions/10681844/php-zip-file-download