개발-PHP

[함수] UTF-8 다운로드 파일명 처리 [업데이트]

WEBKIKIS 2016. 3. 30. 20:56
반응형

[함수] UTF-8 다운로드 파일명 처리 [업데이트]


예전에도 몇 번 올라왔던 팁텍이고 질문도 많이 올라오는 주제인데
웹브라우저도 계속 업그레이드되고 있고 (언제까지 IE 5.0, 5.5 감지하는 정규식 쓰실래요? ㅋ)
UTF-8 파일명 처리의 표준이라고 할 수 있는 RFC2231/5987 방식은 아직 아무도 올리신 적이 없는 것 같아서
제가 만들던 소스를 좀 손질해서 올립니다. 늘 그렇듯이 PHP 5 전용, UTF-8 전용입니다.

---------------------------------------------------------------------------------------------------

[소스]  https://gist.github.com/kijin/9735300

---------------------------------------------------------------------------------------------------

아래와 같은 기능을 수행하는 함수입니다.

1. UTF-8 파일명이 깨지지 않도록 한다. (RFC2231/5987 표준 기반, 그러나 브라우저 구버전 특성 감안)
2. 일부 OS에서 파일명에 사용할 수 없는 문자가 있는 경우 제거 또는 치환한다.
3. 캐싱을 원할 경우 적절한 Cache-Control, Expires 등의 헤더를 넣어준다.
4. IE 8 이하에서 캐싱방지 헤더 사용시 다운로드 오류가 발생하는 문제를 보완한다.
5. 이어받기를 지원한다. (Range 헤더 자동 감지, Accept-Ranges 헤더 자동 생성)
6. 일부 PHP 버전에서 대용량 파일 다운로드시 메모리 누수를 막는다.
7. 다운로드 속도를 제한할 수 있다.

[업데이트 3.27] 이어받기 기능과 속도제한 기능이 버전 1.2에 새로 추가되었습니다.
이렇게 되면 파일명 인코딩뿐 아니라 다운로드와 관련된 전반적인 작업을 다 알아서 해주는 정도인데요 ^^

[업데이트 4.01] 버전 1.3 올렸습니다. 가끔 파일명 맨 앞의 한글이 잘려나가는 문제 수정했습니다.
일부 IE 및 안드로이드 브라우저에서 파일명이 정상적으로 표시되지 않는 문제 수정했습니다.
단, 안드로이드 기본 브라우저를 사용하는 경우에는 여전히 한글이 깨질 수 있습니다.
이건 기본 브라우저가 병신이라서 그렇습니다. 저도 어쩔 수 없어요 ㅡ.ㅡ;;

사용법 : send_attachment('클라이언트에게 보여줄 파일명', '서버측 파일 경로', 캐싱할 기간, 속도제한);
예 : send_attachment('foo.jpg', '/srv/www/files/uploads/foo.jpg', 60 * 60 * 24, 300);

캐싱이나 속도제한이 필요없는 분은 3-4번째 인자는 안 넣어도 됩니다.
캐싱 기간은 초 단위, 속도제한은 KB/s 단위입니다.
이어받기는 별도로 설정하지 않아도 알아서 다 처리합니다.

많은 이용과 테스트를 바랍니다.
버그 발견시에는 해당 파일명 (눈에 보이는 값이 아니라 실제 변수값을 var_dump한 결과),
그리고 개발자도구에서 요청 헤더, 답변 헤더 복사해서 쪽지나 메일로 보내주시면 감사하겠습니다.

---------------------------------------------------------------------------------------------------

아, 그리고 이렇게 헤더 다루기 귀찮으신 분은
아예 URL에 파일명을 포함시켜 버리는 송효진님의 팁텍을 참조하세요.
http://www.phpschool.com/link/tipntech/77335


출처 phpschool

반응형