[JavaScript] 이미지 업로드


JavaScript는 객체 기반 기능 스크립팅 언어이며 웹에서 눈에 띄는 위치를 차지합니다.

아래는 프로필 페이지에 사진을 업로드하기 위해 로컬에서 이미지를 선택할 때 미리보기에 대한 코드입니다. 처음에는 기본 이미지가 표시되는 동안 이미지 파일을 선택하면 이미지를 업로드하기 전에 화면에 표시됩니다.

브라우저에서 볼 수 있는 문제로 파일을 선택하면 C:\fakepath에서 파일을 찾으려고 시도합니다. Fakepath 문제를 해결하려면 인터넷 옵션 메뉴를 선택한 다음 보안 탭 > 인터넷 > 사용자 지정 수준을 선택합니다. 그리고 중앙 하단의 “서버에 파일을 업로드할 때 로컬 디렉토리 경로 포함”을 선택합니다.


아래는 전체 코드입니다.

<!DOCTYPE html>
<html lang="ko" class="">
<head>
<meta charset="utf-8"/>
<meta http-equiv="cache-control" content="no-cache"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<script type="text/javascript">
       function ImageViewer() {
             var IMAGE_MAX_WIDTH = 225;
             var IMAGE_MAX_HEIGHT = 225;
             var IMAGE_EXTENSION_TYPES = ( 'bmp', 'jpg', 'jpeg', 'gif', 'png' );
 
             // 업로드하는 사용자의 이미지를 미리보기합니다.
             // inputID : form의 input 태그 아이디입니다.
             // imageID : 입력 화면에 미리보기에 이용할 기본 이미지가 있어야합니다.
             function preview(inputID, imageID) {
                    var inputField = document.getElementById(inputID);
                    var source = inputField.value;
                    var ext = source.substring(source.lastIndexOf(".") + 1, source.length).toLowerCase();
                    for (var i = 0; i < IMAGE_EXTENSION_TYPES.length; i++) {
                           if (IMAGE_EXTENSION_TYPES(i) == ext)
                                 break;
                    }
                    if (i == IMAGE_EXTENSION_TYPES.length) {
                           alert('지원하지 않는 이미지 형식입니다. 지원 형식:\n\n' + IMAGE_EXTENSION_TYPES.join(', '));
                           return;
                    }
                   
                    // 브라우저 검사하여 실제 이미지 경로 찾기
                    var ua = window.navigator.userAgent;
                    var localImagePath;
                    if (ua.indexOf("MSIE") > -1) {
                           if (source.indexOf("\\fakepath\\") < 0) {
                                 localImagePath = source;
                           } else {
                                 inputField.select();
                                 localImagePath = document.selection.createRange().text.toString();
                                 inputField.blur();
                           }
                    } else {
                           if (ua.indexOf("Firefox/3") > -1) {
                                 localImagePath = inputField.files.item(0).getAsDataURL();
                           } else {
                                 localImagePath="file://" + source;
                           }
                    }
                   
                    // 이미지 사이즈 조정
                    var uploadImage = new Image();
                    uploadImage.src = localImagePath;
                    var x = parseInt(uploadImage.width);
                    var y = parseInt(uploadImage.height);
                    if (x > IMAGE_MAX_WIDTH) {
                           y *= IMAGE_MAX_WIDTH / x;
                           x = IMAGE_MAX_WIDTH;
                    }
                    if (y > IMAGE_MAX_HEIGHT) {
                           x *= IMAGE_MAX_HEIGHT / y;
                           y = IMAGE_MAX_HEIGHT;
                    }
                    if (x == 0 || y == 0) {
                           x = IMAGE_MAX_WIDTH;
                           y = IMAGE_MAX_HEIGHT;
                    }
                   
                    // 이미지 교체
                    var targetImage = document.getElementById(imageID);
                    targetImage.style.display = (x < 1 || y < 1) ? 'none' : '';
                    targetImage.src = uploadImage.src;
                    targetImage.width = x;
                    targetImage.height = y;
             }
             this.preview = preview;
       }
       var imageViewer = new ImageViewer();
</script>
</head>
<body>
       <div id="photoScreen"></div>
       <form>
             이미지 업로드 : <br/>
             <input type="file" id="myphoto" onchange="imageViewer.preview('myphoto', 'previewImage');" /> <br />
             <br /> <img id="previewImage" name="previewImage" src="http://agapeuni.m/images/default.png" alt="이미지 미리보기" />
       </form>
</body>
</html>

아래는 처음 뜨는 화면입니다.


파일을 선택하면 선택한 이미지가 화면처럼 나타납니다. 이미지는 가로 225 세로 225로 강제 설정되었습니다.