FileReference 클래스 사용

Flash Player 9 이상, Adobe AIR 1.0 이상

FileReference 객체는 클라이언트 또는 서버 컴퓨터의 데이터 파일을 나타냅니다. FileReference 클래스의 메서드를 사용하면 응용 프로그램에서 로컬로 데이터 파일을 로드 및 저장하고 원격 서버와 데이터 파일을 주고 받을 수 있습니다.

FileReference 클래스에서는 두 가지 방법으로 데이터 파일을 로드, 전송 및 저장할 수 있습니다. FileReference 클래스는 처음 소개되었을 때부터 browse() 메서드, upload() 메서드, download() 메서드가 포함되었습니다. browse() 메서드를 사용하면 사용자가 파일을 선택하도록 할 수 있습니다. upload() 메서드를 사용하면 파일 데이터를 원격 서버에 전송할 수 있습니다. download() 메서드를 사용하면 서버에서 데이터를 검색하고 이를 로컬 파일에 저장할 수 있습니다. Flash Player 10 및 Adobe AIR 1.5부터는 FileReference 클래스에 load() save() 메서드가 포함됩니다. load() save() 메서드에서는 로컬 파일을 직접 액세스하여 저장할 수도 있습니다. 이러한 메서드의 용도는 URLLoader 및 Loader 클래스의 같은 이름을 갖는 메서드와 비슷합니다.

참고: FileReference 클래스를 확장하는 File 클래스와 FileStream 클래스는 파일 및 로컬 파일 시스템을 사용하는 작업을 지원하는 함수를 추가적으로 제공합니다. File 클래스와 FileStream 클래스는 AIR에서만 지원되며 Flash Player에서는 지원되지 않습니다.

Adobe 권장 사항

로컬 파일 로드 및 저장

Kevin Hoyt
이 비디오에서는 Kevin Hoyt가 Flash를 사용하여 로컬 내용을 쉽게 로드 및 저장하는 것을 보여 줍니다.

FileReference 클래스

각 FileReference 객체는 로컬 컴퓨터의 단일 데이터 파일을 나타냅니다. FileReference 클래스의 속성에는 파일의 크기, 유형, 이름, 파일 이름 확장명, 작성자, 만든 날짜 및 수정 날짜에 대한 정보가 들어 있습니다.

참고: creator 속성은 Mac OS에서만 지원됩니다. 다른 모든 플랫폼에서는 null 을 반환합니다.
참고: extension 속성은 Adobe AIR에서만 지원됩니다.

FileReference 클래스의 인스턴스는 다음 두 가지 중 한 가지 방법으로 만들 수 있습니다.

  • 다음 코드와 같이 new 연산자를 사용합니다.
    import flash.net.FileReference; 
    var fileRef:FileReference = new FileReference();
  • FileReferenceList.browse() 메서드를 호출합니다. 이 경우 대화 상자가 열리고 업로드할 파일을 하나 이상 선택하라는 메시지가 표시됩니다. 그런 다음 사용자가 하나 이상의 파일을 선택하면 FileReference 객체의 배열이 만들어집니다.

FileReference 객체를 만든 후에는 다음을 수행할 수 있습니다.

  • FileReference.browse() 메서드를 호출합니다. 그러면 대화 상자가 열리고 로컬 파일 시스템에서 단일 파일을 선택하라는 메시지가 표시됩니다. 이러한 작업은 보통 FileReference.upload() 메서드 또는 FileReference.load() 메서드에 대한 후속 호출이 이뤄지기 전에 수행됩니다. 파일을 원격 서버에 업로드하려면 FileReference.upload() 메서드를 호출합니다. 로컬 파일을 열려면 FileReference.load() 메서드를 호출합니다.

  • FileReference.download() 메서드를 호출합니다. download() 메서드를 호출하면 새 파일을 저장할 위치를 선택할 수 있는 대화 상자가 열립니다. 그런 다음 서버에서 데이터를 다운로드하여 새 파일에 저장합니다.

  • FileReference.load() 메서드를 호출합니다. 그러면 browse() 메서드를 사용하여 이전에 선택한 파일에서 데이터가 로드되기 시작합니다. load() 메서드는 browse() 작업이 완료될 때까지(사용자가 파일 선택) 호출할 수 없습니다.

  • FileReference.save() 메서드를 호출합니다. 그러면 대화 상자가 열리고 로컬 파일 시스템에서 단일 파일 위치를 선택하라는 메시지가 표시됩니다. 그런 다음 데이터가 지정한 위치에 저장됩니다.

참고: 어디에서나 하나의 대화 상자만 열 수 있으므로 한 번에 하나의 browse() , download() 또는 save() 액션만 실행할 수 있습니다.

