Flex - Java FileUpload를 구현중 입니다.

748 views
Skip to first unread message

이건욱

unread,
Aug 8, 2013, 10:06:58 PM8/8/13
to nett...@googlegroups.com
현재 프로젝트로 Flex -> Java로 파일을 전송하는 걸 Netty를 이용하고 있습니다. 프로토콜은 http를 사용합니다.
Flex에서 FileReference를 사용해 로드된 파일을 ByteArray로 전송합니다.

--------------플렉스 소스-------------------------
private function fileReferenceComplete( event:Event ):void{
fr = event.currentTarget as FileReference;
        .....
        fileListArr.push({label:fr.name, data:fr.data});
}

private function startUpload(booIsFirst:Boolean):void {
        var params:URLVariables = new URLVariables();
        params.workName = "upload_test";
        params.FileName =fileListArr[_numCurrentUpload].label;
        // params["FileData[]"] = imageArray;
        params.FileData = fileListArr[_numCurrentUpload].data;

        var request:URLRequest = new URLRequest();
request.url = _strUploadDomain;
request.method = URLRequestMethod.POST;
        request.requestHeaders.push(new URLRequestHeader("Content-type", "multipart/mixed"));
        request.data = params;

        loader = new URLLoader();
loader.dataFormat = URLLoaderDataFormat.VARIABLES;
        loader.load(request);
}

자바 측에서는 Netty Http 예제인 HttpUploadServer, HttpUploadServerHandler, HttpUPloadServerInitializer를 구현했습니다.

질문 입니다. 플렉스에서 ByteArray로 된 텍스트 파일을 전송하면 자바에서 이상없이 전달됩니다. 하지만 이미지 파일같은 바이너리 파일을 전송하게 되면 헤더의 CONTENT-LENGTH가 턱없이 작게 나옵니다.
(56이지만 실제 파일 크기는 75Kb입니다.)

-------------------java에서 출력한 헤더 정보-----------------------
HTTP Upload Server at port 8200.
Open your browser and navigate to http://localhost:8200/
URI: null=

