처음에는 페이지 이동 없이 보여주어야 하니 ajax로 구현해야 되는건가 싶었다. 마침 팀원 중 ajax를 사용하는 분이 있어 그 분의 코드를 참고하여 ajax로 임시 파일을 저장하고 resourceUrl을 리턴값으로 받으려는 시도를 했다.
그런데 jQuery없이 순수 javascript로 해서 그런지 여러 에러가 많았다. 특히 file객체를 전달하지 못했다는 에러를 자주 만났다. 여러 블로그를 찾아보다 보니 반드시 해당 기능을 ajax로 해야하는지에 대한 의문이 들었다. (그제서야..)
기능으로 찾아보니 역시나 ajax를 포함한 서버 통신 없이도 업로드한 파일의 정보를 가져와서 보여주는 데 사용하는 api가 존재했다. 바로 FileReader
이다.
default_layout.html
에 script 태그로 추가해주었다. 그러면 이 스크립트 파일을 해당 레이아웃을 사용하는 모든 화면에서 사용할 수 있다.<div id="image-container"></div>
로 한번 감싸주고 css에서 속성을 추가해 주었다. <!-- default_layout.html -->
<!-- 공통 js plugins -->
<script src="https://kit.fontawesome.com/b638b1d7ed.js" crossorigin="anonymous"></script>
<script type="text/javascript" th:src="@{/js/showTmpImage.js}" ></script>
...
<!-- createPostForm.html -->
<input onchange="setThumbnail(event);" type="file" name="ATTF_OBJ" id="ATTF_OBJ" >
<div id="image-container"></div>
/* main.css */
#image-container {
width: 100%;
/* height: 30rem; */
overflow: hidden;
}
#image-container img {
width: 100%;
height: 100%;
}
// showTmpImage.js
function setThumbnail(event) {
var reader = new FileReader();
reader.onload = function(event) {
// <img> 생성
var img = document.createElement("img");
img.setAttribute("src", event.target.result);
// img가 들어갈 부모 찾기
const parent = document.querySelector("div#image-container");
// 기존 이미지 있으면 삭제
while (parent.firstChild) {
parent.firstChild.remove()
}
// 부모 안에 이미지 삽입
parent.appendChild(img);
};
reader.readAsDataURL(event.target.files[0]);
}