name , size 또는 modificationDate 와 같은 FileReference 객체 속성은 다음 중 하나가 수행되기 전까지는 정의되지 않습니다.

  • FileReference.browse() 메서드나 FileReferenceList.browse() 메서드가 호출되었고 사용자가 대화 상자를 사용하여 파일을 선택했습니다.

  • FileReference.download() 메서드가 호출되었고 사용자가 대화 상자를 사용하여 새 파일 위치를 지정했습니다.

참고: 다운로드를 수행하는 경우 다운로드가 완료되기 전에는 FileReference.name 속성만 채워집니다. 파일이 다운로드되면 모든 속성을 사용할 수 있습니다.

FileReference.browse() , FileReferenceList.browse() , FileReference.download() , FileReference.load() 또는 FileReference.save() 메서드에 대한 호출을 실행할 때 대부분의 플레이어에서는 이벤트 전달 및 코드 실행을 포함하여 계속 SWF 파일을 재생합니다.

SWF 파일은 정책 파일에 지정된 도메인을 포함하여 자체 도메인에 있는 파일에만 액세스하여 업로드 및 다운로드 작업을 수행할 수 있습니다. 업로드 또는 다운로드를 시작하는 SWF 파일이 서버와 같은 도메인에 속하지 않는 경우 파일 서버에 정책 파일을 배치해야 합니다.

자세한 내용은 FileReference 를 참조하십시오.

파일에서 데이터 로드

FileReference.load() 메서드를 사용하면 로컬 파일의 데이터를 메모리에 로드할 수 있습니다.

참고: 코드에서 먼저 FileReference.browse() 메서드를 호출하여 사용자가 로드할 파일을 선택할 수 있도록 해야 합니다. 이 제한은 응용 프로그램 보안 샌드박스에 있는 Adobe AIR에서 실행되는 내용에는 적용되지 않습니다.

FileReference.load() 메서드는 호출 후 즉시 반환되지만 로드되는 데이터는 즉시 사용할 수 없습니다. FileReference 객체는 이벤트를 전달하여 로드 프로세스의 각 단계에서 리스너 메서드를 호출합니다.

FileReference 객체는 로드 프로세스 중에 다음 이벤트를 전달합니다.

  • open 이벤트( Event.OPEN ): 로드 작업이 시작될 때 전달됩니다.

  • progress 이벤트( ProgressEvent.PROGRESS ): 데이터 바이트를 파일에서 읽을 때 주기적으로 전달됩니다.

  • complete 이벤트( Event.COMPLETE ): 로드 작업이 성공적으로 완료되었을 때 전달됩니다.

  • ioError 이벤트( IOErrorEvent.IO_ERROR ): 파일에서 데이터를 열거나 읽는 동안 발생한 입/출력 오류로 인해 로드 프로세스에 실패할 때 전달됩니다.

FileReference 객체가 complete 이벤트를 전달하면 FileReference 객체의 data 속성에서 ByteArray로 로드된 데이터에 액세스할 수 있습니다.

다음 예제에서는 파일을 선택하라는 메시지를 표시한 다음 해당 파일의 데이터를 메모리에 로드하는 방법을 보여 줍니다.

package 
{ 
     import flash.display.Sprite; 
    import flash.events.*;  
    import flash.net.FileFilter; 
    import flash.net.FileReference; 
    import flash.net.URLRequest; 
    import flash.utils.ByteArray; 
 
    public class FileReferenceExample1 extends Sprite 
    { 
        private var fileRef:FileReference; 
        public function FileReferenceExample1() 
        { 
            fileRef = new FileReference(); 
            fileRef.addEventListener(Event.SELECT, onFileSelected); 
            fileRef.addEventListener(Event.CANCEL, onCancel); 
            fileRef.addEventListener(IOErrorEvent.IO_ERROR, onIOError); 
            fileRef.addEventListener(SecurityErrorEvent.SECURITY_ERROR, 
                        onSecurityError); 
            var textTypeFilter:FileFilter = new FileFilter("Text Files (*.txt, *.rtf)", 
                        "*.txt;*.rtf"); 
            fileRef.browse([textTypeFilter]); 
        } 
        public function onFileSelected(evt:Event):void 
        { 
            fileRef.addEventListener(ProgressEvent.PROGRESS, onProgress); 
            fileRef.addEventListener(Event.COMPLETE, onComplete); 
            fileRef.load(); 
        } 
 
        public function onProgress(evt:ProgressEvent):void 
        { 
            trace("Loaded " + evt.bytesLoaded + " of " + evt.bytesTotal + " bytes."); 
        } 
 
        public function onComplete(evt:Event):void 
        { 
            trace("File was successfully loaded."); 
            trace(fileRef.data); 
        } 
 
        public function onCancel(evt:Event):void 
        { 
            trace("The browse request was canceled by the user."); 
        } 
 
        public function onIOError(evt:IOErrorEvent):void 
        { 
            trace("There was an IO Error."); 
        } 
        public function onSecurityError(evt:Event):void 
        { 
            trace("There was a security error."); 
        } 
    } 
}

