[Node.js] socket 통신으로 파일 업로드 하기[Node.js] socket 통신으로 파일 업로드 하기

Posted at 2020. 5. 14. 07:47 | Posted in Node.js





GitHub : https://github.com/sffc/socketio-file-upload




대용량 파일을 해야하는데 가능하면 비동기 통신으로 작업을 진행하고 싶었다.


가능하면 사용자의 작업진행에 딜레이를 줄이기 위해.


그렇게 작업을 진행하다 찾게된 라이브러리가 socketio-file-upload 이다.




해당 포스팅은 단순히 socketio-file-upload의 API 부분만을 간략히 정리한 내용이다.





■ 소켓통신을 이용한 파일 업로드





#01. socketio-file-upload 설치




 $ npm install socketio-file-upload

 









#02. 업로드 처리 서버 생성




전송받은 파일을 업로드할 node.js 서버를 생성한다.


socket.io와 express 모듈을 필요로 한다.



 socket.io.file.js

const socketUpload = require( "socketio-file-upload" );

const socketio = require( "socket.io" );

const express = require( "express" );


// @breif express 서버 생성

const app = express()

    .use( socketUpload.router )         // @details express 모듈과 같은 연결 기반 미들웨어를 사용하는 경우 값을 미들웨어로 전달한다.

    .use( express.static( __dirname ) ) // @details 경로를 지정( __dirname : 현재경로 )

    .listen( 52273 );                       // @details 포트를 지정


const io = socketio.listen( app );

io.sockets.on("connection", function( socket ) {


    // @breif 업로드를 수행할 소켓( socketio-file-upload ) 인스턴스 생성

    let uploader = new socketUpload();


    // @breif 업로드 경로를 지정

    uploader.dir = "/nodejs";


    uploader.listen( socket );


    // @breif 파일이 저장될 때 수행

    uploader.on("saved", function(event) {


        console.log(event.file);

    });


    // @breif 오류 처리

    uploader.on("error", function(event) {


        console.log("Error from uploader", event);

    });

});











#03. 소켓 통신을 사용한 파일 업로드




# 소스코드

 node_upload_one.html

<html>

<head>

<title>:: node.js 파일업로드 ① ::</title>

<script type="text/javascript" src="/socket.io/socket.io.js"></script>

<script type="text/javascript" src="/siofu/client.js"></script>

<script type="text/javascript">

    document.addEventListener("DOMContentLoaded", function() {


        // @breif 인스턴스 초기화

        let socket = io.connect( "ws://localhost:52273" );

        let siofu = new SocketIOFileUpload( socket );


        // @details 사용자가 지정된 HTML 입력 요소에서 파일을 선택하면

        //             socketio-file-upload 모듈이 해당 파일 또는 해당 파일의 업로드를 수행한다.

        siofu.listenOnInput( document.getElementById( "uploadInput" ) );


        // @breif 파일이 업로드 될때 수행

        siofu.addEventListener("complete", function(event) {


            console.log( event.success );

            console.log( "-------------------------------" );

            console.log( event.file );


            alert( "파일명 : " + event.file.name );

        });


    }, false);

</script>

</head>

<body>

<label>업로드 파일 선택 : <input type="file" id="uploadInput"/></label>

</body>

</html>




# 출력결과






# 실행로그











#04. file태그 사용하지 않고, 파일 올리기



기본적으로 HTML에서는 항상


파일을 업로드 할때는 <input type="file">을 선언해 주어야 했지만.


socketio-file-upload를 사용하면 <button>을 생성하는것으로 간단히 파일 업로드가 가능하다.


위의 html 코드를 조금 변경하여 작업을 진행해 보자.




# 소스코드

 node_upload_two.html

<html>

<head>

<title>:: node.js 파일업로드 ② ::</title>

<script type="text/javascript" src="/socket.io/socket.io.js"></script>

<script type="text/javascript" src="/siofu/client.js"></script>

<script type="text/javascript">

    document.addEventListener("DOMContentLoaded", function() {


        // @breif 인스턴스 초기화

        let socket = io.connect( "ws://localhost:52273" );

        let siofu = new SocketIOFileUpload( socket );


        // @breif siofu.prompt 이 방벙을 호출하면 업로드할 파일을 선택하라는 메세지를 바로 표시 할 수 있다.

        document.getElementById("upload_btn").addEventListener( "click", siofu.prompt, false );



        /* siofu.listenOnInput( document.getElementById( "upload_input" ) ); */


        // @breif 파일이 업로드 될때 수행

        siofu.addEventListener("complete", function(event) {


            console.log( event.success );

            console.log( "-------------------------------" );

            console.log( event.file );


            alert( "파일명 : " + event.file.name );

        });


    }, false);

</script>


</head>

<body>

<!-- label>업로드 파일 선택 : <input type="file" id="upload_input"/></label -->

<p><button id="upload_btn">파일 업로드</button></p>

</body>

</html>




# 출력결과








#05. 드래그 앤 드롭으로 파일 업로드 하기



마지막 예제는 조금 재미있는것을 만들어 보자.


socketio-file-upload에서 지원하는 함수 listenOnDrop( )를 사용하여


드래그 앤 드롭 UI를 구현해 보자.



# 소스코드

 node_upload_three.html

<html>

<head>

<title>:: node.js 파일업로드 ③ ::</title>

<script type="text/javascript" src="/socket.io/socket.io.js"></script>

<script type="text/javascript" src="/siofu/client.js"></script>

<script type="text/javascript">

    document.addEventListener("DOMContentLoaded", function() {


        // @breif 인스턴스 초기화

        let socket = io.connect( "ws://localhost:52273" );

        let siofu = new SocketIOFileUpload( socket );


        // @breif 사용자가 지정된 HTML 입력 요소에서 파일을 드래그앤 드랍하면

        // socketio-file-upload 모듈이 해당 파일 또는 해당 파일의 업로드를 수행한다.

        siofu.listenOnDrop( document.getElementById( "file_drop" ) );


        // @breif 파일이 업로드 될때 수행

        siofu.addEventListener("complete", function(event) {


            console.log( event.success );

            console.log( "-------------------------------" );

            console.log( event.file );


            alert( "파일명 : " + event.file.name );

        });


    }, false);

</script>


</head>

<body>

    <div id="file_drop" dropzone="copy" title="drop files for upload" style="width:370px;height:370px;border:1px solid #FF0000;">

        파일을 이곳에 올려두세요

    </div>

</body>

</html> 




# 출력결과









Name __

Password __

Link (Your Website)

Comment

SECRET | 비밀글로 남기기