본문 바로가기

PHP

파일다운로드 - 오류 수정

드디어 파일 다운로드를 고쳤다. 원인은 별거 없었지만, 몰랐기에 한참을 헤맸다. 다신 그런 일 없게하려고 기록한다.


*** 안되던 소스

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