드디어 파일 다운로드를 고쳤다. 원인은 별거 없었지만, 몰랐기에 한참을 헤맸다. 다신 그런 일 없게하려고 기록한다.
*** 안되던 소스
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | <?php //DB 연결 require_once("/usr/local/apache/htdocs/dbconfig.php"); $seq = $_GET['file_seq']; $sql = "SELECT * FROM file WHERE file_seq = ".$seq; $result = mysql_query($sql, $db); $row = mysql_fetch_assoc($result); $filename = $row['name_org']; $name_org = str_replace( " ","+", $filename ); // 공백문자의 제거(권장) $name_save = $row['name_save']; $fileDir = "/usr/local/apache/htdocs/uploads"; $fullPath = $fileDir."/".$name_save; $size = filesize($fileDir); //이 헤더가 바로 다운로드시키는 역할 header("Content-Type: application/octet-stream"); //header("Content-Type: application/force-download"); //header("Content-type: application/x-msdownload"); //header('Content-Type: application/x-octetstream'); //header('Content-Type: application/pdf'); //header("Content-Type: file/unknown"); header("Content-Disposition: attachment; filename=".$name_org.""); //한글 깨짐 방지 //header("Content-Disposition: attachment; filename=".iconv('UTF-8', 'CP949', $name_org)); //header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); //header("Cache-Control: public"); header("Content-Transfer-Encoding: binary"); header("Content-Length: ".$size); Header("Cache-Control: cache, must-revalidate"); header("Pragma: no-cache"); //header("Pragma: public"); header("Expires: 0"); $fh = fopen($fullPath, "rb"); fpassthru($fh); fclolse($fh); ?> | cs |
위 소스로하면, 다음처럼 이 파일 형식은 지원되지 않는다고 뜬다. 검색해보니 사람들마다 header를 다르게 쓰기에 거기에 문제가 있는줄 알고 공부하고, 여러 방법을 다 써보았다. 하지만 똑같았다.
결국 원인은 경로 문제와 파일 명 문제였다.
위의 소스대로하면, 경로는 아무런 문제가 없으나 파일명이 저장 시 임시로 사용하는 이름으로 되었기에 제대로 찾지못하였던 것이다. 이미지 파일 형식은 물론 pdf나 txt 파일을 제외한 나머지 형식에서 모두 오류가 발생했었다. txt는 왜 되었는지는 모르지만..
앞으로 모르면 어려운거 찾기보다는 쉬운데서부터 확인해보아야겠다.
***되는 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | <?php //DB 연결 require_once("/usr/local/apache/htdocs/dbconfig.php"); $seq = $_GET['file_seq']; $sql = "SELECT * FROM file WHERE file_seq = ".$seq; $result = mysql_query($sql, $db); $row = mysql_fetch_assoc($result); $filename = $row['name_org']; $name_save = $row['name_save']; $fileDir = "/usr/local/apache/htdocs/uploads"; $fullPath = $fileDir."/".$filename; $size = filesize($fullPath); header("Content-Type: application/octet-stream"); header("Content-Disposition: attachment; filename=".$filename.""); header("Content-Transfer-Encoding: binary"); header("Content-Length: ".$size); header("Cache-Control: cache, must-revalidate"); header("Pragma: no-cache"); header("Expires: 0"); $fh = fopen($fullPath, "r"); fpassthru($fh); fclolse($fh); ?> | cs |
파일 명과 경로 또한 중요하며, 크기($size) 또한 중요하다. 저 부분을 바꾸지 않아 사진의 일부만 출력되었으니....
'PHP' 카테고리의 다른 글
파일 다운로드(header) (1) | 2018.11.21 |
---|---|
파일 다운로드 (0) | 2018.11.20 |
파일 업로드 (0) | 2018.11.20 |
rownum 사용 (0) | 2018.11.19 |
form과 post 방식 (0) | 2018.11.17 |