HEADER: Accept=*/*

HEADER: Accept-Language=ko-KR

HEADER: x-flash-version=11,8,800,94

HEADER: Content-Type=multipart/mixed

HEADER: Content-Length=56

HEADER: Accept-Encoding=gzip, deflate

HEADER: User-Agent=Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)

HEADER: Host=172.17.102.37:8200

HEADER: DNT=1

HEADER: Connection=Keep-Alive

HEADER: Cache-Control=no-cache

어느 부분이 잘못되었는지 알려주시면 감사하겠습니다.

이건욱

unread,
Aug 8, 2013, 10:43:22 PM8/8/13
to nett...@googlegroups.com
한가지 더 질문을 드리자면 Flex에서 URLVariables로 전송할 때 파라미터가 들어오는 순서가 뒤죽박죽인데 순서대로 받을 수 있는 방법은 없는지요.

서버에서 FileName이 먼저오고 나중에 전달된 FileData 를 가지고 파일로 저장을 해야 하는데 순서가 바뀌니 어딘가에 둘중 하나를 저장하고 있어야 합니다.

이 부분도 알려주시면 감사하겠습니다.

"이희승 (Trustin Lee)"

unread,
Aug 9, 2013, 3:23:56 AM8/9/13
to nett...@googlegroups.com
서버에서 받은 헤더 정보를 바탕으로 추측하건데 Flex에서 그렇게 전송한 것이 아닌가 싶습니다.  실제로 그렇게 전송이 된 것인지 Netty 측에서 처리할 때 그 값이 변경된 것인지 확인을 부탁드리겠습니다.

--
Google 그룹스 'Netty Korean User Group' 그룹에 가입했으므로 본 메일이 전송되었습니다.
이 그룹에서 탈퇴하고 더 이상 이메일을 받지 않으려면 netty-ko+u...@googlegroups.com에 이메일을 보내세요.
더 많은 옵션을 보려면 https://groups.google.com /groups/opt_out을(를) 방문하세요.

-- 
https://twitter.com/trustin
https://twitter.com/trustin_ko
https://twitter.com/netty_project

이건욱

unread,
Aug 11, 2013, 10:08:09 PM8/11/13
to nett...@googlegroups.com
첫 번째 개시글의 문제는 해결 하였습니다. 확인 결과 
private static final HttpDataFactory factory = new DefaultHttpDataFactory(DefaultHttpDataFactory.MINSIZE);
팩토리 인스턴스 생성 시 DefaultHttpDataFactory.MINSIZE 로 파라미터를 넘기니 제대로 받아오질 못한듯 합니다.
  - 0을 넘기면 파일이 제대로 생성됩니다.
2048L로 테스트 시 사이즈는 약간 오버돼서 넘어오고 텍스트의 경우 디코딩이 제대로 수행되지 않는것 같습니다.
위의 팩토리 인스턴스가 파일을 멀티 파트로 전송 시 생성한 크기 이하면 메모리에서, 이상이면 Temp 폴더에 임시파일로 처리하는 구조인듯 한데, 
0으로 넘겨서 무조건 임시파일로 생성하도록 수정했을 때 실제 서비스 시 이상이 없는지 불안하긴 하네요..

참! 맨위의 개시글에서 Flex측에서 URLVariables로 파일의 ByteArray와 추가 정보를 함께 넘기면 자바 측에서 데이터 오류가 나면서 Content가 제대로 처리되지 않던듯 합니다.
Flex측에서 추가 정보와 파일부분을 나눠서 전송하니 ( HttpUploadServer 예제에서와 같이 웹 브라우저서에서 Submit으로 전송하는것 처럼..) 제대로 받을 수 있었습니다.

"이희승 (Trustin Lee)"

unread,
Aug 11, 2013, 10:22:16 PM8/11/13
to nett...@googlegroups.com
다른 말씀입니다만 .. 네티에서 제공하는 파일 업로드 패키지는 퀄리티 문제
가 있어서 사용을 추천드리기는 어려울 것 같습니다. 외부 컨트리뷰터의 작
업물인데 유지보수도 잘 안되고 문제가 있습니다. 여유가 있으시면 Apache
Commons FileUpload 를 수정해서 네티에 붙여 쓰시는 것을 추천드립니다.
http://commons.apache.org/proper/commons-fileupload/index.html
> --
> Google 그룹스 'Netty Korean User Group' 그룹에 가입했으므로 본 메일이
> 전송되었습니다.
> 이 그룹에서 탈퇴하고 더 이상 이메일을 받지 않으려면 netty-
> ko+unsu...@googlegroups.com에 이메일을 보내세요.
> 더 많은 옵션을 보려면 https://groups.google.com /groups/opt_out을(를
> <https://groups.google.com/groups/opt_out%EC%9D%84%28%EB%A5%BC>) 방문
> 하세요.

이건욱

unread,
Aug 11, 2013, 10:58:59 PM8/11/13
to nett...@googlegroups.com
아...그렇군요..
실제 서비스 시 1천만 단위의 클라이언트들이 붙어서 동시에 파일을 전송해야 하는 작업인지라.. 파일 업로드 시 문제가 생기면 곤란한 상황 입니다.
말씀 하신대로 통신은 네티로 하고 파일은 Commons FileUpload를 써봐야 하겠습니다..
** 구현을 하다보니 네티의 Http 파일 전송과 Commons FileUpload의 Http와 비슷한듯 한데. 방식이 약간 다른가 봅니다..
소켓 스트림은 해봤는데 Http 파일 전송은 처음이라 어려움이 많습니다.. 도움 주셔서 감사드립니다..

이건욱

unread,
Aug 12, 2013, 5:15:18 AM8/12/13
to nett...@googlegroups.com
한가지 더 궁금한게 있습니다.

Commons-FileUpload를 Netty에 붙여서 사용하는걸 추천하신다고 했는데 FileUpload 부분만 해당 클래스를 사용하지 않고 Commons-FileUpload를 사용하라는 말씀인가요? 아니면 Http로 파일 업로드 하는 부분을 새로 구현해야 하는건가요?

해당 부분 구현을 위해 자료를 찾던 중 어떻게 구현을 해야 하는지 막막해서 질문을 드려 봅니다. 제가 참고할 만한 예제나 힌트를 주시면 감사하겠습니다.
Reply all
Reply to author
Forward
0 new messages