Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- array
- controller
- 개념
- 과정평가형
- CSS
- sql
- 오류
- POI
- select
- 태그
- eGovFramework
- Database
- Oracle
- json
- Ajax
- 함수
- eGov
- 암호화
- Java
- javascript
- html
- spring
- was
- mybatis
- 배열
- JVM
- TO_DATE
- jQuery
- web.xml
- input
Archives
- Today
- Total
web developer
[spring] 파일 관련 기능: 업로드, 다운로드, 게시글 등록 및 수정, 삭제 본문
728x90
728x90
src\main\webapp\WEB-INF\web.xml
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/config/egovframework/springmvc/dispatcher-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<!-- 240428 multipart 설정 -->
<multipart-config>
<max-file-size>31457280</max-file-size> <!-- 30mb-->
<max-request-size>1004857600</max-request-size> <!-- 100mb -->
</multipart-config>
</servlet>
pom.xml
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
(1-1) 파일 단일 업로드 기능
- javaScript
더보기
더보기
function modifyBoard() {
var formData = new FormData($("#form")[0]);
formData.append('imageFile', $('#imageFile')[0].files[0]); // 파일 추가
for (var pair of formData.entries()) {
console.log(pair[0]+ ', ' + pair[1]);
}
// var formData = $("#form").serialize();
$.ajax({
type : "POST",
url : "/boardUpdate.do",
data: formData,
dataType: "json",
processData: false, // 파일 업로드
contentType: false, // 파일 업로드
success: function(result){
if(result == 'Y') {
alert("수정되었습니다.");
location.href = "/boardList.do";
}else {
alert("수정이 실패하였습니다.");
}
},
error: function(request, status, error) {
alert("code = "+ request.status + " message = " + request.responseText + " error = " + error);
}
});
}
- java
더보기
더보기
@ResponseBody
@RequestMapping("/boardUpdate.do")
public String updateSample(
@RequestParam(value = "imageFile", required = false) MultipartFile singleFile,
BoardVO boardVO,
HttpServletRequest request,
HttpServletResponse response
) throws Exception {
if (boardVO.getId() <= 0) {
System.out.println("데이터가 없습니다.");
return "board/list";
}
String str = null;
try {
// 1. 전송받은 파일 및 파일설명 값 가져오기
System.out.println("file : " + singleFile);
// 2. 저장할 경로 가져오기
String path = request.getSession().getServletContext().getRealPath("file");
String root = path + "\\uploadFiles" ;
File file = new File(root);
// 만약 uploadFiles 폴더가 없으면 생성해라 라는뜻
if(!file.exists()) {
file.mkdirs();
}
// 업로드할 폴더 설정
String originFileName = singleFile.getOriginalFilename();
String ext = originFileName.substring(originFileName.lastIndexOf("."));
String ranFileName = UUID.randomUUID().toString() + ext;
File changeFile = new File(root + "\\" + ranFileName);
// 파일 upload
singleFile.transferTo(changeFile);
// 수정내용 update
int cnt = boardService.boardUpdate(boardVO);
if(cnt > 0) {
str = "Y";
System.out.println("수정 성공");
}else {
str = "N";
System.out.println("수정 실패");
}
} catch (IllegalStateException | IOException e) {
System.out.println("파일 업로드 실패");
e.printStackTrace();
} catch (Exception e) {
System.out.println("예외사항 발생");
e.printStackTrace();
}
return str;
}
(1-2) 파일 다중 업로드 기능
- javaScript
더보기
더보기
function modifyBoard() {
var formData = new FormData($("#form")[0]);
// 파일들을 FormData에 추가
var files = $('#imageFile')[0].files;
for(var i=0; i<files.length; i++){
formData.append('files', files[i]);
}
for (var pair of formData.entries()) {
console.log(pair[0]+ ', ' + pair[1]);
}
$.ajax({
type : "POST",
url : "/boardUpdate.do",
//data: data,
data: formData,
dataType: "json",
processData: false,
contentType: false,
success: function(result){
if(result == 'Y') {
alert("수정되었습니다.");
location.href = "/boardList.do";
}else {
alert("수정이 실패하였습니다.");
}
},
error: function(request, status, error) {
alert("code = "+ request.status + " message = " + request.responseText + " error = " + error);
}
});
}
- java
더보기
더보기
@ResponseBody
@RequestMapping("/boardUpdate.do")
public String updateSample(
MultipartFile[] files,
BoardVO boardVO,
HttpServletRequest request,
HttpServletResponse response
) throws Exception {
if (boardVO.getId() <= 0) {
System.out.println("데이터가 없습니다.");
return "board/list";
}
String str = null;
try {
// 수정내용 update
int cnt = boardService.boardUpdate(boardVO);
if(cnt > 0) {
str = "Y";
System.out.println("수정 성공");
// 저장할 경로 가져오기
String path = request.getSession().getServletContext().getRealPath("file");
// "C:\\Users\\XXX\\eclipse-workspace\\toy_project\\toy_project2\\src\\main\\webapp\\file";
String root = path + "\\uploadFiles" ;
File file = new File(root);
// uploadFiles 폴더가 없으면 생성하기
if(!file.exists()) {
file.mkdirs();
}
for(MultipartFile f : files) {
if(!f.isEmpty()) {
// 업로드할 폴더 설정
String originFileName = f.getOriginalFilename();
String ext = originFileName.substring(originFileName.lastIndexOf("."));
String ranFileName = UUID.randomUUID().toString() + ext;
File changeFile = new File(root + "\\" + ranFileName);
// 파일 upload
f.transferTo(changeFile);
}
}
}else {
str = "N";
System.out.println("수정 실패");
}
} catch (IllegalStateException | IOException e) {
System.out.println("파일 업로드 실패");
e.printStackTrace();
} catch (Exception e) {
System.out.println("예외사항 발생");
e.printStackTrace();
}
return str;
}
(1-3) 파일 다운로드 기능
- html
더보기
더보기
<tr>
<th>첨부파일</th>
<td align="center" class="listtd" style="text-align: left;">
<c:forEach items="${fileList}" var="file">
<li style="list-style: none;">
<a class="btn_file" href="javascript:filedownload('<c:out value="${file.org_file_nm}" />')"><c:out value="${file.org_file_nm}" /></a>
</li>
</c:forEach>
</td>
</tr>
- javaScript
더보기
더보기
/* form download */
function filedownload(orginalNm){
var formObj = $("form[name='fileForm']");
$("#board_num").val($("#board_id").val());
$("#org_file_nm").val(orginalNm);
formObj.attr("action", "/filedownload.do");
formObj.submit();
}
- java
더보기
더보기
@RequestMapping(value = "/filedownload.do")
public void fileDownload(
HttpServletRequest request,
HttpServletResponse response,
BoardFileVO boardFileVO
) throws Exception {
List<BoardFileVO> boardFileList = boardService.selectBoardFileCheck(boardFileVO);
if (boardFileList.isEmpty()) {
response.sendError(HttpServletResponse.SC_NOT_FOUND);
return;
}
BoardFileVO boardFile = boardFileList.get(0);
String saveDir = request.getSession().getServletContext().getRealPath("file/uploadFiles/");
File file = new File(saveDir, boardFile.getStored_file_nm());
if (!file.exists()) {
response.sendError(HttpServletResponse.SC_NOT_FOUND);
return;
}
try (FileInputStream fis = new FileInputStream(file);
OutputStream os = response.getOutputStream()) {
// 파일의 MIME 타입 설정
String mimeType = "application/octet-stream"; // 기본값
String originalName = boardFile.getOrg_file_nm();
String fileExt = CleanUtil.allowExt(originalName); // 확장자 추출
if (originalName.endsWith(".pdf")) {
mimeType = "application/pdf";
} else if (originalName.endsWith(".jpg") || fileExt.endsWith(".jpeg")) {
mimeType = "image/jpeg";
} else if (originalName.endsWith(".xlsx")) {
mimeType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
} // 다른 확장자에 따라 MIME 타입 추가 가능
response.setContentType(mimeType);
response.setContentLength((int) file.length());
// 파일 이름을 UTF-8로 인코딩하여 Content-Disposition 헤더에 설정
String fileName = URLEncoder.encode(originalName, StandardCharsets.UTF_8.toString());
response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
// 파일을 읽어와서 출력 스트림으로 전송
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = fis.read(buffer)) != -1) {
os.write(buffer, 0, bytesRead);
}
} catch (IOException e) {
// 파일 다운로드 중 예외가 발생한 경우에 대한 처리
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "파일 다운로드 중 오류가 발생했습니다.");
}
}
(2-1) 파일 등록기능 [게시글 포함]
- html
더보기
더보기
<input type="button" class="modify_botton" style="width: 80px; float:right" onclick="insertBoard()" value="등록"/>
- javaScript
더보기
더보기
function insertBoard() {
// var data = $("#form").serialize();
// console.log(data);
var formData = new FormData($("#form")[0]);
// 파일들을 FormData에 추가
var files = $('#imageFile')[0].files;
for(var i=0; i<files.length; i++){
formData.append('files', files[i]);
}
for (var pair of formData.entries()) {
console.log(pair[0]+ ', ' + pair[1]);
}
$.ajax({
type : "POST",
url : "/boardInsert.do",
data: formData,
dataType: "json",
processData: false,
contentType: false,
success: function(result){
if(result == 'Y') {
alert("등록되었습니다.");
location.href = "/boardList.do";
}else {
alert("등록이 실패하였습니다.");
}
},
error: function(request, status, error) {
alert("code = "+ request.status + " message = " + request.responseText + " error = " + error);
}
});
}
- java
더보기
더보기
@ResponseBody
@RequestMapping("/boardInsert.do")
public String boardInsert(
MultipartFile[] files,
BoardVO boardVO,
HttpServletRequest request,
HttpServletResponse response,
Model model
) throws Exception {
System.out.println("[등록하기]");
String str = null;
try {
// 수정내용 update
int cnt = boardService.boardInsert(boardVO);
System.out.println("등록 여부 : " + cnt);
if(cnt > 0) {
str = "Y";
System.out.println("등록 성공");
// 저장할 경로 가져오기
String path = request.getSession().getServletContext().getRealPath("file");
// "C:\\Users\\XXX\\eclipse-workspace\\toy_project\\toy_project2\\src\\main\\webapp\\file";
String root = path + "\\uploadFiles" ;
File file = new File(root);
// uploadFiles 폴더가 없으면 생성하기
if(!file.exists()) {
file.mkdirs();
}
// 1. 전송받은 파일 및 파일설명 값 가져오기
System.out.println("file : " + files);
for(MultipartFile f : files) {
if(!f.isEmpty()) {
// 업로드할 폴더 설정
String originFileName = f.getOriginalFilename();
String ext = originFileName.substring(originFileName.lastIndexOf("."));
String ranFileName = UUID.randomUUID().toString() + ext;
File changeFile = new File(root + "\\" + ranFileName);
// 파일 upload
f.transferTo(changeFile);
/* 240504 파일 정보 INSERT */
BoardFileVO fileVO = new BoardFileVO();
fileVO.setBoard_num(boardVO.getId());
fileVO.setOrg_file_nm(originFileName);
fileVO.setStored_file_nm(ranFileName);
fileVO.setFile_size((int)f.getSize());
cnt = boardService.boardFileInsert(fileVO);
}
}
}else {
str = "N";
System.out.println("등록 실패");
}
} catch (IllegalStateException | IOException e) {
System.out.println("파일 업로드 실패");
e.printStackTrace();
} catch (Exception e) {
System.out.println("예외사항 발생");
e.printStackTrace();
}
return str;
}
(2-2) 파일 수정기능 [게시글 포함]
- java [수정화면]
더보기
더보기
/* 240514 수정화면 [수정] */
@RequestMapping(value = "/boardModify.do")
public ModelAndView boardModify(
BoardVO boardVO
) throws Exception {
System.out.println("[수정화면]");
System.out.println("boardVO.getId() : " + boardVO.getId());
ModelAndView mv = new ModelAndView();
// boardList
List<?> BoardList = boardService.selectBoardModifyView(boardVO);
mv.addObject("resultList", BoardList);
// boardFileList
if(BoardList.size() > 0) {
List<BoardFileVO> BoardFileList = boardService.selectBoardFileList(boardVO);
// file is exist
if(BoardFileList.size() > 0) {
mv.addObject("fileList", BoardFileList);
}
}
mv.setViewName("board/modify");
return mv;
}
- html [수정기능]
더보기
더보기
<form name="fileForm" method="post">
<input type="hidden" id="board_num" name="board_num"/>
<input type="hidden" id="org_file_nm" name="org_file_nm"/>
</form>
<div id="table">
<form id="form" enctype="multipart/form-data">
<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="">
<caption style="visibility:hidden"></caption>
<c:forEach var="result" items="${resultList}" varStatus="status">
<tr>
<th>id</th>
<td align="center" class="listtd">
<input type="text" name="id" value="${result.id}"/>
</td>
</tr>
<tr>
<th>subject</th>
<td align="center" class="listtd">
<input type="text" name="subject" value="${result.subject}"/>
</td>
</tr>
<tr>
<th>content</th>
<td align="center" class="listtd">
<input type="text" name="content" value="${result.content}"/>
</td>
</tr>
<tr>
<th>writer</th>
<td align="center" class="listtd">
<input type="text" name="writer" value="${result.writer}"/>
</td>
</tr>
<tr>
<th>register_datetime</th>
<td align="center" class="listtd">
<input type="text" name="register_datetime" value="${result.register_datetime}"/>
</td>
</tr>
<tr>
<th>files</th>
<td align="center" class="listtd" id="files">
<%-- 기존 파일 : S --%>
<c:forEach items="${fileList}" var="file">
<p id="existing-file<c:out value="${file.file_num}"/>">
<a href="javascript:filedownload('<c:out value="${file.org_file_nm}"/>')">
<img src="/images/icon_file.gif" alt="파일" />
<c:out value="${file.org_file_nm}" />
</a>
<a href="javascript:deleteFile('<c:out value="${file.stored_file_nm}" />', '<c:out value="${file.file_num}"/>')">
<img src="/images/btn_comment_del.gif" alt="삭제" />
</a>
</p>
</c:forEach>
<%-- 기존 파일 : E --%>
<%-- 새로운 파일 : S --%>
<span class="ipfile">
<p id="file0" class="fileattachbox">
<input id="file" name="files" type="file" class="file" accept="*" onchange="fileSelected(this)">
</p>
</span>
<%-- 새로운 파일 : E --%>
</td>
</tr>
</c:forEach>
</table>
<br>
<input type="button" class="modify_botton" style="width: 80px; float:right" onclick="modifyBoard()" value="수정"/>
</form>
</div>
- javaScript [수정기능]
더보기
더보기
// 수정하기
function modifyBoard() {
var formData = new FormData($("#form")[0]);
/*
for (var pair of formData.entries()) {
console.log(pair[0]+ ', ' + pair[1]);
}
*/
$.ajax({
type : "POST",
url : "/boardUpdate.do",
data: formData,
dataType: "json",
processData: false,
contentType: false,
success: function(result){
if(result == '001') {
alert("수정 완료되었습니다.");
var id = $("input[name='id']").val();
location.href = "/boardView.do?id="+id;
}else if(result == '002') {
alert("첨부파일 정보 입력에 실패하였습니다.");
}else if(result == '003') {
alert("수정 실패하였습니다.");
}else {
alert("수정 실패하였습니다.");
}
},
error: function(request, status, error) {
alert("code = "+ request.status + " message = " + request.responseText + " error = " + error);
}
});
}
// 파일 선택폼 자동 증가
var fileIndex = 0;
function fileSelected(file) {
var pathpoint = file.value.lastIndexOf('.');
var filepoint = file.value.substring(pathpoint+1,file.length);
var filetype = filepoint.toLowerCase();
if(filetype=='jsp'||filetype=='php'||filetype=='asp'||filetype=='cgi'||filetype=='JSP'||filetype=='PHP'||filetype=='ASP'||filetype=='CGI'){
alert('업로드 할수 없는 파일입니다.');
return;
}
var filename = $(file).val();
if (filename.substring(3,11) == 'fakepath' ) {
filename = filename.substring(12);
}
filename = filename.substring(filename.lastIndexOf('\\')+1);
// 파일명 show해주는 부분
$("#file"+fileIndex).hide();
$("#files").append(
'<p id="file' + fileIndex + '" >' +
'<img src="/images/icon/icon_attachment.png" alt="파일" />' + filename +
'<a href="javascript:fileRemove(\''+fileIndex+'\')">' +
'<img src="/images/btn_comment_del.gif" alt="삭제" />'+
'</a>' +
'</p>'
);
// 업로드 버튼 생성
fileIndex++;
$("#files").append(
'<p id="file' + fileIndex + '" class="fileattachbox">' +
'<span class="ipfile">' +
'<input id="file" name="files" type="file" class="file" accept="*" onchange="fileSelected(this)"/>' +
'</span>' +
'<strong>파일최대 크기는 10M 미만 입니다.</strong>' +
'</p>'
);
}
function fileRemove(idx) {
$("#file"+idx).remove(); // hide시킨 p태그 remove
$("#file"+idx).remove(); // 파일명 show시킨 p태그 remove
}
- java [수정기능]
더보기
더보기
@ResponseBody
@RequestMapping("/boardUpdate.do")
public String updateSample(
// @RequestParam(value = "imageFile", required = false) MultipartFile singleFile,
MultipartFile[] files,
BoardVO boardVO,
HttpServletRequest request,
HttpServletResponse response,
Model model
) throws Exception {
ModelAndView mv = new ModelAndView();
if (boardVO.getId() <= 0) {
mv.setViewName("board/list");
System.out.println("데이터가 없습니다.");
return "board/list";
}
String str = null;
try {
// 수정내용 update
int cnt = boardService.boardUpdate(boardVO);
if(cnt > 0) {
str = "001";
System.out.println("수정 성공");
// 저장할 경로 가져오기
String path = request.getSession().getServletContext().getRealPath("file");
// "C:\\Users\\XXX\\eclipse-workspace\\toy_project\\toy_project2\\src\\main\\webapp\\file";
String root = path + "\\uploadFiles" ;
File file = new File(root);
// uploadFiles 폴더가 없으면 생성하기
if(!file.exists()) {
file.mkdirs();
}
// 1. 전송받은 파일 및 파일설명 값 가져오기
for(MultipartFile f : files) {
if(!f.isEmpty()) {
// 업로드할 폴더 설정
String originFileName = f.getOriginalFilename();
String ext = originFileName.substring(originFileName.lastIndexOf("."));
String ranFileName = UUID.randomUUID().toString() + ext;
File changeFile = new File(root + "\\" + ranFileName);
// 240514 기존에 이미 존재했던 첨부파일인지 체크하기
BoardFileVO fileVO = new BoardFileVO();
fileVO.setBoard_num(boardVO.getId());
fileVO.setOrg_file_nm(originFileName);
List<BoardFileVO> boardFileList = boardService.selectBoardFileCheck(fileVO);
// 새로운 첨부파일인 경우
if(boardFileList.size() == 0){
fileVO.setStored_file_nm(ranFileName);
fileVO.setFile_size((int)f.getSize());
cnt = boardService.boardFileInsert(fileVO);
// 파일정보 INSERT 완료 시
if(cnt > 0) {
// 파일 upload
f.transferTo(changeFile);
}else {
str ="002";
System.out.println("파일정보 INSERT 실패");
}
}
}
}
}else {
str = "003";
System.out.println("게시글 UPDATE 실패");
}
// System.out.println("id : " + boardVO.getId());
model.addAttribute("id", boardVO.getId());
} catch (IllegalStateException | IOException e) {
System.out.println("파일 업로드 실패");
e.printStackTrace();
} catch (Exception e) {
System.out.println("예외사항 발생");
e.printStackTrace();
}
return str;
}
(2-3) 파일 삭제기능
- html
더보기
더보기
<tr>
<th>files</th>
<td align="center" class="listtd">
<%-- 기존 파일 --%>
<c:forEach items="${fileList}" var="file">
<p id="existing-file<c:out value="${file.file_num}"/>">
<a href="javascript:filedownload('<c:out value="${file.org_file_nm}"/>')">
<img src="/images/icon_file.gif" alt="파일" />
<c:out value="${file.org_file_nm}" />
</a>
<a href="javascript:deleteFile('<c:out value="${file.stored_file_nm}" />', '<c:out value="${file.file_num}"/>')">
<img src="/images/btn_comment_del.gif" alt="삭제" />
</a>
</p>
</c:forEach>
<%-- 새로운 파일 --%>
<span class="ipfile">
<p id="file0" class="fileattachbox">
<input id="file" name="files" type="file" class="file" accept="*" onchange="fileSelected(this)">
</p>
</span>
</td>
</tr>
- javaScript
더보기
더보기
/* 240514 file delete */
function deleteFile(stored_file_nm, num) {
if (confirm("정말 삭제하시겠습니까?") == false) {
return;
}
$.ajax({
type : 'POST',
url : "/fileDelete.do",
data : {
"file_num":num,
"stored_file_nm" : stored_file_nm
},
dataType : 'json',
success : function (data) {
//location.reload();
removeExistingFile(num); // 삭제 function
},
error : function (XMLHttpRequest, textStatus, errorThrown) {
alert("에러발생!!");
}
});
}
function removeExistingFile(idx) {
$("#existing-file"+idx).remove();
}
- java
더보기
더보기
@ResponseBody
@RequestMapping(value = "/fileDelete.do")
public boolean fileDelete(
HttpServletRequest request,
HttpServletResponse response,
BoardFileVO boardFileVO
) throws Exception {
boolean isDelete = false;
try {
String saveDir = request.getSession().getServletContext().getRealPath("file/uploadFiles/");
File file = new File(saveDir, boardFileVO.getStored_file_nm());
//파일존재여부확인
if(file.exists()){
isDelete = boardService.deleteSelectedFile(boardFileVO);
System.out.println("isDelete : " + isDelete);
if(isDelete){
//file.delete();
System.out.println("파일삭제 성공");
}else{
System.out.println("파일삭제 실패");
}
}else{
System.out.println("파일이 존재하지 않습니다.");
}
}catch(IOException e) {
System.out.println("IOException");
e.printStackTrace();
}catch (Exception e) {
System.out.println("Exception");
e.printStackTrace();
}
return isDelete;
}
출처 : https://copycoding.tistory.com/229
출처 : https://www.egovframe.go.kr/wiki/doku.php?id=egovframework:%ED%8C%8C%EC%9D%BC%EA%B4%80%EB%A6%AC
728x90
728x90
'Framework > Spring [java]' 카테고리의 다른 글
스프링 MVC 구조와 패턴 (2) | 2022.11.06 |
---|---|
[java] @RequestBody , @ResponseBody 어노테이션 (2) | 2022.03.04 |
[spring] Spring IOC, IOC Container ,DI 의미 (0) | 2021.12.23 |
[spring] web.xml (0) | 2021.12.23 |
[spring] root-context.xml (0) | 2021.12.23 |