예제 코드에서는 먼저 fileRef 라는 FileReference 객체를 만들고 browse() 메서드를 호출합니다. browse() 메서드를 호출하면 파일을 선택할 수 있는 대화 상자가 열립니다. 파일이 선택되면 코드가 onFileSelected() 메서드를 호출합니다. 이 메서드는 progress complete 이벤트를 위해 리스너를 추가하고 FileReference 객체의 load() 메서드를 호출합니다. 이 예제의 다른 핸들러 메서드는 단지 로드 작업의 진행률을 보고하는 메시지를 출력합니다. 로드가 완료되면 trace() 메서드를 사용하여 로드된 파일의 내용이 표시됩니다.

Adobe AIR에서는 FileStream 클래스가 로컬 파일에서 데이터를 읽는 기능을 추가적으로 제공합니다. 자세한 내용은 파일 읽기 및 쓰기 를 참조하십시오.

로컬 파일에 데이터 저장

FileReference.save() 메서드를 사용하여 데이터를 로컬 파일에 저장할 수 있습니다. 이 작업을 시작하면 먼저 사용자가 새 파일 이름 및 파일 저장 위치를 입력할 수 있는 대화 상자가 열립니다. 사용자가 파일 이름 및 위치를 선택하면 데이터가 새 파일에 쓰여집니다. 파일이 성공적으로 저장되면 FileReference 객체의 속성이 로컬 파일의 속성으로 채워집니다.

참고: 코드에서는 마우스 클릭 또는 키 누르기 이벤트와 같이 사용자가 실행한 이벤트에 대한 응답으로 FileReference.save() 메서드만 호출해야 합니다. 그렇지 않으면 오류가 발생합니다. 이 제한은 응용 프로그램 보안 샌드박스에 있는 Adobe AIR에서 실행되는 내용에는 적용되지 않습니다.

FileReference.save() 메서드는 호출 후 즉시 반환됩니다. 그런 다음 FileReference 객체는 이벤트를 전달하여 파일 저장 프로세스의 각 단계에서 리스너 메서드를 호출합니다.

FileReference 객체는 파일 저장 프로세스 중에 다음 이벤트를 전달합니다.

  • select 이벤트( Event.SELECT ): 사용자가 저장할 새 파일의 위치 및 파일 이름을 지정할 때 전달됩니다.

  • cancel 이벤트( Event.CANCEL ): 사용자가 대화 상자의 [취소] 버튼을 클릭할 때 전달됩니다.

  • open 이벤트( Event.OPEN ): 저장 작업이 시작될 때 전달됩니다.

  • progress 이벤트( ProgressEvent.PROGRESS ): 데이터 바이트를 파일에 저장할 때 주기적으로 전달됩니다.

  • complete 이벤트( Event.COMPLETE ): 저장 작업이 성공적으로 완료되었을 때 전달됩니다.

  • ioError 이벤트( IOErrorEvent.IO_ERROR ): 파일에 데이터를 저장하는 동안 발생한 입/출력 오류로 인해 저장 프로세스에 실패할 때 전달됩니다.

FileReference.save() 메서드의 data 매개 변수에 전달되는 객체 유형에 따라 데이터가 파일에 쓰여지는 방식이 결정됩니다.

  • 객체 유형이 문자열 값인 경우 데이터는 UTF-8 인코딩을 사용하여 텍스트 파일로 저장됩니다.

  • 객체 유형이 XML 객체인 경우 데이터는 파일에 XML 형식으로 쓰여지며 이때 모든 서식이 유지됩니다.

  • 객체 유형이 ByteArray 객체인 경우 데이터 내용은 변환 없이 파일에 직접 쓰여집니다.

  • 객체 유형이 다른 객체인 경우 FileReference.save() 메서드는 객체의 toString() 메서드를 호출한 다음 결과 문자열 값을 UTF-8 텍스트 파일에 저장합니다. 객체의 toString() 메서드를 호출할 수 없는 경우에는 오류가 발생합니다.

data 매개 변수의 값이 null 인 경우에는 오류가 발생합니다.

다음 코드에서는 FileReference.load() 메서드에 대한 이전 예제를 확장합니다. 이 예제에서는 파일의 데이터를 읽은 후 파일 이름을 지정하라는 메시지를 표시하고 데이터를 새 파일에 저장합니다.

