개발
파일 업로드 프론트엔드 구현
⚠ 이 글은 2년 이상 지난 이야기에요. 읽으실때 참고!
프론트단 파일업로드를 구현하는도중 여러 파일을 선택하고 관리하기위해 input type=file을 제어하는 소스코드를 생성해보았다.
원리는 버튼 하나에 input file을 겹쳐놓아 한개 씩 파일 업로드를 받고 업로드가 완료되면 새 input file 태그를 복제해 기존 태그위에 겹쳐놓는다. 그러면 버튼은 새로 복제된 비어있는 input file에 또 적재하게되는 원리이다.
일반적으로는 input file 태그를 추가하는 방식으로 기존에 많이 이용한 부분을 좀 직관적인 ui로 변경해본 케이스이다.
아래 예제코드로 파일을 넘기게 되면 $_FILES['REQ_FILE'] 배열에 순차적으로 파일이 넘어오게된다.
아직까진 실험적인 부분이 많다. (한번에 다중파일 선택은 제어해야할 변수가 너무 많아서 일단 보류)
update.php
<div class="btn-file-upload">
<div class="btn btn-block theme-green">
<span>파일 선택</span>
<input type="file" id="REQ_FILE" name="REQ_FILE[]">
</div>
<small class="form-text text-muted">확인 버튼을 눌러야 선택한 파일이 업로드 됩니다.</small>
</div>
Copy
script-file.js
$(function(){
// 파일 업로드 제어
let counter = 0;
$('#REQ_FILE').on('change', function(e) {
if (e.target.files.length > 0) {
let newId = $(this).prop('id') + '_' + counter++;
let file = $(this).prop('files')[0];
let fileName = encodeURIComponent(file.name); // 한글 파일명 대응
let fileSize = file.size;
let uri = '/ajax/file-list.php?file_name=' + fileName + '&file_size=' + fileSize + '&input_file=' + newId;
// 파일 리스트 추가 및 삭제 이벤트 할당
$('.file-list').append($('<li class="pending">').load(uri, function() {
$(this).find('.btn-cancel-file').first().on('click', function() {
let id = $(this).data('id');
$(id).remove();
$(this).closest('li').remove();
});
}));
// 파일폼 복제 후 새 파일폼으로 교체. 나중에 추가된(비어있는) 폼이 우선적으로 선택됨
$(this).after($(this).clone(true).val(''));
$(this).prop('id', newId);
}
});
// 파일 삭제
$('.file-list .btn-file-remove').on('click', function() {
if (confirm('정말로 삭제하시겠습니까?')){
let action = 'remove-file';
let key = $(this).data('key');
let list = $(this).closest('li');
$.post('_update.php', {ACTION: action, REQ_KEY: key}, function(data) {
if (data === 'done') {
list.remove();
} else {
alert('삭제처리 도중에 문제가 발생했습니다.');
}
});
}
});
});
Copy
ajax/file-list.php
<?php
$file_name = $_GET['file_name'];
$file_size = $_GET['file_size'];
$input_file = $_GET['input_file'];
?>
<hr>
<div class="d-flex align-items-center">
<span class="file-icon"><?= get_icon_by_extension($file_name) ?></span>
<div class="file-info">
<div class="file-name"><?= $file_name ?></div>
<span class="file-size"><?= number_format($file_size / 1048576, 2) . ' MB' ?></span>
<span class="file-date">업로드 대기 중</span>
</div>
<div class="file-func">
<a href="#" class="btn-cancel-file" data-id="#<?= $input_file ?>"><i class="fas fa-fw fa-times"></i></a>
</div>
</div>
Copy

#jQuery #UI
0
개의 댓글
개발 카테고리의 다른 글
02/07/2020
proc_open(): fork failed errors ~ 포크 실패 에러
Laravel Rss Feed 패키지를 컴포저로 설치하려던 도중 메모리 용량 부족으로 인해 포크 실패 에러가 뜬다. 단순히 메모리 용량이 작아서 unzip 과정 또는 패키지 설치를 위에 메모리에 올리는 과정에 생기는 문제로 보인다.제일 쉬운 해결방법은 메모리 용량을 올리는 것이지만 그건 물리적인 해결방법에 불과하고 소프트웨...
09/03/2019
MySQL GROUP_CONCAT 기능으로 쿼리 결과를 하나로 합치기
Mysql CONCAT 기능에 대해서 - eruLabo잊어버릴까봐 작업 로그겸 기록 남깁니다. MySQL 또는 MariaDB에서 한 개 이상의 문자열 데이터를 합치는 DB함수로서 CONCAT을 지원합니다.통상적으로는 두개의 유효한 문자열을 합치는데 큰 문제없이 사용할 수 있...https://erulabo.com/46 마찬가지로 이전글에 이어서 작업로그 남...
09/03/2019
MySQL CONCAT 함수 및 NULL 처리 방법
쿼리 작업하다가 데이터 합칠게 있어서 CONCAT 썼다가 안되는 문제 발생해서 문제 해결 후 잊어버릴까봐 작업 로그겸 기록 남깁니다. CONCATMySQL 또는 MariaDB에서 한 개 이상의 문자열 데이터를 합치는 DB함수로서 CONCAT을 지원합니다. 통상적으로는 두개의 유효한 문자열을 합치는데 큰 문제없이 사용할 수 있는 기능이...