skip menu and go to main content

body start

JSBoard

Resolved  파일 다운로드할 때에 MIME type을 file/unknown으로 내보내는 문제 14 ]

06.07.12-17:26:18

301258

Submitted by Jungshik Shin

Assignee 김정균

View2408

Priority3

KTUG에 있는 2.0.11을 보면 PDF 파일을 다운로드할 때, Content-Type에 항상 file/unknown을 내보냅니다. 2.0.12와 2.0.13의 ChangeLog를 보아도 이에 대한 얘기가 없어서 2.0.13도 마찬가지 문제를 가지고 있을 것 같기에 버그 보고를 합니다. 혹시, KTUG에 설치한 분이 설정을 잘못한 것이라면 죄송합니다. (제가 2.0.13을 다운로드해서 소스를 본 뒤에 버그 리포트를 해야 하는데... 게을러서)

파일을 올릴 때에 흔히 많이 올리는 파일 형식 몇 개를 고를 수 있도록 해 주고 (bugzilla에서 attach를 할 때 쓰는 방법입니다), 거기에 없는 파일에 대해서는 직접 MIME type을 기입할 수 있는 옵션(이 부분은 보안 등의 이유로 제공하지 않을 수 있는 옵션 제공)을 주면 좋겠습니다. DB에는 파일의 MIME type을 같이 기억하고 있다가 다운로드할 때에는 맞는 MIME type을 내보내도록 하고요.

사용자가 이런 것은 너무 어려워서 못 한다고 생각한다면, 최소한 서버측에서 'sniffing'을 하든 확장자를 이용한 매핑을 하든 해서 맞는 MIME type을 HTTP 헤더로 내보내 주면 좋겠습니다.


Mile Stone : 2.0

Severity : Enhancement

Resolution : Fixed

Comments on this artfact

14 Comments

김정균

jsboard 의 download 의 mime type 이 file/unknown 인 이유는, 무조건 다운로드가 되도록 하기 위함입니다. 물론, php 의 stream 을 이용하여 attach file 을 처리할 경우, 각 파일의 mime type 을 알아내야 하는 문제가 있는데, 정식님이 건의 하신 방법도 한가지고, magic library 를 이용하여 자동으로 처리하도록 하는 것도 한 방법입니다.

다만, jsboard 설계시에, php stream 으로 다운하는 경우 무조건 file/unknown 으로 되어 있는 이유는, 무조건 다운로드를 받게 하기 위함입니다. 만약 각 파일의 mime type 대로 처리가 되도록 하고 싶다면, jsboard 의 각 게시판 설정에서 $cupload['dnlink'] 의 값을 1로 설정을 하면, 직접 링크가 걸리기 때문에, 웹브라우저의 mime type 을 이용하여 해당 파일의 mime type 을 처리할 수 있습니다.

그러므로, KTUG 관리자분께, $cupload['dnlink'] 값을 변경해 달라고 요청을 하면 될 듯 싶습니다. 또는, 다운로드 경로를 숨기기 위해 php stream 을 통하여 처리를 하고 싶다면, php 의 magic library 를 이용하여 자동으로 mime type 을 처리하도록 살짝 패치를 하면 될 듯 싶기도 하네요.

그리고, mime type 을 입력 받는 방식은, db 구조의 변화가 있어야 하는 관계로.. 좀 버겁습니다. 일단, magic library 를 활용할 수 있는 방법을 강구해 보도록 하지요.

06.07.13-00:12:12

김정균

"Assigned To" was changed from "Nobody" to "김정균"

06.07.13-00:12:12

Jungshik Shin

빠른 답변 감사 드립니다. 말씀하신 것처럼 magic library를 써서 HTTP 헤더에 올바른 C-T를 적어서 내보내 주시면 좋겠습니다. (제가 마지막 단락에 적은 게 그런 취지였습니다.)

06.07.13-00:55:58

김정균

2.0.14-dev 에 해당 부분을 fileinfo extension 을 사용할 수 있도록 패치를 해 놓았습니다.

ktug 관리자에게

