[함수] 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
'개발-PHP' 카테고리의 다른 글
[함수] IP class 비교 (0) | 2016.03.30 |
---|---|
[함수] sms 발송등에서 80자씩 잘라서 배열로 리턴하는 함수 - utf-8 (0) | 2016.03.30 |
[함수] 한국 IP대역 체크 (0) | 2016.03.30 |
[함수] ip range to cidr list (0) | 2016.03.30 |
[함수] crontab 스케쥴링 함수 알고리즘 한번 만들어보았어요 - + (0) | 2016.03.30 |