파일 다운로드 대화 상자란?
웹 서비스를 개발하다 보면, 사용자가 링크를 클릭했을 때 실제 파일 내용을 화면에 바로 표시하는 대신 "파일 다운로드" 대화 상자가 나타나도록 하고 싶은 경우가 있습니다. 예를 들어 텍스트 파일이나 이미지처럼 브라우저가 열 수 있는 파일이라도, 클릭 즉시 저장되도록 유도하고 싶을 때가 그렇습니다.
이 기능은 HTTP 헤더만으로 아주 간단하게 구현할 수 있으며, 일반적인 콘텐츠 출력용 헤더와는 조금 다른 방식의 헤더를 사용합니다.
HTTP 헤더 설정 방법
핵심은 두 가지 헤더입니다.
- Content-Type: application/octet-stream — 브라우저에게 이 응답이 실행 가능한 특정 형식이 아니라 일반 바이너리 데이터임을 알려줍니다.
- Content-Disposition: attachment — 브라우저에게 내용을 화면에 표시하지 말고 첨부 파일로 다운로드하라고 지시합니다.
예를 들어, 특정 링크를 통해 FileName이라는 파일을 다운로드할 수 있게 하려면 다음과 같이 작성합니다.
#!/usr/bin/python
# HTTP Header
print "Content-Type:application/octet-stream; name = \"FileName\"\r\n";
print "Content-Disposition: attachment; filename = \"FileName\"\r\n\n";
# Actual File Content will go here.
fo = open("foo.txt", "rb")
str = fo.read();
print str
# Close opend file
fo.close()코드 설명
- Content-Type 헤더:
application/octet-stream으로 지정하여 브라우저가 파일을 텍스트나 이미지로 해석하지 않고 다운로드 대상으로 인식하게 합니다. - Content-Disposition 헤더:
attachment옵션과 함께filename을 지정하면, 다운로드 시 저장될 기본 파일 이름까지 설정할 수 있습니다. - 파일 읽기 및 출력:
open()함수로 파일을 바이너리 모드(rb)로 연 뒤 내용을 읽어 출력하고, 작업이 끝나면 반드시close()로 파일을 닫아 리소스 누수를 방지합니다.
참고 사항
위 코드는 Python 2 스타일의 print 문을 사용합니다. Python 3 환경에서는 print() 함수 형태로 수정해야 하며, CGI 방식 대신 Flask나 Django 같은 웹 프레임워크를 사용한다면 각 프레임워크가 제공하는 파일 응답 기능(예: Flask의 send_file)을 활용하는 것이 더 안전하고 편리합니다.
이 튜토리얼이 도움이 되었기를 바랍니다. 피드백이 있다면 언제든지 문의 페이지를 통해 알려주세요.