반응형
input 태그를 이용하여 이미지 파일을 업로드 할 때, 선택한 이미지의 미리보기 기능이 필요한 경우가 있습니다.
(서버에 파일을 업로드하지 않고, 미리보기 기능을 구현하는 것)
해당 소스는 크롬, 파폭, 엣지 등 현재 많이 사용되는 최신 브라우저와 익스플로러 11버전 이상만 지원합니다.
input file 이미지 선택시, 미리보기 구현 소스 (ie11+)
※ 해당 소스는 제이쿼리와 함께 사용해야합니다.
스크립트 부분
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
<script src="//code.jquery.com/jquery.min.js"></script> <!-- 제이쿼리 1.x 최신 버전 로드 -->
<script>
// input file 이미지 미리보기 함수
function previewImage(targetObj, previewId) {
var ext = $(targetObj).val().split('.').pop().toLowerCase();
if ($.inArray(ext, ['gif','png','jpg','jpeg']) == -1) {
alert('gif, png, jpg, jpeg 파일만 업로드 할수 있습니다.');
return;
}
var preview = document.getElementById(previewId); // 미리보기 div id
var ua = window.navigator.userAgent;
if (ua.indexOf("MSIE") > -1) { //ie일때
targetObj.select();
try {
var src = document.selection.createRange().text; // get file full path
var ie_preview_error = document
.getElementById("ie_preview_error_" + previewId);
if (ie_preview_error) {
preview.removeChild(ie_preview_error); //error가 있으면 delete
}
var img = document.getElementById(previewId); //이미지가 뿌려질 곳
img.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"
+ src + "', sizingMethod='scale')"; //이미지 로딩, sizingMethod는 div에 맞춰서 사이즈를 자동조절 하는 역할
} catch (e) {
if (!document.getElementById("ie_preview_error_" + previewId)) {
var info = document.createElement("<p>");
info.id = "ie_preview_error_" + previewId;
info.innerHTML = "a";
preview.insertBefore(info, null);
}
}
} else { //ie가 아닐때
var files = targetObj.files;
for ( var i = 0; i < files.length; i++) {
var file = files[i];
var imageType = /image.*/; //이미지 파일일 경우만 뿌려줌.
if (!file.type.match(imageType))
continue;
var prevImg = document.getElementById("prev_" + previewId); // 이전에 미리보기가 있다면 삭제
if (prevImg) {
preview.removeChild(prevImg);
}
var img = document.createElement("img"); // 크롬은 div에 이미지가 뿌려지지 않기때문에 자식 Element를 만듬.
img.id = "prev_" + previewId;
img.classList.add("obj");
img.file = file;
preview.appendChild(img);
if (window.FileReader) { // FireFox, Chrome, Opera 확인.
var reader = new FileReader();
reader.onloadend = (function(aImg) {
return function(e) {
aImg.src = e.target.result;
};
})(img);
reader.readAsDataURL(file);
} else { // safari is not supported FileReader
//alert('not supported FileReader');
if (!document.getElementById("sfr_preview_error_"+ previewId)) {
var info = document.createElement("p");
info.id = "sfr_preview_error_" + previewId;
info.innerHTML = "not supported FileReader";
preview.insertBefore(info, null);
}
}
}
}
}
</script>
|
HTML 부분
1
2
|
<div id="user_upload_img"></div>
<input id="ex_file" type="file" onchange="previewImage(this, 'user_upload_img');">
|
위 소스 복사 붙여넣기에 문제가 생긴다면 아래 첨부 파일을 다운 받으세요.
테스트 결과
하위 익스플로러버전 까지 지원하는 소스를 찾긴했지만, 익스플로러가 여간 까다로운 것이 아니라서...
익스플로러는 차라리 미리보기 기능을 사용하지 않거나
서버에 실제 파일 업로드 후 미리보기 기능을 구현하는게 훨씬 낫다는 개인적인 생각입니다.
반응형
'웹 개발 & 정보 > JavaScript (jQuery)' 카테고리의 다른 글
[JavaScript] 디바운스(debounce) js, 이벤트(함수) 중복 실행 방지 (0) | 2018.03.02 |
---|---|
[JavaScript] 날짜 더하기 빼기 함수 (3) | 2017.09.26 |
[JavaScript] input, textarea 등 입력창에 숫자만 입력 받기 (0) | 2017.09.22 |