http://kldp.net/plugins/scmcvs/cvsweb.php/jsboard-2/act.php.diff?r1=1.59;r2=1.60;cvsroot=jsboard

의 패치를 적용해 달라고 요청 하십시오. ktug 서버에는 fileinfo extension 이 설치되어 있기 때문에, 위의 패치를 적용하면 바로 사용이 가능 합니다.

06.07.13-01:15:28

김정균

"Assigned To" was changed from "김정균" to "Nobody"

06.07.13-01:15:28

김정균

"Assigned To" was changed from "Nobody" to "김정균"
"State" was changed from "Open" to "Closed"

06.07.13-01:20:29

Jungshik Shin

감사합니다. KTUG 관리자에게 알리겠습니다. 그런데, 패치 중에 다음과 같은 부분이 있습니다. 이것은 다시 버그를 하나 열어야 하는데....귀찮아서 (죄송)

header("Content-Disposition: attachment; filename=".$dn['name']);

이 부분에서 filename을 C-D 헤더 필드에 적을 때에는 최소한 큰 따옴표로 감싸 주셔야 합니다. (공백이 있는 파일 이름이 잘리지 않도록). 더 제대로 하려면 물론 RFC 2047의 방법을 써서 (PHP에 관련 함수가 있을 것입니다.) 인코드해 주셔야 하고요. 진짜 제대로는 RFC 2231이지만, MS IE 등 상당수 브라우저가 이를 해석하지 못 하고, HTTP 표준 헤더에 C-D가 정의된 것도 아니라서 좀 'compromise'를 할 수 밖에 없습니다.)

http://forums.mozilla.or.kr/viewtopic.php?p=27399
를 보십시오.

06.07.13-01:25:43

김정균

공백 문자 처리까지 적용했습니다.

http://kldp.net/plugins/scmcvs/cvsweb.php/jsboard-2/act.php.diff?r1=1.59;r2=1.61;cvsroot=jsboard

링크로 패치해 달라고 알려 주시면 되겠습니다.

06.07.13-01:33:03

김정균

http://kldp.net/plugins/scmcvs/cvsweb.php/jsboard-2/act.php.diff?
r1=1.59;r2=1.62;cvsroot=jsboard

로 알려 주세요. 첨부 파일에 RFC1738 (rawurlencode function) 을 적용했습니다. php 에서는 1738 지원하는 함수이네요. 맞는지는 모르겠지만..

06.07.13-01:42:52

김정균

음.. rawurlencode 는 맞지 않군요. 일단 rollback 을 해야 겠네요. 2047 을 읽어보니, mail encoding 하는 방식을 사용해야 하는 것이겠네요. 이 경우에는 개발 이슈가 따라야 하므로, 일단 보류해야 겠습니다. 현재는 시간이 없어서...

http://kldp.net/plugins/scmcvs/cvsweb.php/jsboard-2/act.php.diff?
r1=1.59;r2=1.61;cvsroot=jsboard

일단, 위의 링크 (rawurlencoding 처리 안한.. 패치) 로 패치를 해 달라고 하시고, 첨부파일 encording 은.. 어떻게 해야 할지 고민을 좀 해 봐야 겠습니다. encodng 에는 문제가 없는데, charset 을 어떻게 처리해야 할지를 좀 고려해야 겠네요.

06.07.13-01:53:03

김정균

"State" was changed from "Closed" to "Open"

06.07.13-02:14:51

김정균

음. 다시 open 해야 겠습니다.

RFC 2047 에 의하면

Content-Disposition: attachment; filename="=?EUC-KR?B?s6q5qy5qcGc=?="

와 같이 헤더를 보내야 하는 듯 싶은데, 이럴 경우 FF 는 제대로 처리를 해 주는데, IE 의 경우 그렇지를 못하네요. base64 를 지원하지 못하는 것인지.. quoted-printable 을 이용해야 하는 것이라면, php 에서는 imap_8bit() 함수만 지원이 되는데, 이럴 경우 imap extension 이 요구가 되고, 그럼 제대로 사용이 힘든 관계로 지원이 쉽지 않겠네요.

