프로그래밍/jquery
html input 파일 이미지 미리보기 구현(멀티) 미리보기삭제
마루의 일상
2021. 11. 23. 10:24
728x90
반응형
아래 그림은 간단한 게시판 입력 화면입니다.
아래 그림에서 처럼 이미지 미리보기에서 삭제를 하면 input file에 선택되어 있는 파일도 삭제하는 기능을 만들고 싶습니다.
어떻게 하면 될까요?
우선 기본적으로 html 파일에 아래 소스가 있다고 가정해 봅시다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<div class="form-group">
<label for="subject">
파일
</label>
<div id='current_file'>
<input type="file" class="form-control" id="image" name="image[]" multiple='multiple'/>
</div>
</div>
<div class="form-group">
<label for="subject">
파일미리보기
</label>
</div>
|
cs |
js 설정 화면 소스입니다.
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
|
$("#image").change(function() {
$("#preview_img").empty();
var input = document.getElementById("image");
var files = input.files;
var a = 0;
for (var i = 0; i < files.length; i++) {
var fReader = new FileReader();
fReader.readAsDataURL(files[i]);
fReader.onloadend = function(event){
var lastModified = files[a].lastModified;
$("#preview_img").append('<div class="img_div" id="'+lastModified+'"><div class="i_div"><i class="bi bi-x-square-fill" style="color:white;float:right;" key="'+lastModified+'"></i></div><img id="view" src="'+event.target.result+'" class="img_div_img"/></div>');
a = a + 1;
}
}
});
$(document).on("click", ".i_div", function(e){
var input = $("#image").prop('files');
const dataTranster = new DataTransfer();
var target = e.target;
var removeTargetId = $(target).attr("key");
Array.from(input).filter(file => file.lastModified != removeTargetId)
.forEach(file => {
dataTranster.items.add(file);
});
$('#image')[0].files = dataTranster.files;
$("#"+removeTargetId).remove();
var input = $("#image")[0].files;
});
|
cs |
삭제 버튼을 눌렀을 때 파일 선택으로 선택했던 filelist에서도 삭제가 되어야 합니다.
$("#image")로 선택되어 있는 fileList를 가져옵니다.
var input = $("#image").prop('files'); => 파일선택 input
--> 여러 가지 방법으로 가져올 수 있음
ex 1) var input = document.getElementById('image').files;
ex 2) var input = $('#image').prop('files');
ex 3) var input = $('#image')[0].files;
ex 4) var input = $('input[type=file]')[0].files;
ex 5) var input = docuement.querySelector("#image").files
const dataTranster = new DataTransfer();
var removeId = $(target).attr("key");
Array.from(input).filter(file => file.lastModified != removeId)
.forEach(file => {
dataTranster.items.add(file);
});
$('#image')[0].files = dataTranster.files;
위 소스의 핵심은 FileList를 forEach로 돌면서 removeId(삭제할)와 같지 않으면 dataTranster.items으로 파일을 추가하는 것이다.
마지막으로 $('#image')[0].files = datraTranster.files;로 대체하기만 하면 된다.
소스 전체 파일
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
|
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>게시판 입력</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="https://code.jquery.com/jquery-3.6.0.js" integrity="sha256-H+K7U5CnXl1h5ywQfKtSj8PCmoN9aaq30gDh27Xc0jk=" crossorigin="anonymous"></script>
<!-- 합쳐지고 최소화된 최신 CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
<!-- 부가적인 테마 -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap-theme.min.css">
<!-- 합쳐지고 최소화된 최신 자바스크립트 -->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/js/bootstrap.min.js"></script>
</head>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.7.0/font/bootstrap-icons.css">
<script>
$(document).ready(function(){
function check_form() {
var board_form = document.board_form;
if (board_form.title.value == '') {
alert('제목을 입력하세요.');
board_form.title.focus();
return false;
}
if (board_form.content.value == '') {
alert('내용을 입력하세요.');
board_form.content.focus();
return false;
}
if (board_form.writer.value == '') {
alert('작성자를 입력하세요.');
board_form.writer.focus();
return false;
}
}
$("#image").change(function() {
$("#preview_img").empty();
var input = document.getElementById("image");
var files = input.files;
var a = 0;
for (var i = 0; i < files.length; i++) {
var fReader = new FileReader();
fReader.readAsDataURL(files[i]);
fReader.onloadend = function(event){
var lastModified = files[a].lastModified;
$("#preview_img").append('<div class="img_div" id="'+lastModified+'"><div class="i_div"><i class="bi bi-x-square-fill" style="color:white;float:right;" key="'+lastModified+'"></i></div><img id="view" src="'+event.target.result+'" class="img_div_img"/></div>');
a = a + 1;
}
}
});
$(document).on("click", ".i_div", function(e){
var input = $("#image").prop('files');
const dataTranster = new DataTransfer();
var target = e.target;
var removeId = $(target).attr("key");
Array.from(input).filter(file => file.lastModified != removeId)
.forEach(file => {
dataTranster.items.add(file);
});
$('#image')[0].files = dataTranster.files;
$("#"+removeId).remove();
var input = $("#image")[0].files;
});
});
</script>
<style>
.container-fluid {
width:80%;
margin-top:40px;
}
.table th {
text-align:center;
}
.table td {
text-align:center;
}
.img_div {
float:left;
/* width:100px;
height:70px; */
margin-right: 5px;
margin-bottom:5px;
background-color: black;
height: 95px;
}
.img_div_img {
width: 100px;
height: 70px;
}
.i_div {
position: relative;
/* left: 86px;
top: 17px; */
}
</style>
<div class="container-fluid">
<div class="row">
<div class="col-md-12">
<h3 class="text-center">
게시판 입력
</h3>
</div>
</div>
<div class="row">
<div class="col-md-12">
<form name="board_form" id="board_form" role="form" method='post' action='/board/insert' onsubmit="return check_form();" enctype="multipart/form-data">
<div class="form-group">
<label for="subject">
제목
</label>
<input type="text" class="form-control" id="subject" name="title" />
</div>
<div class="form-group">
<label for="textarea">
내용
</label>
<textarea class="form-control" id="textarea" rows="15" name="content"></textarea>
</div>
<div class="form-group">
<label for="subject">
작성자
</label>
<input type="text" class="form-control" id="subject" name="writer" />
</div>
<div class="form-group">
<label for="subject">
파일
</label>
<div id='current_file'>
<input type="file" class="form-control" id="image" name="image[]" multiple='multiple' onchange=''/>
</div>
</div>
<div class="form-group">
<label for="subject">
파일미리보기
</label>
</div>
<div class="form-group" style="display:flex;">
<div id='preview_img' style="text-align:left;"></div>
</div>
<div class="form-group">
<button type="submit" class="btn btn-primary">
저장
</button>
<button type="cancel" class="btn btn-cancel" onclick="window.location='/board?page=1';return false;">
취소
</button>
</div>
</form>
</div>
</div>
</div>
</html>
|
cs |
|
|
감사합니다.
728x90
반응형