package 
{ 
    import flash.display.Sprite; 
    import flash.events.*;  
    import flash.net.FileFilter; 
    import flash.net.FileReference; 
    import flash.net.URLRequest; 
    import flash.utils.ByteArray; 
 
    public class FileReferenceExample2 extends Sprite 
    { 
        private var fileRef:FileReference; 
        public function FileReferenceExample2() 
        { 
            fileRef = new FileReference(); 
            fileRef.addEventListener(Event.SELECT, onFileSelected); 
            fileRef.addEventListener(Event.CANCEL, onCancel); 
            fileRef.addEventListener(IOErrorEvent.IO_ERROR, onIOError); 
            fileRef.addEventListener(SecurityErrorEvent.SECURITY_ERROR, 
                        onSecurityError); 
            var textTypeFilter:FileFilter = new FileFilter("Text Files (*.txt, *.rtf)", 
                        "*.txt;*.rtf"); 
            fileRef.browse([textTypeFilter]); 
        } 
        public function onFileSelected(evt:Event):void 
        { 
            fileRef.addEventListener(ProgressEvent.PROGRESS, onProgress); 
            fileRef.addEventListener(Event.COMPLETE, onComplete); 
            fileRef.load(); 
        } 
 
        public function onProgress(evt:ProgressEvent):void 
        { 
            trace("Loaded " + evt.bytesLoaded + " of " + evt.bytesTotal + " bytes."); 
        } 
        public function onCancel(evt:Event):void 
        { 
            trace("The browse request was canceled by the user."); 
        } 
        public function onComplete(evt:Event):void 
        { 
            trace("File was successfully loaded."); 
            fileRef.removeEventListener(Event.SELECT, onFileSelected); 
            fileRef.removeEventListener(ProgressEvent.PROGRESS, onProgress); 
            fileRef.removeEventListener(Event.COMPLETE, onComplete); 
            fileRef.removeEventListener(Event.CANCEL, onCancel); 
            saveFile(); 
        } 
        public function saveFile():void 
        { 
            fileRef.addEventListener(Event.SELECT, onSaveFileSelected); 
            fileRef.save(fileRef.data,"NewFileName.txt"); 
        } 
 
        public function onSaveFileSelected(evt:Event):void 
        { 
            fileRef.addEventListener(ProgressEvent.PROGRESS, onSaveProgress); 
            fileRef.addEventListener(Event.COMPLETE, onSaveComplete); 
            fileRef.addEventListener(Event.CANCEL, onSaveCancel); 
        } 
 
        public function onSaveProgress(evt:ProgressEvent):void 
        { 
            trace("Saved " + evt.bytesLoaded + " of " + evt.bytesTotal + " bytes."); 
        } 
         
        public function onSaveComplete(evt:Event):void 
        { 
            trace("File saved."); 
            fileRef.removeEventListener(Event.SELECT, onSaveFileSelected); 
            fileRef.removeEventListener(ProgressEvent.PROGRESS, onSaveProgress); 
            fileRef.removeEventListener(Event.COMPLETE, onSaveComplete); 
            fileRef.removeEventListener(Event.CANCEL, onSaveCancel); 
        } 
 
        public function onSaveCancel(evt:Event):void 
        { 
            trace("The save request was canceled by the user."); 
        } 
 
        public function onIOError(evt:IOErrorEvent):void 
        { 
            trace("There was an IO Error."); 
        } 
        public function onSecurityError(evt:Event):void 
        { 
            trace("There was a security error."); 
        } 
    } 
}

파일에서 모든 데이터가 로드되면 코드가 onComplete() 메서드를 호출합니다. onComplete() 메서드는 이벤트를 로드하기 위한 리스너를 제거한 다음 saveFile() 메서드를 호출합니다. saveFile() 메서드는 FileReference.save() 메서드를 호출합니다. FileReference.save() 메서드는 사용자가 새 파일 이름 및 파일 저장 위치를 입력할 수 있도록 새 대화 상자를 엽니다. 나머지 이벤트 리스너 메서드는 파일 저장 프로세스가 완료될 때까지 프로세스 진행률을 추적합니다.

Adobe AIR에서는 FileStream 클래스가 로컬 파일에 데이터를 쓰는 기능을 추가적으로 제공합니다. 자세한 내용은 파일 읽기 및 쓰기 를 참조하십시오.

서버에 파일 업로드

서버에 파일을 업로드하려면 먼저 사용자가 하나 이상의 파일을 선택할 수 있도록 browse() 메서드를 호출하십시오. 그 다음에 FileReference.upload() 메서드를 호출하면 선택한 파일이 서버에 전송됩니다. 사용자가 FileReferenceList.browse() 메서드를 사용하여 여러 파일을 선택한 경우 Flash Player에서 FileReferenceList.fileList 라는 선택한 파일의 배열을 만듭니다. 그러면 FileReference.upload() 메서드를 사용하여 각 파일을 업로드할 수 있습니다.

참고: FileReference.browse() 메서드를 사용하면 하나의 파일만 업로드할 수 있습니다. 사용자가 여러 파일을 업로드할 수 있도록 하려면 FileReferenceList.browse() 메서드를 사용합니다.

기본적으로 해당 시스템의 파일 선택 대화 상자에서 개발자는 FileFilter 클래스를 사용하고 파일 필터 인스턴스의 배열을 browse() 메서드에 전달하여 하나 이상의 사용자 정의 파일 형식 필터를 지정할 수 있지만 사용자는 로컬 컴퓨터에서 모든 파일 형식을 선택할 수 있습니다.

