| 현재 flash8 에서 지원하는 파일 업로드 클래스인 FileReference 는 어쩌면 반쪽짜리 업로드 클래스이다. 왜냐하면 파일업로드 완료시 서버와의 어떤 변수 값도 받을 수 없기 때문이다.
물론 onComplete 가 업로드 완료시에 플래시 쪽에서 호출되지만 이는 단순히 업로드 완료만 알수 있는것이다.
특별히 안정적으로 업로드를 구성하지 않는다면 다시말해, 개인이 업로드를 관리하고 사용자가 많지 않을경우 물론 업로드가 완료되는 이벤트만 발생되어도 문제가 없다.
하지만 사용자가 많은 경우, 예를 들어 사용자가 사진을 업로드하는 사이트를 만들경우,
이런 경우에는 반드시 업로드하는 클라이언트 파일명을 바꾸어야 할 필요가 있다.
중복의 여지가 있기 때문이다. 만약 이런 파일 필터링을 거치지 않는다면 분명히 파일이름이 같게되어 이전 파일이 덮어써지는 현상이 발생할 것이다.
따라서 좀더 안정적인 파일 업로드 구현을 원한다면 파일 생성 일자나 일련의 첨자를 붙여 파일 이름을 변경하는 것은 필수이다.
이때 문제가 되는 것이 바로 위에 언급한 서버와 플래시간의 변수 교환문제이다.
FileReference class 에서의 upload() method의 파라미터에는 서버파일의 데이타를 받을수 없다.
따라서 서버에서 파일 이름을 임의로 변경해 버리면 플래시에서 알 수 있는 방법이 없다.
물론 약간의 팁을 사용하면 가능하다.
다행이도 upload url에 매개변수를 첨부하여 서버에 전송할 수 있다.
바로 이런방법으로 서버에서 파일명을 저장하는 것이 아니라 플래시에서 정한 파일명을 서버로 보내 그걸 파일명으로 저장하면 위와 같은 문제를 해결할 수 있다.
<upLoad.as>
private function upload():Void
{
var success:Boolean;
noRep=new Date().getTime();
success = this._fileRef.upload(UploadExample.URL+"?noRep="+noRep);
// url에 중복을 피하기 위한 현재 시간 정보를 첨부한다.
}
private function onComplete(fileRef:FileReference):Void
{
trace(file Name--->"+noRep+"_"+fileRef.name);
//업로드 완료시 서버에 저장완료된 파일명을 알수 있다.
}
<upload.php>
<?php //path to storage
$storage = 'uploadedFiles'; $upFile="$storage/".$noRep.'_'.$_FILES['Filedata']['name'];
//if the file is moved successfully
if ( move_uploaded_file( $_FILES['Filedata']['tmp_name'] , $upFile ) ) {
echo( '1 ' . $_FILES['Filedata']['name']); //file failed to move
}else{
echo( '0');
} ?>
AS3.0 에서 업로드 데이타 필드명을 따로 플래시에서 지정할 수 있게 바뀌었지만 서버에서의 변수 문제는 제공해 주질않았다.
|