PHP에서 손 뗀지 꽤 되었기에 자세한 설명은 못 드리지만, 예전에 구현했던 동아리 홈페이지 소스를 꺼내 뒤져보니 자료실에 파일 다운로드를 구현한게 남아있더군요. MySQL blob 필드에 쑤셔넣었던 자료 자체와 해당 레코드의 각종 정보들을 이용해서 파일로 다운로드 받도록 만들었던 것인데, 질문하신 분의 상황에 맞게 (텍스트 파일 다운로드) 조금 수정하고 불필요한 부분을 쳐내서 보여드리겠습니다.
버튼을 누르면 이력서 내용과 원하는 파일명을 download.php에 넘겨주도록 폼을 작성합니다. (POST 방식이 적당할 듯 합니다.)
만일 제대로 작동하지 않는다면 Content-type 헤더의 내용을 "application/octet-stream"으로 바꿔보시기 바랍니다. (제 원래 소스에는 application/octet-stream으로 되어있었는데, 지금은 다운로드 대상이 html 문서라고 하셨기에 테스트 없이 즉석에서 바꿔본 것입니다.)
Content-Disposition 헤더가 핵심입니다. 이것이 attachment가 아닌 "inline"으로 되어있으면 다운로드되지 않고 브라우저 창에 쭈루룩 뿌려집니다. (이미지 파일은 없고 문자열화된 이미지 데이터만 가지고있을 때 img 태그의 src 속성에 값으로 채워주기 위한 "이미지 파일인 척하는 스크립트"를 만들 때 유용합니다만, 지금 경우에는 해당되지 않습니다.) 만일 페이지 인코딩이 UTF-8이고 다운로드 파일명은 EUC-KR 인코딩을 원하신다면
CTE 헤더는 원래 SMTP 전용이며 HTTP에는 안쓰이는걸로 알고있는데, 제 소스에 들어있길래 일단 써두었습니다. (없어도 될지도 모르며, html 파일을 다운받을 때에는 헤더 내용이 binary면 안될지도 모릅니다.)
Content-Length를 빠뜨리시면 제대로 다운로드되지 않거나 혹은 최소한 다운로드 상태창이 남은 다운로드 용량을 계산하지 못합니다.
나머지 헤더들은 필요했던것 같기는 한데 정확히 뭔지 기억나지 않아서 설명해드리지 못하겠습니다.
마지막으로, 브라우저로 직접 읽는 웹 페이지에 뿌리듯이 원하는 내용을 뿌리시면 됩니다. (위 예제에서는 echo로 문자열을 뿌렸습니다.) 다만, 내용 중에 이미지가 포함되어있는 등 순수 텍스트가 아닐 경우에는 Content-Length를 계산할 때 약간의 추가 작업이 필요하겠죠.)
대략 이것이 다운로드 구현의 큰 줄기이긴 하지만, 이미 실토했듯이 위 소스는 지금 테스트해보지 않은 오래된 기록일 뿐입니다. 더 자세하고 올바른 내용은 phpschool 등을 참조하셔요~.
PS: (이력서니까 당연히) 이미지가 포함되어 있으면 어차피 이 사진은 따로 (별도의 파일로) 저장해야한다고 생각합니다. 즉, 이미지를 html 파일 내에 embed시킬 방법은 없는 것으로 압니다. PHP만을 이용해서 이렇게 원클릭으로 둘 이상의 파일들을 따로 저장하게 만들기 위해서는 스크립트가 무척 복잡해질 수도 있고, 심지어 하나의 스크립트만으로는 힘들 수도 있습니다. (redirect 등을 이용해서 둘 이상의 스크립트들을 자동적으로 옮겨다니며 실행하게 만들어야할지도 모릅니다.) 이렇게까지 하느니, 그냥 브라우저에 있는 페이지 저장 기능을 사용하게 유도하거나, PHP 외에 클라이언트 측 스크립트의 도움이 필요할지도 모르겠습니다.
현재 가지고 계신 계획이나 설계 취지 등에 부합하지 않을지도 모르지만 한 가지 제안을 해보자면, 아예 이미지를 내장하는 형식의 파일(예를 들면 pdf)이나 그 내용을 자동 생성해서 다운로드 받게 만드는건 어떨까 합니다. PHP에 들어있는 몇 가지 pdf 지원 기능들을 쓰면 어떻게 되지 않을까 싶습니다만, 이론적으로 가능하지 않을까 생각할 뿐이고 제가 실제로 해본적은 없습니다. 일단 pdf 파일 내용을 생성하는 일만 끝나면, 그 내용을 원하는 파일명으로 저장하게 만드는 버튼을 구현하는 것은 위에 설명한 대로입니다. (Content-type 헤더만 적절히 바꿔주시면 되겠습니다.)
[/][/][/]
-- 자본주의, 자유민주주의 사회에서는 결국 자유마저 돈으로 사야하나보다.
사줄테니 제발 팔기나 해다오. 아직 내가 "사겠다"고 말하는 동안에 말이다!
PHP에서 손 뗀지 꽤 되었기에 자세한 설명은 못 드리지만, 예전에 구현
PHP에서 손 뗀지 꽤 되었기에 자세한 설명은 못 드리지만, 예전에 구현했던 동아리 홈페이지 소스를 꺼내 뒤져보니 자료실에 파일 다운로드를 구현한게 남아있더군요. MySQL blob 필드에 쑤셔넣었던 자료 자체와 해당 레코드의 각종 정보들을 이용해서 파일로 다운로드 받도록 만들었던 것인데, 질문하신 분의 상황에 맞게 (텍스트 파일 다운로드) 조금 수정하고 불필요한 부분을 쳐내서 보여드리겠습니다.
- 버튼을 누르면 이력서 내용과 원하는 파일명을 download.php에 넘겨주도록 폼을 작성합니다. (POST 방식이 적당할 듯 합니다.)
- 이력서 내용을 담은 변수명을 "con"이라고 하겠습니다.
- 원하는 파일명을 담은 변수명을 "fn"이라고 하겠습니다.
- download.php를 대략 다음과 같이 작성합니다:
- 알고 계시겠지만, header들이 전송되기 전에는 어떠한 출력도 있어서는 안됩니다.
- 만일 제대로 작동하지 않는다면 Content-type 헤더의 내용을 "application/octet-stream"으로 바꿔보시기 바랍니다. (제 원래 소스에는 application/octet-stream으로 되어있었는데, 지금은 다운로드 대상이 html 문서라고 하셨기에 테스트 없이 즉석에서 바꿔본 것입니다.)
- Content-Disposition 헤더가 핵심입니다. 이것이 attachment가 아닌 "inline"으로 되어있으면 다운로드되지 않고 브라우저 창에 쭈루룩 뿌려집니다. (이미지 파일은 없고 문자열화된 이미지 데이터만 가지고있을 때 img 태그의 src 속성에 값으로 채워주기 위한 "이미지 파일인 척하는 스크립트"를 만들 때 유용합니다만, 지금 경우에는 해당되지 않습니다.) 만일 페이지 인코딩이 UTF-8이고 다운로드 파일명은 EUC-KR 인코딩을 원하신다면
으로 조작하시면 됩니다.- CTE 헤더는 원래 SMTP 전용이며 HTTP에는 안쓰이는걸로 알고있는데, 제 소스에 들어있길래 일단 써두었습니다. (없어도 될지도 모르며, html 파일을 다운받을 때에는 헤더 내용이 binary면 안될지도 모릅니다.)
- Content-Length를 빠뜨리시면 제대로 다운로드되지 않거나 혹은 최소한 다운로드 상태창이 남은 다운로드 용량을 계산하지 못합니다.
- 나머지 헤더들은 필요했던것 같기는 한데 정확히 뭔지 기억나지 않아서 설명해드리지 못하겠습니다.
- 마지막으로, 브라우저로 직접 읽는 웹 페이지에 뿌리듯이 원하는 내용을 뿌리시면 됩니다. (위 예제에서는 echo로 문자열을 뿌렸습니다.) 다만, 내용 중에 이미지가 포함되어있는 등 순수 텍스트가 아닐 경우에는 Content-Length를 계산할 때 약간의 추가 작업이 필요하겠죠.)
대략 이것이 다운로드 구현의 큰 줄기이긴 하지만, 이미 실토했듯이 위 소스는 지금 테스트해보지 않은 오래된 기록일 뿐입니다. 더 자세하고 올바른 내용은 phpschool 등을 참조하셔요~.PS: (이력서니까 당연히) 이미지가 포함되어 있으면 어차피 이 사진은 따로 (별도의 파일로) 저장해야한다고 생각합니다. 즉, 이미지를 html 파일 내에 embed시킬 방법은 없는 것으로 압니다. PHP만을 이용해서 이렇게 원클릭으로 둘 이상의 파일들을 따로 저장하게 만들기 위해서는 스크립트가 무척 복잡해질 수도 있고, 심지어 하나의 스크립트만으로는 힘들 수도 있습니다. (redirect 등을 이용해서 둘 이상의 스크립트들을 자동적으로 옮겨다니며 실행하게 만들어야할지도 모릅니다.) 이렇게까지 하느니, 그냥 브라우저에 있는 페이지 저장 기능을 사용하게 유도하거나, PHP 외에 클라이언트 측 스크립트의 도움이 필요할지도 모르겠습니다.
현재 가지고 계신 계획이나 설계 취지 등에 부합하지 않을지도 모르지만 한 가지 제안을 해보자면, 아예 이미지를 내장하는 형식의 파일(예를 들면 pdf)이나 그 내용을 자동 생성해서 다운로드 받게 만드는건 어떨까 합니다. PHP에 들어있는 몇 가지 pdf 지원 기능들을 쓰면 어떻게 되지 않을까 싶습니다만, 이론적으로 가능하지 않을까 생각할 뿐이고 제가 실제로 해본적은 없습니다. 일단 pdf 파일 내용을 생성하는 일만 끝나면, 그 내용을 원하는 파일명으로 저장하게 만드는 버튼을 구현하는 것은 위에 설명한 대로입니다. (Content-type 헤더만 적절히 바꿔주시면 되겠습니다.)
[/][/][/]--
자본주의, 자유민주주의 사회에서는 결국 자유마저 돈으로 사야하나보다.
사줄테니 제발 팔기나 해다오. 아직 내가 "사겠다"고 말하는 동안에 말이다!
우와!!!!! 이렇게 정성스럽게 답변해 주시다니 정말 감사 합니
정말 감사 합니다.
이렇든 정성을 베풀어 주시니 정말 감격 스럽습니다.
알려주신대로 최대한 해 보겠습니다
얼핏 보니 이메일 보낼때 첨부물 만드는 그런 방식 같군요.
온갖 노력을 다하여 구현 해 보겠습니다.
다 끝나면 이곳에 다시 알려드리겠습니다.
정말 감사합니다.
살며 그리고 사랑하며...
정보는 공유할때 그 가치가 있는것.....
나의 조그만 지식공유는 남에게 엄청난 기쁨을 안겨 준다.
댓글 달기