var imageTypes:FileFilter = new FileFilter("Images (*.jpg, *.jpeg, *.gif, *.png)", "*.jpg; *.jpeg; *.gif; *.png"); 
var textTypes:FileFilter = new FileFilter("Text Files (*.txt, *.rtf)", "*.txt; *.rtf"); 
var allTypes:Array = new Array(imageTypes, textTypes); 
var fileRef:FileReference = new FileReference(); 
fileRef.browse(allTypes);

사용자가 파일을 선택하고 해당 시스템의 파일 선택 대화 상자에서 [열기] 버튼을 클릭하면 Event.SELECT 이벤트가 전달됩니다. FileReference.browse() 메서드를 사용하여 업로드할 파일을 선택한 경우 다음 코드에서 파일을 웹 서버에 전송합니다.

var fileRef:FileReference = new FileReference(); 
fileRef.addEventListener(Event.SELECT, selectHandler); 
fileRef.addEventListener(Event.COMPLETE, completeHandler); 
try 
{ 
    var success:Boolean = fileRef.browse(); 
} 
catch (error:Error) 
{ 
    trace("Unable to browse for files."); 
} 
function selectHandler(event:Event):void 
{ 
    var request:URLRequest = new URLRequest("http://www.[yourdomain].com/fileUploadScript.cfm") 
    try 
    { 
        fileRef.upload(request); 
    } 
    catch (error:Error) 
    { 
        trace("Unable to upload file."); 
    } 
} 
function completeHandler(event:Event):void 
{ 
    trace("uploaded"); 
}
POST 또는 GET 메서드를 사용하는 변수를 전송하려면 URLRequest.method URLRequest.data 속성을 사용하여 FileReference.upload() 메서드로 서버에 데이터를 전송할 수 있습니다.

FileReference.upload() 메서드를 사용하여 파일을 업로드하면 다음 이벤트가 전달될 수 있습니다.

  • open 이벤트( Event.OPEN ): 업로드 작업이 시작될 때 전달됩니다.

  • progress 이벤트( ProgressEvent.PROGRESS ): 파일에서 데이터 바이트가 업로드될 때 주기적으로 전달됩니다.

  • complete 이벤트( Event.COMPLETE ): 업로드 작업이 성공적으로 완료되었을 때 전달됩니다.

  • httpStatus 이벤트( HTTPStatusEvent.HTTP_STATUS ): HTTP 오류로 인해 업로드 프로세스에 실패할 때 전달됩니다.

  • httpResponseStatus 이벤트( HTTPStatusEvent.HTTP_RESPONSE_STATUS ): upload() 또는 uploadUnencoded() 메서드 호출로 HTTP를 통해 데이터 액세스를 시도하고 Adobe AIR에서 요청에 대한 상태 코드를 감지 및 반환할 수 있을 때 전달됩니다.

  • securityError 이벤트( SecurityErrorEvent.SECURITY_ERROR ): 보안 오류로 인해 업로드 작업에 실패할 때 전달됩니다.

  • uploadCompleteData 이벤트( DataEvent.UPLOAD_COMPLETE_DATA ): 업로드에 성공한 후 서버에서 데이터가 수신되면 전달됩니다.

  • ioError 이벤트( IOErrorEvent.IO_ERROR ): 다음과 같은 이유로 업로드 프로세스에 실패한 경우에 전달됩니다.

    • Flash Player에서 파일을 읽고, 쓰고 또는 전송하는 중에 입력/출력 오류가 발생했습니다.

    • SWF가 인증(예: 사용자 이름 및 암호)이 요구되는 서버에 파일을 업로드하려고 시도했습니다. 업로드 시 Flash Player는 암호 입력 방법을 제공하지 않습니다.

    • url 매개 변수에 잘못된 프로토콜이 포함되어 있습니다. FileReference.upload() 메서드는 HTTP 또는 HTTPS를 사용해야 합니다.

Flash Player에서는 인증이 필요한 서버에 대해 완전한 지원을 제공하지 않습니다. 브라우저에서 실행 중인 즉, 브라우저 플러그인이나 Microsoft ActiveX® 컨트롤을 사용하는 SWF 파일만이 인증 및 다운로드에 필요한 사용자 이름과 암호 입력을 요청하는 대화 상자를 제공할 수 있습니다. 플러그인이나 ActiveX 컨트롤을 사용하는 업로드 또는 독립형이나 외부 플레이어를 사용하는 업로드/다운로드의 경우에는 파일이 전송되지 않습니다.

Flash Player에서 파일 업로드를 허용할 수 있도록 ColdFusion에서 서버 스크립트를 만드는 경우 다음과 비슷한 코드를 사용할 수 있습니다.

<cffile action="upload" filefield="Filedata" destination="#ExpandPath('./')#" nameconflict="OVERWRITE" />

