시작하는 중

드래그 앤 드롭 업로드 본문

자바스크립트

드래그 앤 드롭 업로드

싱욱 2023. 3. 28. 23:54

React 프로젝트를 진행하면서, 이미지를 업로드할 때 드래그 앤 드롭과 이미지를 보여주는 것으로 구현하고 싶었다.

찾다보니까 본 글인데, drag 이벤트를 활용하는 것이다.

https://developer.mozilla.org/ko/docs/Web/API/HTML_Drag_and_Drop_API

 

HTML 드래그 앤 드롭 API - Web API | MDN

HTML 드래그 앤 드롭 인터페이스는 파이어폭스와 다른 브라우저에서 어플리케이션이 드래그 앤 드롭 기능을 사용하게 해줍니다. 이 기능을 이용해 사용자는 draggable 요소를 마우스로 선택해 droppa

developer.mozilla.org

읽다보면, drag된 아이템은 event의 dataTransfer에 담겨있다. 일단, 블로그 글대로 따라가기 위한 코드!

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>드래그 앤 드롭 업로드</title>
  </head>
  <body>
    <h2>파일 업로드 해보기</h2>
    <div
      style="background-color: #aeafae; width: 400px; height: 300px"
      id="default-div"
    >
      <input type="file" id="input-file" />
    </div>
    <script>
      const bgDivTag = document.getElementById("default-div");
      const fileInputTag = document.getElementById("input-file");

      bgDivTag.addEventListener("dragenter", (e) => {
        console.log("dragenter");
      });

      bgDivTag.addEventListener("dragleave", (e) => {
        console.log("dragleave");
      });

      bgDivTag.addEventListener("dragover", (e) => {
      	e.preventDefault();
      
        console.log("dragover");
      });

      bgDivTag.addEventListener("drop", (e) => {
        e.preventDefault();

        console.log("drop");
      });
    </script>
  </body>
</html>

 

 

 

이렇게 나오고! 파일을 끌어다가 놔보면,

결과도 잘 나온다.

여기서 이제 이벤트를 들여다 볼 것이다.

각 이벤트마다 1번씩 이벤트를 출력해볼 것이다.

뭐에요 왜 안나와요

console.log(e.dataTransfer.files);

이렇게 까지하니까 나온다.

드랍에서만 나온다. 아마도 타입이랑 관련이 있나? fileList라서 그런건 것 같다..

아무튼 drop 이벤트에서만 데이터를 가져올 수 있다는 것

 

근데 dragover에 preventdefault가 있고, 심지어 mdn에서도 있어서 찾아보니까

https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/dragover_event#examples

 

HTMLElement: dragover event - Web APIs | MDN

The dragover event is fired when an element or text selection is being dragged over a valid drop target (every few hundred milliseconds).

developer.mozilla.org

여기서,

  • in the dragover event handler for the target container, we call event.preventDefault(), which enables it to receive drop events.

라고 한다. 아마도 dragover가 더 앞서는 듯?

 

그 뒤로는 쉽다.

 

input 태그 가져와서 files를 할당하면 됨

fileInputTag.files = e.dataTransfer.files;

참고로 change나 input 이벤트는 발생하지 않는다.

 

reference

https://dev-gorany.tistory.com/254

https://developer.mozilla.org/ko/docs/Web/API/HTML_Drag_and_Drop_API

https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/dragover_event#examples