웹마스터 팁
page_full_width" class="col-xs-12" |cond="$__Context->page_full_width">
HTML,이미지,동영상 파일 열리지 않고 다운로드되도록 만들기(수정)
2004.02.19 20:18
http://micsland.com/temp/fdown.php?file=calendar.phphttp://micsland.com/temp/fdown.php?file=fdown.php오랜만에 쓰네요;;별 거 아니지만 도움이 되시길 :D
*몇번째 수정하는지;;쿨럭;;;;
=================================================================
파일 다운로드 시스템을 구현할 때 일반적으로
<?
header("location:파일명");
?>
을 사용합니다.
하지만 저것은 웹브라우저에서 열리는 일부 확장자의 경우(htm,gif,jpg,avi…)바로 열려버려 골치를 썩이게 됩니다;
이런 문제를 해결하고 바로 다운로드가 가능하도록 하는 팁을 소개할까 합니다.
의외로 아주 간단하게 헤더를 건드리는 것으로 해결됩니다;
<?
//이 헤더가 바로 다운로드시키는 역할을 합니다.
header("Content-Type: application/force-download");
//이게 없으면 저장할 때 해당 파일명으로 저장되지 않고 이 PHP파일의 이름으로 저장됩니다;;
//즉, abc.gif를 이 파일(d.php라 하죠)에서 다운로드시켜서 다운로드창이 떴을 때 abc.gif로 저장하는게 아니라 d.php로 저장하게 됩니다.
//이 헤더는 브라우저 영향도 받습니다. 익스플로러용과 非익스플로러용으로 나누어 보내줘야 합니다.
if(preg_match("/MSIE/i",getenv("HTTP_USER_AGENT"))){
header("Content-Disposition: filename=".basename("파일명").";");
}else{
header("Content-Disposition: attachment; filename=".basename("파일명").";");
}
//그다음 해당 파일을 읽어 출력합니다. 잠시동안 해당 파일로 둔갑하는라고 생각하면 쉬울까요;
readfile("파일명");
?>
저 소스가 표준은 아닙니다. 하지만 저것만으로도 충분히 잘 동작합니다;;;;;;(이런 무책임한..)
(표준은 헤더를 꽤 많이 보내던 걸로 기억하는데..어디서 봤는지 기억이 잘 안나네요;;)
링크 #1,2에서 체험(...)해 보실 수 있습니다;;;
응용입니다;;
제로보드 download.php 23번째줄에
header("location:$data[$filename]");
구문이 있네요. 이것을 당장
header("Content-Type: application/force-download");
if(preg_match("/MSIE/i",getenv("HTTP_USER_AGENT"))){
header("Content-Disposition: filename=".basename($data[$filename]).";");
}else{
header("Content-Disposition: attachment; filename=".basename($data[$filename]).";");
}
readfile($data[$filename]);
이렇게 고쳐서 쓰시면 바로 적용되겠죠..
(이것도 응용이랍시고 올렸냐?)
테스트목적이라 할지라도 절대로 아래와 같은 소스를 자신의 계정에 업로드하는 일이 없기를 바랍니다;
<?
header("Content-Type: application/force-download");
if(preg_match("/MSIE/i",getenv("HTTP_USER_AGENT"))){
header("Content-Disposition: filename=".basename($file).";");
}else{
header("Content-Disposition: attachment; filename=".basename($file).";");
}
readfile($file);
?>
*몇번째 수정하는지;;쿨럭;;;;
=================================================================
파일 다운로드 시스템을 구현할 때 일반적으로
<?
header("location:파일명");
?>
을 사용합니다.
하지만 저것은 웹브라우저에서 열리는 일부 확장자의 경우(htm,gif,jpg,avi…)바로 열려버려 골치를 썩이게 됩니다;
이런 문제를 해결하고 바로 다운로드가 가능하도록 하는 팁을 소개할까 합니다.
의외로 아주 간단하게 헤더를 건드리는 것으로 해결됩니다;
<?
//이 헤더가 바로 다운로드시키는 역할을 합니다.
header("Content-Type: application/force-download");
//이게 없으면 저장할 때 해당 파일명으로 저장되지 않고 이 PHP파일의 이름으로 저장됩니다;;
//즉, abc.gif를 이 파일(d.php라 하죠)에서 다운로드시켜서 다운로드창이 떴을 때 abc.gif로 저장하는게 아니라 d.php로 저장하게 됩니다.
//이 헤더는 브라우저 영향도 받습니다. 익스플로러용과 非익스플로러용으로 나누어 보내줘야 합니다.
if(preg_match("/MSIE/i",getenv("HTTP_USER_AGENT"))){
header("Content-Disposition: filename=".basename("파일명").";");
}else{
header("Content-Disposition: attachment; filename=".basename("파일명").";");
}
//그다음 해당 파일을 읽어 출력합니다. 잠시동안 해당 파일로 둔갑하는라고 생각하면 쉬울까요;
readfile("파일명");
?>
저 소스가 표준은 아닙니다. 하지만 저것만으로도 충분히 잘 동작합니다;;;;;;(이런 무책임한..)
(표준은 헤더를 꽤 많이 보내던 걸로 기억하는데..어디서 봤는지 기억이 잘 안나네요;;)
링크 #1,2에서 체험(...)해 보실 수 있습니다;;;
응용입니다;;
제로보드 download.php 23번째줄에
header("location:$data[$filename]");
구문이 있네요. 이것을 당장
header("Content-Type: application/force-download");
if(preg_match("/MSIE/i",getenv("HTTP_USER_AGENT"))){
header("Content-Disposition: filename=".basename($data[$filename]).";");
}else{
header("Content-Disposition: attachment; filename=".basename($data[$filename]).";");
}
readfile($data[$filename]);
이렇게 고쳐서 쓰시면 바로 적용되겠죠..
(이것도 응용이랍시고 올렸냐?)
테스트목적이라 할지라도 절대로 아래와 같은 소스를 자신의 계정에 업로드하는 일이 없기를 바랍니다;
<?
header("Content-Type: application/force-download");
if(preg_match("/MSIE/i",getenv("HTTP_USER_AGENT"))){
header("Content-Disposition: filename=".basename($file).";");
}else{
header("Content-Disposition: attachment; filename=".basename($file).";");
}
readfile($file);
?>
댓글 21
-
플로렐라
2004.02.19 20:25
오오! 원츄>_< // -
플로렐라
2004.02.19 20:28
믹스랜드로 갈일은... 없을듯한... [...]
그런데 php스크립트를 저렇게 다운로드할수있다면... ㅇ_ㅇ -
밥아저씨
2004.02.19 20:40
플로렐라// --지금 그말하려고 했다는.....
php 는 다운로드 못하나요? *-_-*;;ㅎㅎㅎㅎㅎ -
그냥이렇게。
2004.02.19 20:52
이건 당장 써먹어야 해!
그런데 소스 가져오는 건 없나요...
파일로 받지 말고... -
밥아저씨
2004.02.19 20:52
근데요 제가 -_-; 이걸로 나쁜짓을 해본결과.........
페이지 내용은 가져오는거 같네요.....
-_-;; 소스말고.....헐 ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅋㅋㅋㅋㅋㅋ -
그냥이렇게。
2004.02.19 20:52
php만 되는 건 아니겠죠?
asp도 되겠죠... ㅎㅎ -
밥아저씨
2004.02.19 20:54
이거 파일그대로 가져오면 대략 *-_-*;; 싸이트 뒤집어버리기는 시간문제......ㅋㅎ -
TheMics
2004.02.19 21:00
저 링크가 자기 자신을 다운로드시키도록 하는 내용입니다. 즉 PHP파일도 얼마든지 다운로드시킬 수 있다는 이야기죠.
링크를 하나 추가하겠습니다. http://micsland.com/temp/fdown.php?file=calendar.php입니다.
실제 http://micsland.com/temp/calendar.php를 다운로드시키는 겁니다.
물론, 권한이 있는 계정 안에서만 됩니다. 자기 계정 안의 파일만 된다고 생각하시면 됩니다.
http로 시작하는 파일의 소스를 읽어오는건 물론 100% 불가능합니다-_- -
TheMics
2004.02.19 21:08
밥아저씨//'ㅡ')? 는 제가 할 말이로군요;;;왜 그러신지요?;;;;;;;;;;;;; -
밥아저씨
2004.02.19 21:05
-
체리향기∮
2004.02.19 21:22
다시 글 올려요 -_-; /
TheMics님, 제가 찾던 소스 올려 주셔서 정말 감사드리구요,
설명도 잘 해 주셔서 편하게 적용했습니다. ^^*
PS. 제로보드에 적용하기에는 write_ok.php 에서 html 관련 확장자 체크를 빼는 방법을 올려주셨으면.. -
TheMics
2004.02.19 21:25
체리향기//아..html은 보안상 올릴 수 있도록 되면 안됩니다;;
그저 gif파일따위 바로 다운로드할 수 있도록 하는 것 정도로 쓰는게 좋겠죠:D -
플로렐라
2004.02.19 21:46
밥아저씨 // 계정의 php파일도 다운이서 보안상위험하니
조심해서 쓰자는 의미였다는...; (좀 애매했는데;)
TheMics // 처음꺼는 새창이 뜨려다가 다운로드창이 떴는데,
이번에는 새창이 완전히 떠 버리는군요 ㅇ_ㅇ -
체리향기∮
2004.02.19 21:47
TheMics/ 헉. 그런가요.. 전 이미 빼버렸는데.. 다시 복구를 해야겠다는..쿨럭; -
TheMics
2004.02.19 21:51
플로렐라//아아..알아보니 익스플로러는 헤더를 보낸 때 약간 다르더군요..수정해야겠습니다;;
(M$..왜 이렇게 만든게야..-_-+) -
플로렐라
2004.02.19 22:05
TheMics // 옷! 믹스님 만세 /ㅅ/ -
플로렐라
2004.02.20 06:24
-
まんじ
2004.02.20 09:50
반대로 무조건 열리게 해주게 해봅시다 -
앳플군
2004.02.20 12:23
<?php
/*---------------------------------------------------------------------------
* atBBS - File Downloading
*
* Create by ATply http://atply.com
* atbbs@atply.com
*
* 본 프로그램의 라이선스는 atply library 파일의 라이선스를 따릅니다.
---------------------------------------------------------------------------*/
include "_lib.php";
$conn = dbConn();
$member = member();
$data = dbQueryFetch("SELECT * FROM $_file_table WHERE no='".$_GET[no]."'");
$board = $data[board];
$_board_setting = getBoardSetting($board); // 보드 정보 얻어오기
if (!$_board_setting) Error("who are you?");
$_board_table = $_table_prefix."board_".$board;
$_index_table = $_table_prefix."board_".$board."_index";
$_comment_table = $_table_prefix."board_".$board."_comment";
$parent_data = dbQueryFetch("SELECT * FROM $_board_table WHERE no='".$data[parent]."'");
if ($parent_data[file_mode] == 1) {
Error("어떤 이유에 의해 보호된 파일입니다. 다운로드가 불가능합니다.");
}
if ($_GET[mode] != "view") {
if(eregi("(MSIE 5.0|MSIE 5.1|MSIE 5.5|MSIE 6.0)", $HTTP_USER_AGENT)) {
if(strstr($HTTP_USER_AGENT, "MSIE 5.5")) {
header("Content-Type: doesn/matter");
Header("Content-Length: ".(string)($data[size]));
Header("Content-Disposition: filename=".$data[filename]);
Header("Content-Transfer-Encoding: binary");
Header("Pragma: no-cache");
Header("Expires: 0");
}
if (strstr($HTTP_USER_AGENT, "MSIE 5.0")) {
Header("Content-type: file/unknown");
header("Content-Disposition: attachment; filename=".$data[filename]);
header("Pragma: no-cache");
header("Expires: 0");
}
if(strstr($HTTP_USER_AGENT, "MSIE 5.1")) {
Header("Content-type: file/unknown");
header("Content-Disposition: attachment; filename=".$data[filename]);
header("Pragma: no-cache");
header("Expires: 0");
}
if(strstr($HTTP_USER_AGENT, "MSIE 6.0")) {
Header("Content-type: application/x-msdownload");
Header("Content-Length: ".(string)($data[size]));
Header("Content-Disposition: attachment; filename=".$data[filename]);
Header("Content-Transfer-Encoding: binary");
Header("Pragma: no-cache");
Header("Expires: 0");
}
} else {
Header("Content-type: file/unknown");
Header("Content-Length: ".(string)($data[size]));
Header("Content-Disposition: filename=".$data[filename]);
Header("Content-Description: PHP3 Generated Data");
Header("Pragma: no-cache");
Header("Expires: 0");
}
} else {
header("Content-Type: ".$data[type]);
header("Content-Length: ".$data[size]);
}
echo _ReadFile($data[path]);
?>
참조자료 'ㅡ')v -
TheMics
2004.02.20 15:05
PHP.net에서 찾아본 결과중 하나입니다;
<?
$filename = $_GET['file']; //무지 위험한 소스네요-_-;;;
$ext = substr( $filename,-3 );
if( $filename == "" ) {
echo "ERROR: Empty file to download. USE download.php?file=[file path]";
exit;
} elseif ( ! file_exists( $filename ) ) {
echo "ERROR: File not found. USE download.php?file=[file path]";
exit;
};
switch( $ext ){
case "pdf": $ctype="application/pdf"; break;
case "exe": $ctype="application/octet-stream"; break;
case "zip": $ctype="application/zip"; break;
case "doc": $ctype="application/msword"; break;
case "xls": $ctype="application/vnd.ms-excel"; break;
case "ppt": $ctype="application/vnd.ms-powerpoint"; break;
case "gif": $ctype="image/gif"; break;
case "png": $ctype="image/png"; break;
case "jpg": $ctype="image/jpg"; break;
default: $ctype="application/force-download";
}
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Content-Type: $ctype");
$user_agent = strtolower ($_SERVER["HTTP_USER_AGENT"]);
if ((is_integer (strpos($user_agent, "msie"))) && (is_integer (strpos($user_agent, "win")))) {
header( "Content-Disposition: filename=".basename($filename).";" );
} else {
header( "Content-Disposition: attachment; filename=".basename($filename).";" );
}
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($filename));
readfile("$filename");
exit();
?>
여기서는 같은 익스플로러라 해도 윈도에서 작동하는 익스플로러에만 저 헤더를 주고있군요;
HTTP표준이 뭔지 모르니 난감할 따름(...) -
정홍길
2004.04.29 01:13
동영상은 안되는듯 하네요... ㅠㅠ
제목 | 글쓴이 | 날짜 |
---|---|---|
[초허접기초] 하드디스크 용량을 구해보자..!! [13] | SeePaGae | 2004.01.24 |
제로 카운터 ip 체크형에서 쿠키 체크 형으로 바꾸기 [8] | 정재원 | 2004.01.27 |
이미지 업로드시 자동으로 섬네일 이미지 만들어 주기 [2] | 장정식 | 2004.02.02 |
많은 txt파일 db에 한번에 저장시키기 -_-;;(별 내용없으나 필요하신분은 보세요) [1] | 추천대화상대 | 2004.02.11 |
cd키랑 비슷한거 만들기 -_-;; [12] | 추천대화상대 | 2004.02.11 |
간단한 랜덤 게시물 구하는 간단한 소스입니다. [5] | NS | 2004.02.12 |
[허접팀]랜덤 이미지 불러오기( +_+)/" [9] | 『처니리♂』 | 2004.02.12 |
한꼬마의 제로보드 활용법 (게시물 추출하기) [4] | 한꼬마 | 2004.02.17 |
HTML,이미지,동영상 파일 열리지 않고 다운로드되도록 만들기(수정) [21] | TheMics | 2004.02.19 |
여러 DB에서 최근 게시물 추출하기 위한 소스 입니다. [6] | NS | 2004.02.21 |
폴더에 사진올려놓고 리스트자동으로 만들기 [7] | 김인기 | 2004.02.22 |
[허접팁]윈엠프 리스트창에 방송정보 보여주기;;[수정]
[5]
![]() | 『처니리♂』 | 2004.02.29 |
초간단 인라이브 방송여부 알아보기 프로그램. [12] | 심심타 | 2004.03.01 |
함수] Exec 함수에 대한 간략한 설명 [3] | NS | 2004.03.05 |
PHP와 MYSQL연동 관련함수 [3] | 백무혼 | 2004.03.07 |
드디어 PHP 5 RC1 발표(04.03.18) [8] | 써니루루☆ | 2004.03.19 |
배열의 정렬에 대한 약간의 강의 [2] | ♡다솜지기♡ | 2004.04.02 |
[국에 밥말아먹는 PHP 프로그래밍] 1-1. PHP는 뭐하는 밥이냐?! (상) (Build 2) [17] | 9000㎒ | 2004.04.18 |
트랙백 구현하기 - 1. 트랙백이란 무엇인가?
[4]
![]() | TheMics | 2004.04.18 |
엔지오 채널 따라하기 -_-& www자동 붙이기 [6] | 박종찬 | 2004.04.18 |