이 ColdFusion 코드는 Flash Player에서 보낸 파일을 업로드하고 ColdFusion 템플릿과 같은 디렉토리에 저장하여 이름이 같은 파일을 덮어씁니다. 앞의 코드에서는 파일 업로드를 허용하는 데 필요한 최소한의 코드를 보여 줍니다. 실제 업무 환경에서는 이 스크립트를 사용하면 안 됩니다. 데이터 유효성 검사를 추가하여 사용자가 잠재적 위험성이 있는 서버측 스크립트 대신 이미지와 같은 허용된 파일 형식만 업로드하도록 합니다.

다음 코드에서는 PHP를 사용한 파일 업로드를 보여 줍니다. 여기에는 데이터 유효성 검사가 포함되어 있습니다. 이 스크립트는 업로드 디렉토리에 업로드된 파일 수를 10개로 제한하고, 200KB 미만의 파일만 업로드하도록 하며, JPEG, GIF 또는 PNG 파일만 파일 시스템에 업로드하고 저장하도록 허용합니다.

<?php 
$MAXIMUM_FILESIZE = 1024 * 200; // 200KB 
$MAXIMUM_FILE_COUNT = 10; // keep maximum 10 files on server 
echo exif_imagetype($_FILES['Filedata']); 
if ($_FILES['Filedata']['size'] <= $MAXIMUM_FILESIZE) 
{ 
    move_uploaded_file($_FILES['Filedata']['tmp_name'], "./temporary/".$_FILES['Filedata']['name']); 
    $type = exif_imagetype("./temporary/".$_FILES['Filedata']['name']); 
    if ($type == 1 || $type == 2 || $type == 3) 
    { 
        rename("./temporary/".$_FILES['Filedata']['name'], "./images/".$_FILES['Filedata']['name']); 
    } 
    else 
    { 
        unlink("./temporary/".$_FILES['Filedata']['name']); 
    } 
} 
$directory = opendir('./images/'); 
$files = array(); 
while ($file = readdir($directory)) 
{ 
    array_push($files, array('./images/'.$file, filectime('./images/'.$file))); 
} 
usort($files, sorter); 
if (count($files) > $MAXIMUM_FILE_COUNT) 
{ 
    $files_to_delete = array_splice($files, 0, count($files) - $MAXIMUM_FILE_COUNT); 
    for ($i = 0; $i < count($files_to_delete); $i++) 
    { 
        unlink($files_to_delete[$i][0]); 
    } 
} 
print_r($files); 
closedir($directory); 
 
function sorter($a, $b) 
{ 
    if ($a[1] == $b[1]) 
    { 
        return 0; 
    } 
    else 
    { 
        return ($a[1] < $b[1]) ? -1 : 1; 
    } 
} 
?>

POST 또는 GET 요청 메서드를 사용하여 스크립트를 업로드할 수 있도록 추가 변수를 전달할 수 있습니다. 추가 POST 변수를 업로드 스크립트에 전송하려면 다음 코드를 사용할 수 있습니다.

var fileRef:FileReference = new FileReference(); 
fileRef.addEventListener(Event.SELECT, selectHandler); 
fileRef.addEventListener(Event.COMPLETE, completeHandler); 
fileRef.browse(); 
function selectHandler(event:Event):void 
{ 
    var params:URLVariables = new URLVariables(); 
    params.date = new Date(); 
    params.ssid = "94103-1394-2345"; 
    var request:URLRequest = new URLRequest("http://www.yourdomain.com/FileReferenceUpload/fileupload.cfm"); 
    request.method = URLRequestMethod.POST; 
    request.data = params; 
    fileRef.upload(request, "Custom1"); 
} 
function completeHandler(event:Event):void 
{ 
    trace("uploaded"); 
}

앞의 예제에서는 원격 서버측 스크립트에 전달하는 URLVariables 객체를 만듭니다. 이전 버전의 ActionScript에서는 쿼리 문자열의 값을 전달하여 서버 업로드 스크립트에 변수를 전달할 수 있습니다. ActionScript 3.0에서는 POST 또는 GET 메서드를 사용하는 데이터를 전달할 수 있는 URLRequest 객체를 사용하여 원격 스크립트에 변수를 전달할 수 있습니다. 그러면 더 큰 데이터 집합을 더 쉽고 간편하게 전달할 수 있습니다. GET 또는 POST 요청 메서드를 사용하여 변수를 전달할지 여부를 지정하려면 URLRequest.method 속성을 각각 URLRequestMethod.GET 또는 URLRequestMethod.POST 로 설정할 수 있습니다.

또한 ActionScript 3.0에서는 앞의 예(기본값 Filedata Custom1 로 대체)와 같이 두 번째 매개 변수를 upload() 메서드로 제공하여 기본 Filedata 업로드 파일 필드 이름을 덮어 쓸 수 있습니다.