정식님께서 2047 이 IE 에서 가능하다고 했는데, 다운로드는 가능하지만, 파일 이름은 전혀 엉뚱하게 나오는 문제가 존재 합니다.

06.07.13-02:14:51

Jungshik Shin

죄송합니다. 제가 착각했나 보네요. MS IE가 RFC 2047도 이해하지 못 하네요.

http://jshin.net/moztest/download.html
을 한 번 보십시오. 여기에서는 static 문서에 대해서 Apache 설정을 통해서 C-D 헤더를 주도록 만들어 놓았습니다. MS IE에서 제대로 되는 경우는 'raw' EUC-KR인 경우 (EUC-KR은 그 다운로드 링크가 있는 문서에 쓰인 문자 인코딩입니다)뿐이네요. 나머지 경우는 C-D의 filename을 그냥 무시하거나 이상한 글자로 보이는군요.

Mozilla는 모든 경우에 잘 동작합니다. (물론, raw EUC-JP는 잘 동작하지 않습니다.) Opera는 RFC 2231을 쓰면 charset 값에 관계 없이 잘 동작하지만, RFC 2047은 해석하지 않고, raw EUC-KR도 잘 처리하지 못 하네요. 이렇다면 별 수 없이 브라우저 스니핑을 하는 수 밖에 없네요. 제가 괜히 이 얘기를 여기에서 꺼내서 복잡하게 만들어 버렸네요. 일단, 이 버그에서는 따옴표로 막고, 그 링크가 걸린 문서의 인코딩을 써서 raw로 내보내는 것으로 하고(Opera에서 제대로 동작하지 않습니다), 새로 버그를 열어서 브라우저 스니핑과 RFC 2047, 2231 등 문제를 생각해 보아야겠습니다.

06.07.13-15:17:15

김정균

음.. 브라우저별 버전에 따라 차이도 있지 않을까요?

가령 FF 1.0 이하는 2231 을 지원하지 못하고, 2047 을 해야 한다든지,
Opera 의 경우에는 어느 버전 부터 2231 을 지원하는지, IE 는 아예
둘다 지원을 하지 못하고, Mozilla 와 Netscape 의 경우에는 또 어떻게
분류를 해야 할까요?

jsboard 의 경우 대충 브라우저 정보를 분석을 하여 분류를 할수 있어,
아예 브라우져 별로 다르게 뿌려 주도록 처리를 하려고 하는데, 분류를
하기가 쉽지 않군요.

06.07.14-20:42:06

김정균

일단, http://kldp.net/plugins/scmcvs/cvsweb.php/jsboard-2/include/get.php.diff?r1=1.9;r2=1.10;cvsroot=jsboard 과 같이 지원하도록 해 놓았습니다.

06.07.14-21:38:26

Jungshik Shin

감사합니다. 그런데, MS IE가 RFC 2047을 이해하던가요? 제가 원래 한다고 생각했는데, 시험 결과 하지 않은 것으로 밝혀지지 않았던가요? 지금대로 고치시면 MS IE 사용자들이 불평을 할 듯 한데요. 혹시, MS IE의 경우에는 아예 그 부분을 부르지 않도록 하셨나요?

어쨌든, IE 7에서는 제발 RFC 2231을 인식하고 FF 식으로 fallback하도록 IE blog에서 요구를 해야겠네요.

06.07.20-19:28:32

Jungshik Shin

아이고, 죄송. 제가 comment out된 코드를 실제 코드로 착각했네요. default는 그냥 'raw string'을 내보내는 것이로군요.

06.07.20-19:30:01

김정균

"State" was changed from "Open" to "Closed"

06.07.20-20:02:21

김정균

음.. 버그가 있군요. FF 와 Opera 의 경우 rawurlencode ($dn['name']) 으로 하고 있는데, rawurlencode ($n) 이 되어야 하네요. cvs 에 수정해 놓았습니다.

일단, 이 thread 는 닫도록 하겠습니다.

06.07.20-20:02:22

김정균

"Tracker Type" was changed from "Bug Tracking System" to "Feature Request Tracking System"

09.11.27-07:46:01