<input type="file" 을 ajax로 보내려고 한다 할 때,

원칙대로 하자면 FormData를 만들어서 정정당당하게 보내는 방법이 있겠으나,

거지같은 하위버전 브라우저를 커버하려면 iframe을 하나 파서 보내는 수 밖에 없음.


대략 아래와 같은 형태.


1. 보이지 않는 <iframe>을 하나 만든다.

2. 보이지 않는 <form>을 하나 만든다.

3. <form>에 보내고자 하는 <input type="file" 을 append

4. <form>의 target을 <iframe>의 name으로 지정

5. <form> submit을 하고 <iframe>의 onload 이벤트 핸들러를 통해 결과값을 받기.



아래는 간략한 예제.


<script>

// files, action URL, response를 받을 callback을 지정

function ajaxFileUpload(files, action, callback)

{

    // iframe의 name이자, form의 target

    var target_name = 'iframe_upload';


    // form 생성

    var form = $('<form action="'+action+'" method="post" enctype="multipart/form-data" style="display:none;" target="'+target_name+'"></form>');

    $('body').append(form);

    // 전송할 file element를 갖다 붙임

    files.appendTo(form);


    // iframe 생성

    var iframe = $('<iframe src="javascript:false;" name="'+target_name+'" style="display:none;"></iframe>');

    $('body').append(iframe);


    // onload 이벤트 핸들러

    // action에서 파일을 받아 처리한 결과값을 텍스트로 출력한다고 가정하고 iframe의 내부 데이터를 결과값으로 callback 호출

    iframe.load(function(){

        var doc = this.contentWindow ? this.contentWindow.document : (this.contentDocument ? this.contentDocument : this.document);

        var root = doc.documentElement ? doc.documentElement : doc.body;

        var result = root.textContent ? root.textContent : root.innerText;


        callback(result);


        // 전송처리 완료 후 생성했던 form, iframe 제거

        form.remove();

        iframe.remove();

    });

    

    form.submit();

}



$(document).ready(function(){

    $('#btn_submit').click(function(){

        ajaxFileUpload($('input:file'), '/upload.php', function(result){

            // response = result

            //console.log('result = '+result);

        });

    });

});

</script>


<body>

<input type="file" name="upload[]" /><br />

<input type="file" name="upload[]" /><br />

<input type="file" name="upload[]" /><br />

<input type="button" id="btn_submit" value="파일업로드" />

</body>








Posted by bloodguy
,