English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
이 튜토리얼에서는 PHP를 사용하여 파일을 강제로 다운로드하는 방법을 배웁니다.
보통, 이미지, zip 파일, pdf 문서, exe 파일 등과 같은 파일을 다운로드할 때 서버 측 스크립트 언어(예: PHP)를 사용하지 않아도 됩니다. 이러한 파일이 공개적으로 접근할 수 있는 폴더에 저장되어 있다면, 해당 파일을 가리키는 하이퍼링크만 생성하면 됩니다. 사용자가 링크를 클릭할 때마다 브라우저가 자동으로 파일을 다운로드합니다.
sample.jpg">이미지 파일 다운로드</test.zip">다운로드 Zip 파일</a> sample.jpg">이미지 파일 다운로드</masters.pdf">다운로드 PDF 파일</a> sample.jpg">이미지 파일 다운로드</<a href="downloads/a> sample.jpg">이미지 파일 다운로드</<a href="downloads/a>
PDF나 이미지 파일을 가리키는 링크를 클릭하면 하드디스크 드라이브에 직접 다운로드되지 않습니다. 브라우저에서 파일을 열어줍니다. 또한, 파일을 하드디스크에 저장할 수도 있습니다. 하지만, 기본적으로 zip과 exe 파일은 자동으로 하드디스크 드라이브에 다운로드됩니다.
PHP readfile() 함수를 사용하여 이미지나 다른 유형의 파일을 사용자의 하드디스크에 강제로 다운로드할 수 있습니다. 여기서는 사용자가 브라우저에서 이미지 파일을 클릭하여 다운로드할 수 있는 간단한 이미지 라이브러리를 만들어 보겠습니다.
이름을 'image'으로 만들어 보겠습니다.-gallery.php” 파일에 다음 코드를 넣습니다.
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Simple Image Gallery/<title> <style type="text/css"> .img-box{ display: inline-block; text-align: center; margin: 0 15px; } </<style> </<head> <?php //예제 이미지 파일 이름을 포함한 배열 $images = array("kites.jpg", "balloons.jpg"); //배열을 순회하여 이미지 라이브러리를 생성합니다 foreach($images as $image){ echo '<div class="img-box">'; echo '<img src="images/' . $image . '" width="200" alt="' . pathinfo($image, PATHINFO_FILENAME) . '">'; echo '<p><a href="download.html?file=' . urlencode($image) . '">다운로드</a></p>'; echo '</div>'; } ?> </<html>
위의 예제 코드를 꼼꼼히 확인하면 'download.php' 파일을 가리키는 다운로드 링크가 있음을 발견할 수 있습니다. 이 URL은 쿼리 문자로 이미지 파일 이름도 포함하고 있습니다. 또한, PHP urlencode() 함수를 사용하여 이미지 파일 이름을 인코딩하여 URL 파라미터로 안전하게 전달할 수 있도록 합니다. 파일 이름에는 URL에서 안전하지 않은 문자가 포함될 수 있습니다.
이것은 "download.php" 파일의 전체 코드로, 이미지를 강제로 다운로드할 수 있습니다.
<?php if(isset($_REQUEST["file"])){ //파라미터를 가져옵니다 $file = urldecode($_REQUEST["file"]); //URL 인코딩된 문자열을 디코딩합니다 /* 파일 이름이 불법 문자를 포함하는지 테스트합니다 예를 들어 정규 표현식의 " ../” */ if(preg_match('/^[^.][-a--9_.]+-z]$/i', $file)){ $filepath = "images/" . $file; // 다운로드 프로세스 if(file_exists($filepath)) { header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="'.basename($filepath).'"'); header('Expires: 0'); header('Cache-Control: must-revalidate'); header('Pragma: public'); header('Content-Length: ' . filesize($filepath)); flush(); //시스템 출력 버퍼를 씻습니다 readfile($filepath); die(); } else { http_response_code(404); die(); } } else { die("잘못된 파일 이름!"); } } ?>
동일하게, 다른 파일 형식을 강제로 다운로드할 수도 있습니다. 예를 들어, .doc, .pdf 파일 등.
위의 예제(제8줄)내부의 정규 표현식은 파일 이름이 점 문자(.)로 시작하거나 끝나는 이름을 완전히 허용하지 않습니다. 예를 들어, kites.jpg 또는 Kites.jpg, myscript.min.js와 같은 파일 이름을 사용할 수 있지만, kites.jpg. 또는 .kites.jpg와 같은 파일 이름을 사용할 수 없습니다.
관련 내용을 확인하십시오정규 표현식의 튜토리얼을 통해 정규 표현식을 자세히 이해하세요.