true 값을 세 번째 매개 변수로 upload() 메서드에 전달하여 이 기본값을 재정의할 수 있는 경우에도 Flash Player에서는 기본적으로 테스트 업로드를 전송하지 않습니다. 테스트 업로드의 목적은 실제로 파일이 성공적으로 업로드될지 및 서버 인증이 필요한 경우 인증이 될지 여부를 확인하는 것입니다.

참고: 현재 테스트 업로드는 Windows 기반 Flash Player에서만 가능합니다.

파일 업로드를 처리하는 서버 스크립트에는 다음 요소가 포함된 HTTP POST 요청을 사용해야 합니다.

  • multipart/form-data 값이 있는 Content-Type

  • name 특성이 " Filedata "로 설정되고 filename 특성이 원본 파일의 이름으로 설정된 Content-Disposition . FileReference.upload() 메서드에서 uploadDataFieldName 매개 변수의 값을 전달하여 사용자 정의 name 속성을 지정할 수 있습니다.

  • 파일의 이진 내용

다음은 샘플 HTTP POST 요청입니다.

POST /handler.asp HTTP/1.1 
Accept: text/* 
Content-Type: multipart/form-data; 
boundary=----------Ij5ae0ae0KM7GI3KM7ei4cH2ei4gL6 
User-Agent: Shockwave Flash 
Host: www.mydomain.com 
Content-Length: 421 
Connection: Keep-Alive 
Cache-Control: no-cache 
 
------------Ij5ae0ae0KM7GI3KM7ei4cH2ei4gL6  
Content-Disposition: form-data; name="Filename" 
 
sushi.jpg  
------------Ij5ae0ae0KM7GI3KM7ei4cH2ei4gL6 
Content-Disposition: form-data; name="Filedata"; filename="sushi.jpg" 
Content-Type: application/octet-stream 
 
Test File  
------------Ij5ae0ae0KM7GI3KM7ei4cH2ei4gL6 
Content-Disposition: form-data; name="Upload" 
 
Submit Query 
------------Ij5ae0ae0KM7GI3KM7ei4cH2ei4gL6 
(actual file data,,,)

다음 샘플 HTTP POST 요청은 api_sig , api_key auth_token 이라는 세 가지 POST 변수를 전송하고 "photo" 의 사용자 정의 업로드 데이터 필드 이름 값을 사용합니다.

POST /handler.asp HTTP/1.1 
Accept: text/* 
Content-Type: multipart/form-data; 
boundary=----------Ij5ae0ae0KM7GI3KM7ei4cH2ei4gL6 
User-Agent: Shockwave Flash 
Host: www.mydomain.com 
Content-Length: 421 
Connection: Keep-Alive 
Cache-Control: no-cache 
 
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7 
Content-Disposition: form-data; name="Filename" 
 
sushi.jpg 
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7 
Content-Disposition: form-data; name="api_sig" 
 
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7 
Content-Disposition: form-data; name="api_key" 
 
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7 
Content-Disposition: form-data; name="auth_token" 
 
XXXXXXXXXXXXXXXXXXXXXXX 
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7 
Content-Disposition: form-data; name="photo"; filename="sushi.jpg" 
Content-Type: application/octet-stream 
 
(actual file data,,,) 
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7 
Content-Disposition: form-data; name="Upload" 
 
Submit Query 
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7--

서버에서 파일 다운로드

사용자가 request defaultFileName 라는 두 가지 매개 변수가 필요한 FileReference.download() 메서드를 사용하여 서버에서 파일을 다운로드하도록 할 수 있습니다. 첫 번째 매개 변수는 다운로드할 파일의 URL이 포함된 URLRequest 객체입니다. 두 번째 매개 변수는 선택 항목으로, [파일 다운로드] 대화 상자에 표시되는 기본 파일 이름을 지정할 수 있습니다. 두 번째 매개 변수인 defaultFileName 을 생략하면 지정된 URL에서 파일 이름이 사용됩니다.

다음 코드는 같은 디렉토리에서 index.xml이라는 파일을 SWF 파일로 다운로드합니다.

var request:URLRequest = new URLRequest("index.xml"); 
var fileRef:FileReference = new FileReference(); 
fileRef.download(request);

기본 이름을 index.xml 대신 currentnews.xml로 설정하려면 defaultFileName 매개 변수를 다음 코드 예제와 같이 지정하십시오.

var request:URLRequest = new URLRequest("index.xml"); 
var fileToDownload:FileReference = new FileReference(); 
fileToDownload.download(request, "currentnews.xml");

서버 파일 이름이 직관적이지 않거나 서버에서 생성된 경우 파일 이름을 바꾸면 유용할 수 있습니다. 파일을 직접 다운로드하지 않고 서버측 스크립트를 사용하여 파일을 다운로드할 때 defaultFileName 매개 변수를 명시적으로 지정하는 것도 좋습니다. 예를 들어, 전달되는 URL 변수에 따라 특정 파일을 다운로드하는 서버측 스크립트가 있다면 defaultFileName 매개 변수를 지정해야 합니다. 그렇지 않으면 다운로드된 파일의 기본 이름이 서버측 스크립트 이름이 됩니다.

서버 스크립트에서 파싱할 매개 변수를 URL에 첨부하면 download() 메서드를 사용하여 서버에 데이터를 보낼 수 있습니다. 다음 ActionScript 3.0 코드 예제는 ColdFusion 스크립트에 전달되는 매개 변수에 따라 문서를 다운로드합니다.

package 
{ 
    import flash.display.Sprite; 
    import flash.net.FileReference; 
    import flash.net.URLRequest; 
    import flash.net.URLRequestMethod; 
    import flash.net.URLVariables; 
 
    public class DownloadFileExample extends Sprite 
    { 
        private var fileToDownload:FileReference; 
        public function DownloadFileExample() 
        { 
            var request:URLRequest = new URLRequest(); 
            request.url = "http://www.[yourdomain].com/downloadfile.cfm"; 
            request.method = URLRequestMethod.GET; 
            request.data = new URLVariables("id=2"); 
            fileToDownload = new FileReference(); 
            try 
            { 
                fileToDownload.download(request, "file2.txt"); 
            } 
            catch (error:Error) 
            { 
                trace("Unable to download file."); 
            } 
        } 
    } 
}

다음 코드는 URL 변수 값에 따라 서버에서 두 파일 중 하나를 다운로드하는 ColdFusion 스크립트인 download.cfm을 보여 줍니다.

<cfparam name="URL.id" default="1" /> 
<cfswitch expression="#URL.id#"> 
    <cfcase value="2"> 
        <cfcontent type="text/plain" file="#ExpandPath('two.txt')#" deletefile="No" /> 
    </cfcase> 
    <cfdefaultcase> 
        <cfcontent type="text/plain" file="#ExpandPath('one.txt')#" deletefile="No" /> 
    </cfdefaultcase> 
</cfswitch>

FileReferenceList 클래스

FileReferenceList 클래스를 사용하면 사용자가 서버측 스크립트로 업로드할 하나 이상의 파일을 선택할 수 있습니다. 파일 업로드는 FileReference.upload() 메서드로 처리되며 이 메서드는 선택한 파일 각각에 대해 별도로 호출해야 합니다.

다음 코드는 두 가지 FileFilter 객체( imageFilter textFilter )를 만들고 배열에서 FileReferenceList.browse() 메서드로 전달합니다. 그러면 [운영 체제 파일] 대화 상자에 파일 형식에 대한 두 가지 가능한 필터가 표시됩니다.

var imageFilter:FileFilter = new FileFilter("Image Files (*.jpg, *.jpeg, *.gif, *.png)", "*.jpg; *.jpeg; *.gif; *.png"); 
var textFilter:FileFilter = new FileFilter("Text Files (*.txt, *.rtf)", "*.txt; *.rtf"); 
var fileRefList:FileReferenceList = new FileReferenceList(); 
try 
{ 
    var success:Boolean = fileRefList.browse(new Array(imageFilter, textFilter)); 
} 
catch (error:Error)  
{ 
    trace("Unable to browse for files."); 
}

FileReferenceList를 사용하면 둘 이상의 파일을 선택할 수 있지만 사용자가 FileReferenceList 클래스를 사용하여 하나 이상의 파일을 선택하고 업로드할 수 있도록 하는 것은 FileReference.browse() 를 사용하여 파일을 선택하는 것과 같습니다. 여러 개의 파일을 업로드하려면 FileReference.upload() 를 사용하여 선택한 파일을 각각 업로드해야 합니다.

var fileRefList:FileReferenceList = new FileReferenceList(); 
fileRefList.addEventListener(Event.SELECT, selectHandler); 
fileRefList.browse(); 
 
function selectHandler(event:Event):void 
{ 
    var request:URLRequest = new URLRequest("http://www.[yourdomain].com/fileUploadScript.cfm"); 
    var file:FileReference; 
    var files:FileReferenceList = FileReferenceList(event.target); 
    var selectedFileArray:Array = files.fileList; 
    for (var i:uint = 0; i < selectedFileArray.length; i++) 
    { 
        file = FileReference(selectedFileArray[i]); 
        file.addEventListener(Event.COMPLETE, completeHandler); 
        try 
        { 
            file.upload(request); 
        } 
        catch (error:Error) 
        { 
            trace("Unable to upload files."); 
        } 
    } 
} 
function completeHandler(event:Event):void 
{ 
    trace("uploaded"); 
}

Event.COMPLETE 이벤트는 배열의 각 FileReference 객체에 추가되므로 각 파일의 업로드가 끝나면 Flash Player에서 completeHandler() 메서드를 호출합니다.