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


+ Recent posts