Adobe ColdFusion 9에서는 cffileupload라는 태그(Railo, OpenBD, Adobe ColdFuaion 8이하 지원안함)를 지원하여 간단한 CFML코드 몇줄로 Flash기반의 파일업로드 어플리케이션을 쉽게 만들 수 있습니다. (참조 : Adobe ColdFusion 9의 새로운 태그 2가지 - cfmediaplayer, cffileupload) 일반적으로 http프로토콜을 이용하는 웹서버는 10~20MB가 안정적인 파일전송 용량입니다. 물론 그 이상의 파일도 전송할 수 있지만 중간에 전송이 끊어지는 경우 이어전송이 안되므로 비교적 저용량의 파일을 전송하는데만 이용합니다. 그래서 대용량의 파일을 업로드할 경우 ActiveX나 Java등을 이용했는데, Flash Player 8이 나오면서 Flash에서도 이런 대용량 파일전송이 가능해 졌습니다.
문제는 ColdFusion과 같이 빠르게 웹어플리케이션을 만드는데 촛점이 있는 언어에서는 Flex나 Flash로 파일전송 어플리케이션을 만들어야 했는데요. Macromedia ColdFusion MX 7버전이상부터는 CFML자체(Flex의 MXML과는 다른 언어이지만 단순 텍스트 코드만으로 SWF를 만드는 것은 같음. ColdFusion 내부적으로는 MXML을 씀.)만으로 SWF를 생성하는 기능이 추가되었고, 주인이 Adobe로 바뀐 뒤 올해 출시된 Adobe ColdFusion 9부터는 Adobe ColdFusion 8에서 지원했던 여러 SWF관련 태그와 마찬가지로 cffileupload라는 태그를 추가함으로써 ColdFusion개발자가 바쁜시간을 쪼깨어 Flex로 파일업로드 어플리케이션을 만들지 않아도 되도록 개발 편리성을 극대화했습니다. (물론 순전히 ColdFusion으로만 구현할 수 도 있습니다. http://www.asfusion.com/examples/item/file-upload-with-coldfusion-flash-forms 참조)
더욱이 File용량, 확장자필터링, 오류예외처리, 개별 파일 전송 및 전체파일의 전송완료시의 이벤트처리 등 Flex에서는 다소 구현이 복잡한 것을 cffileupload태그의 Attributes로 제공하여 정확히 한줄의 코드로 Flex기반의 File 업로드 어플리케이션의 생성 및 브라우저출력, 그리고 앞서말한 여러 속성들을 생성할 수 있습니다. Flex의 경우 화면을 이루는 mxml코드와 이벤트처리, 예외처리를 위한 actionscript코드를 생성해야 하고, 더욱이 서버측 언어, 가령 PHP 등의 코드도 필요하게 됩니다. 물론 이 경우 좀더 유연하게 어플리케이션을 제작할 수 있지만 바쁜 웹개발자에게 솔직히 파일업로드 하나 만들자고 수일에 걸쳐 Flex와 Actionsctipt, 그리고 PHP까지 하라는 것은 좀 많은 부담이지요. ColdFusion하나만 알면 쓸만한 어플리케이션을 단 한줄로 만들수 있으니까요.
그런데, 여느 상용제품에 대응하는 OpenSource가 그렇듯이 cffileupload태그는 Adobe의 제품에서만 지원하는 태그입니다. Railo나 Open BD에서는 사용할 수 없죠. 물론 Javascript Flashvars로 제어할 수 있도록 Flex로 어플리케이션을 만들고 ColdFusion에서 Custom Tag로 만들거나, 아예 소스가 공개되어 있는 Railo나 Open BD의 소스코드에 cffileupload를 지원하도록 스스로 기능을 확장해 버릴 수 있지만 시간과 노력이 많이 필요합니다. 알아야 할 기술도 더 많이 늘어나고요. 제가 위에서 지난 10월 소개한 Daniel Vega의 Adobe 기술문서(참조 : Adobe ColdFusion 9의 새로운 태그 2가지 - cfmediaplayer, cffileupload)를 참조하시면 어떻게 Adobe ColdFusion 9에서 쉽게 파일업로드를 생성하는 지 확인할 수 있습니다.
오늘은 소개한 글의 원작자인 Daniel Vega가 RaiForge에 공개한 CFMU(ColdFusion Multi Upload)를 이용하여 Railo나 Open BD에서 Flex기반의 파일업로드를 구현하여 보도록 하겠습니다. Flex코드는 공개되어 있지 않고, 컴파일된 SWF파일만 이용하므로 Flex코드능력은 필요하지 않습니다. 물론 이 SWF는 제어가 가능합니다. 우선 CFMU 소스를 한번 살펴보세요. 간단하게 로컬의 Railo나, Open BD에서 테스트해보시길 바랍니다. 소스내의 demo에서 보시면 파일확장자 필터링이나, 용량, 업르드갯수제한, 업로드디렉토리 변경 등 Flex원본 소스가 없어도 대부분의 파일업로드 기능제어가 가능합니다. (문제는 이 원본 Demo소스가 정리가 좀 안되어 있고, 일부 오타가 있어서 :( 간단하게 정리를 다시 했습니다. 사실은 제가 필요해서 였죠.)
우선 소스압축을 풀면 나오는 cfmu 디렉토리와 안의 파일은 수정할 일이 없습니다. swf파일과 해당파일을 cfmodule태그로 동적으로 로드하기 위한 uploader.cfm 등이 있습니다. 그리고 uploads디렉토리는 업로드된 파일이 업로드될 곳입니다. CFMU의 여러 데모소스에서는 사용자 Session을 가져와 사용자별 디렉토리를 만들고 해당 디렉토리에 업로드 하는 등의 데모도 있지만 여기서는 가장 일반적으로 파일업로드 파일확장자제한, 업로드디렉토리, 그리고 jQuery를 이용하여 업로드된 항목의 파일명을 동적으로 업로드 완료시 리턴을 받아오는 것(DB에 파일명을 넣을 경우)을 구현해 보겠습니다. 다음의 두 파일만 원하는데로 수정하면 됩니다.