결론부터 말씀드리면, HTML5는 보안상의 이유로 로컬 클라이언트 파일에 직접 접근하는 것을 허용하지 않습니다. 웹 페이지가 사용자 컴퓨터의 파일을 임의로 읽거나 수정할 수 있다면 심각한 보안 취약점이 발생하기 때문입니다.
다만 방법이 전혀 없는 것은 아닙니다. 드래그 앤 드롭(Drag and Drop) 기능이나 FileSystem API를 활용하면 사용자의 상호작용을 통해 제한적으로 로컬 파일과 데이터를 주고받을 수 있습니다.
드래그 앤 드롭 예제
다음은 HTML5의 드래그 앤 드롭 기능을 활용해 웹 브라우저에서 요소를 자유롭게 옮길 수 있도록 구현한 예제입니다. 보라색 박스를 직접 끌어다 놓아보세요.
<!DOCTYPE HTML>
<html>
<head>
<style>
#boxA, #boxB {float:left;padding:10px;margin:10px; -moz-user-select:none;}
#boxA { background-color: #6633FF; width:75px; height:75px; }
#boxB { background-color: #FF6699; width:150px; height:150px; }
</style>
<script>
function dragStart(ev) {
ev.dataTransfer.effectAllowed='move';
ev.dataTransfer.setData("Text", ev.target.getAttribute('id'));
ev.dataTransfer.setDragImage(ev.target,0,0);
return true;
}
</script>
</head>
<body>
<center>
<h2>Drag and drop HTML5 demo</h2>
<div>Try to drag the purple box around.</div>
<div id = "boxA" draggable = "true"
ondragstart = "return dragStart(ev)">
<p>Drag Me</p>
</div>
<div id = "boxB">Dustbin</div>
</center>
</body>
</html>주요 코드 살펴보기
- draggable="true": 해당 div 요소를 드래그할 수 있도록 설정합니다.
- dragStart(ev): 드래그가 시작될 때 실행되는 이벤트 핸들러 함수입니다.
- dataTransfer.setData(): 드래그되는 요소의 id 값을 데이터로 저장해 놓습니다(drop 대상에서 참조할 수 있음).
- setDragImage(): 드래그 중 화면에 표시될 이미지를 지정합니다.
이처럼 HTML5의 드래그 앤 드롭 API를 사용하면 별도의 플러그인 없이도 브라우저 안에서 직관적인 파일 및 요소 조작 인터페이스를 손쉽게 만들 수 있습니다.