본문 바로가기
Spring/Spring 기초

Spring 파일 업로드 구현

by 미눅스[멘토] 2023. 7. 21.
728x90

[Spring] 파일 업로드 구현

[개발환경]

Eclipse spring,

egovFrameWork,

Tomcat 8.5,

oracle 11g

 

1. pom.xm

<!- - 파일업로드 시작 - - >
<!- - common-fileupload 라이브러리는 tomcat7.0버전 이후로는
서블릿3.0이상에서 지원함
- - >
<!- - https:// mvnrepository.com/ artifact/javax.servlet/javax.servlet- api - - >
<dependency>
<groupId>javax.servlet</ groupId>
<artifactId>javax.servlet- api</ artifactId>
<ver sion>3.1.0</ ver sion>
<scope>provided</ scope>
</ dependency>
<!- - https:// mvnrepository.com/ artifact/ commons- fileupload/ commons- fileupload - - >
<dependency>
<groupId>commons- fileupload</ groupId>
<artifactId>commons- fileupload</ artifactId>
<ver sion>1.4</ ver sion>
</ dependency>
<!- - 파일을 처리하기 위한 의존 라이브러리 - - >
<!- - https:// mvnrepository.com/ artifact/ commons- io/ commons- io - - >
<dependency>
<groupId>commons- io</ groupId>
<artifactId>commons- io</ artifactId>
<ver sion>2.11.0</ ver sion>
</ dependency>
<!- - 썸네일 - - >
<!- - https:// mvnrepository.com/ artifact/ org.imgscalr/imgscalr- lib - - >
<dependency>
<groupId>org.imgscalr</ groupId>
<artifactId>imgscalr- lib</ artifactId>
<ver sion>4.2</ ver sion>
</ dependency>
<!- - https:// mvnrepository.com/ artifact/ net.coobird/thumbnailator - - >
<dependency>
<groupId>net.coobird</ groupId>
<artifactId>thumbnailator </ artifactId>
<ver sion>0.4.8</ ver sion>
</ dependency>
<!- - 파일업로드 끝 - - >

 

 

2. root- context.xm

    <bean id="multipartResolver"
    	class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    	<property name="maxUploadSize" value="10485760" /> <!-- 저장가능한 크키는 10mb이다 -->
    	<property name="defaultEncoding" value="UTF-8" />
    </bean>
   	<!-- 파일업로드 디렉토리 설정 -->
    <bean id="uploadPath" class="java.lang.String">
    	<constructor-arg value="c:\\upload" />
    </bean>
    <!-- 파일업로드 설정 끝 -->
 </beans>

 

 

3. web.xml

<load- on- startup>1</load- on- startup>
<!- - web.xml의 설정은 WAS(Tomcat) 자체 설정일 뿐임. - - >
<!- - multipart- config : 메모리사이즈, 업로드 파일 저장 위치, 최대 크기 설정 - - >
<multipart- config>
<location>c:\\upload</location><!- - 업로드 되는 파일을 저장할 공간 - - >
<max- file- size>20971520</ max- file- size><!- - 업로드 파일의 최대 크기 1MB * 20 - - >
<max- request- size>41943040</ max- request- size><!- - 한 번에 올릴 수 있는 최대 크기 40MB - - >
<file- size- threshold>20971520</file- size- threshold><!- - 메모리 사용 크기 20MB - - >
</ multipart- config>
<!- - multipart filter 추가하기 - - >
<filter>
<display- name>springMultipartFilter</ display- name>
<filter- name>springMultipartFilter</filter- name>
<filter- class>org.springframework.web.multipart.support.MultipartFilter</filter- class>
</filter>
<filter- mapping>
<filter- name>springMultipartFilter</filter- name>
<url- pattern>/ *</ url- pattern>
</filter- mapping>

 

 

4. WAS 설정(context.xml)

WAS(Tomcat)/ config/ context.xml에 에 아래와 같이 변경한다.? 만약 WAS에 아래와 같이 설정하지 않으면 "Could not par se multipart servlet request" 에러발생,? WAS에서 Multi part를 찾지 못하게 된다.

<Context allowCasualMultipartPar sing="true" >
<!- - 케시문제 해결 - - >
<Resources cachingAllowed="true" cacheMaxSize="100000"></ Resources>

 

 

5. uploadForm.jsp

<%@ page language="java" contentType="text/ html; char set=UTF- 8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/ core" %>
<!DOCTYPE html>
<html>
<head>
<title>파일 업로드</title>
</ head>
<body>
<form action="/ upload/ uploadFormAction" method="post"
enctype="multipart/form- data">
<input type="file" name="uploadFile" multiple / >
<button type="submit">submit</ button>
</form>
</ body>
</ html>

 

6. uploadAjax.jsp

<%@ page language="java" contentType="text/ html; char set=UTF- 8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/ core" %>
<%@ taglib prefix="sec" uri="http:// www.springframework.org/ security/tags"%>
<!- -
1) 에디터 적용 <textarea id="content" name="content"
CKEDITOR.replace("content");
2) 에디터 내용 변경 <textarea id="content" name="content"
CKEDITOR.instances.content.setData(item.content);
3) jquery를 이용한 selectbox select 하기
$("#category").val(item.category).prop("selected",true);
4) 날짜 생성 함수
function fn_getInsertDate(geta){
let dt = new Date(geta);
let dtYY = dt.getFullYear();
let dtMM = dt.getMonth();
let dtDD = dt.getDate();
let dtHH = dt.getHour s();
let dtMI = dt.getMinutes();
let dtResult = dtYY + "- " + dtMM + "- " + dtDD + " " + dtHH + ":" + dtMI;
console.log("insertDate : " + dtResult);
return dtResult;
}
사용법 : fn_getInsertDate(item.insertDate)
- - >
<!DOCTYPE html>
<html>
<head>
<title>Ajax를 이용한 파일업로드</title>
<script src="/resources/js/jquery- 3.6.0.js"></ script>
<script type="text/javascript">
$(function(){
//확장자가 exe, sh, zip, alz이니?
let regex = new RegExp("(.*?)\.(exe|sh|zip|alz)$");
let maxSize = 5242880; // 5MB
//파일의 확장자, 크기 체킹
function checkExtension(fileName, fileSize){
if(fileSize >= maxSize){
alert("파일 사이즈가 초과되었습니다");
//함수 종료
return false;
}
if(regex.test(fileName)){
alert("해당 종류의 파일은 업로드할 수 없습니다.");
return false;
}
return true;
}
// e : event
$("#uploadBtn").on("click",function(e){
//가상의 form 태그 생성 <form></form>
let formData = new FormData();
// 꺽임쇠input type="file" name="uploadFile" multiple닫기꺽임쇠
let inputFile = $("input[name='uploadFile']");
//inputFile[0] : input type="file"
//.files : 그 안에 들어온 파일객체들
let files = inputFile[0].files;
console.log(files);
return dtResult;
}
사용법 : fn_getInsertDate(item.insertDate)
- - >
<!DOCTYPE html>
<html>
<head>
<title>Ajax를 이용한 파일업로드</title>
<script src="/resources/js/jquery- 3.6.0.js"></ script>
<script type="text/javascript">
$(function(){
//확장자가 exe, sh, zip, alz이니?
let regex = new RegExp("(.*?)\.(exe|sh|zip|alz)$");
let maxSize = 5242880; // 5MB
//파일의 확장자, 크기 체킹
function checkExtension(fileName, fileSize){
if(fileSize >= maxSize){
alert("파일 사이즈가 초과되었습니다");
//함수 종료
return false;
}
if(regex.test(fileName)){
alert("해당 종류의 파일은 업로드할 수 없습니다.");
return false;
}
return true;
}
// e : event
$("#uploadBtn").on("click",function(e){
//가상의 form 태그 생성 <form></form>
let formData = new FormData();
// 꺽임쇠input type="file" name="uploadFile" multiple닫기꺽임쇠
let inputFile = $("input[name='uploadFile']");
//inputFile[0] : input type="file"
//.files : 그 안에 들어온 파일객체들
let files = inputFile[0].files;
console.log(files);
return dtResult;
}
사용법 : fn_getInsertDate(item.insertDate)
- - >
<!DOCTYPE html>
<html>
<head>
<title>Ajax를 이용한 파일업로드</title>
<script src="/resources/js/jquery- 3.6.0.js"></ script>
<script type="text/javascript">
$(function(){
//확장자가 exe, sh, zip, alz이니?
let regex = new RegExp("(.*?)\.(exe|sh|zip|alz)$");
let maxSize = 5242880; // 5MB
//파일의 확장자, 크기 체킹
function checkExtension(fileName, fileSize){
if(fileSize >= maxSize){
alert("파일 사이즈가 초과되었습니다");
//함수 종료
return false;
}
if(regex.test(fileName)){
alert("해당 종류의 파일은 업로드할 수 없습니다.");
return false;
}
return true;
}
// e : event
$("#uploadBtn").on("click",function(e){
//가상의 form 태그 생성 <form></form>
let formData = new FormData();
// 꺽임쇠input type="file" name="uploadFile" multiple닫기꺽임쇠
let inputFile = $("input[name='uploadFile']");
//inputFile[0] : input type="file"
//.files : 그 안에 들어온 파일객체들
let files = inputFile[0].files;
console.log(files);
//formdata에다 filedata를 추가해보자
for(let i = 0;i<files.length;i++){
//파일확장자 체킹(확장자가 exe, sh, zip, alz이니?=>통과시 true가 return됨)
if(!checkExtension(files[i].name, files[i].size)){
//반복문 종료 및 함수 종료
return false;
}
// <form>
//<input type="file" name="uploadFile" / >
// </form>
formData.append("uploadFile",files[i]);
//formData.append('item','hi'); // <input name="item" value="hi"> 와 같다.
//formData.append('item','hello'); // <input name="item" value="hello">
}
let strCsrf = $("input[name='_csrf']").val();
console.log("strCsrf : " + strCsrf);
formData.append("_csrf",strCsrf);
//아작났어유ㅠㅠ 피씨다타써
$.ajax({
url:"/ upload/ uploadAjaxAction",
processData:false,
contentType:false,
data:formData,
type:"post",
beforeSend : function(xhr) { // 데이터 전송 전 헤더에 csrf값 설정
xhr.setRequestHeader("${_csrf.headerName}", "${_csrf.token}");
},
success:function(result){
console.log("result : " + result);
console.log("uploaded");
}
});
});
});
</ script>
<script type="text/javascript">
$(function(){
//이미지 미리보기 시작///////////////////////////////
let sel_file = [];
//input type=file id=input_imgs... 바뀌는 이벤트
$("#input_imgs").on("change",handleImgFileSelect);
//formdata에다 filedata를 추가해보자
for(let i = 0;i<files.length;i++){
//파일확장자 체킹(확장자가 exe, sh, zip, alz이니?=>통과시 true가 return됨)
if(!checkExtension(files[i].name, files[i].size)){
//반복문 종료 및 함수 종료
return false;
}
// <form>
//<input type="file" name="uploadFile" / >
// </form>
formData.append("uploadFile",files[i]);
//formData.append('item','hi'); // <input name="item" value="hi"> 와 같다.
//formData.append('item','hello'); // <input name="item" value="hello">
}
let strCsrf = $("input[name='_csrf']").val();
console.log("strCsrf : " + strCsrf);
formData.append("_csrf",strCsrf);
//아작났어유ㅠㅠ 피씨다타써
$.ajax({
url:"/ upload/ uploadAjaxAction",
processData:false,
contentType:false,
data:formData,
type:"post",
beforeSend : function(xhr) { // 데이터 전송 전 헤더에 csrf값 설정
xhr.setRequestHeader("${_csrf.headerName}", "${_csrf.token}");
},
success:function(result){
console.log("result : " + result);
console.log("uploaded");
}
});
});
});
</ script>
<script type="text/javascript">
$(function(){
//이미지 미리보기 시작///////////////////////////////
let sel_file = [];
//input type=file id=input_imgs... 바뀌는 이벤트
$("#input_imgs").on("change",handleImgFileSelect);
//formdata에다 filedata를 추가해보자
for(let i = 0;i<files.length;i++){
//파일확장자 체킹(확장자가 exe, sh, zip, alz이니?=>통과시 true가 return됨)
if(!checkExtension(files[i].name, files[i].size)){
//반복문 종료 및 함수 종료
return false;
}
// <form>
//<input type="file" name="uploadFile" / >
// </form>
formData.append("uploadFile",files[i]);
//formData.append('item','hi'); // <input name="item" value="hi"> 와 같다.
//formData.append('item','hello'); // <input name="item" value="hello">
}
let strCsrf = $("input[name='_csrf']").val();
console.log("strCsrf : " + strCsrf);
formData.append("_csrf",strCsrf);
//아작났어유ㅠㅠ 피씨다타써
$.ajax({
url:"/ upload/ uploadAjaxAction",
processData:false,
contentType:false,
data:formData,
type:"post",
beforeSend : function(xhr) { // 데이터 전송 전 헤더에 csrf값 설정
xhr.setRequestHeader("${_csrf.headerName}", "${_csrf.token}");
},
success:function(result){
console.log("result : " + result);
console.log("uploaded");
}
});
});
});
</ script>
<script type="text/javascript">
$(function(){
//이미지 미리보기 시작///////////////////////////////
let sel_file = [];
//input type=file id=input_imgs... 바뀌는 이벤트
$("#input_imgs").on("change",handleImgFileSelect);
//파라미터e : onchange 이벤트 객체
function handleImgFileSelect(e){
//이벤트가 발생된 타겟 안에 들어있는 이미지 파일들을 가져와보자
let files = e.target.files;
//이미지가 여러개가 있을 수 있으므로 이미지들을 분리해서 배열로 만듦
let fileArr = Array.prototype.slice.call(files);
//파일 타입의 배열 반복. f : 배열 안에 들어있는 각각의 이미지 파일 객체
fileArr.forEach(function(f){
//이미지 파일이 아닌 경우 이미지 미리보기 실패처리
if(!f.type.match("image.*")){
alert("이미지 확장자만 가능합니다.");
//함수 종료
return;
}
//이미지 객체를 전역 배열타입 변수에 넣자
sel_file.push(f);
//이미지 객체를 읽을 자바스크립트의 reader 객체 생성
let reader = new FileReader();
// e : reader가 이미지 객체를 읽는 이벤트
reader.onload = function(e){
// e.target : 이미지 객체
// e.target.result : reader가 이미지를 다 읽은 결과
let img_html = "<img src=\"" + e.target.result + "\" / >";
// div 사이에 이미지가 렌더링되어 화면에 보임
//객체.append : 누적, .html : 새로고침, innerHTML : J/ S
$(".imgs_wrap").html(img_html);
}
//f : 이미지 파일 객체를 읽은 후 다음 이미지 파일(f)을 위해 초기화함
reader.readAsDataURL (f);
});// end forEach
}
//이미지 미리보기 끝/////////////////////////////////
//id가 btnDupChk인 버튼을 클릭하면 이벤트를 처리해보자
$("#btnDupChk").on("click",function(){
// ajax 비동기통신을 통해 id가 userId인 요소의 값이
//데이터베이스에 있는 mem 테이블에 있는지를 체킹
// contentType : 보내는 데이터 형식
// dataType : 응답 데이터 형식
let userId = $("#userId").val();
//json데이터
let data = {"userId":userId};
$.ajax({
url:"/ mem/ dupChk",
//파라미터e : onchange 이벤트 객체
function handleImgFileSelect(e){
//이벤트가 발생된 타겟 안에 들어있는 이미지 파일들을 가져와보자
let files = e.target.files;
//이미지가 여러개가 있을 수 있으므로 이미지들을 분리해서 배열로 만듦
let fileArr = Array.prototype.slice.call(files);
//파일 타입의 배열 반복. f : 배열 안에 들어있는 각각의 이미지 파일 객체
fileArr.forEach(function(f){
//이미지 파일이 아닌 경우 이미지 미리보기 실패처리
if(!f.type.match("image.*")){
alert("이미지 확장자만 가능합니다.");
//함수 종료
return;
}
//이미지 객체를 전역 배열타입 변수에 넣자
sel_file.push(f);
//이미지 객체를 읽을 자바스크립트의 reader 객체 생성
let reader = new FileReader();
// e : reader가 이미지 객체를 읽는 이벤트
reader.onload = function(e){
// e.target : 이미지 객체
// e.target.result : reader가 이미지를 다 읽은 결과
let img_html = "<img src=\"" + e.target.result + "\" / >";
// div 사이에 이미지가 렌더링되어 화면에 보임
//객체.append : 누적, .html : 새로고침, innerHTML : J/ S
$(".imgs_wrap").html(img_html);
}
//f : 이미지 파일 객체를 읽은 후 다음 이미지 파일(f)을 위해 초기화함
reader.readAsDataURL (f);
});// end forEach
}
//이미지 미리보기 끝/////////////////////////////////
//id가 btnDupChk인 버튼을 클릭하면 이벤트를 처리해보자
$("#btnDupChk").on("click",function(){
// ajax 비동기통신을 통해 id가 userId인 요소의 값이
//데이터베이스에 있는 mem 테이블에 있는지를 체킹
// contentType : 보내는 데이터 형식
// dataType : 응답 데이터 형식
let userId = $("#userId").val();
//json데이터
let data = {"userId":userId};
$.ajax({
url:"/ mem/ dupChk",
//파라미터e : onchange 이벤트 객체
function handleImgFileSelect(e){
//이벤트가 발생된 타겟 안에 들어있는 이미지 파일들을 가져와보자
let files = e.target.files;
//이미지가 여러개가 있을 수 있으므로 이미지들을 분리해서 배열로 만듦
let fileArr = Array.prototype.slice.call(files);
//파일 타입의 배열 반복. f : 배열 안에 들어있는 각각의 이미지 파일 객체
fileArr.forEach(function(f){
//이미지 파일이 아닌 경우 이미지 미리보기 실패처리
if(!f.type.match("image.*")){
alert("이미지 확장자만 가능합니다.");
//함수 종료
return;
}
//이미지 객체를 전역 배열타입 변수에 넣자
sel_file.push(f);
//이미지 객체를 읽을 자바스크립트의 reader 객체 생성
let reader = new FileReader();
// e : reader가 이미지 객체를 읽는 이벤트
reader.onload = function(e){
// e.target : 이미지 객체
// e.target.result : reader가 이미지를 다 읽은 결과
let img_html = "<img src=\"" + e.target.result + "\" / >";
// div 사이에 이미지가 렌더링되어 화면에 보임
//객체.append : 누적, .html : 새로고침, innerHTML : J/ S
$(".imgs_wrap").html(img_html);
}
//f : 이미지 파일 객체를 읽은 후 다음 이미지 파일(f)을 위해 초기화함
reader.readAsDataURL (f);
});// end forEach
}
//이미지 미리보기 끝/////////////////////////////////
//id가 btnDupChk인 버튼을 클릭하면 이벤트를 처리해보자
$("#btnDupChk").on("click",function(){
// ajax 비동기통신을 통해 id가 userId인 요소의 값이
//데이터베이스에 있는 mem 테이블에 있는지를 체킹
// contentType : 보내는 데이터 형식
// dataType : 응답 데이터 형식
let userId = $("#userId").val();
//json데이터
let data = {"userId":userId};
$.ajax({
url:"/ mem/ dupChk",
contentType:"application/json;char set=utf- 8",
data:JSON.stringify(data),
type:"post",
success:function(result){
console.log("result : " + JSON.stringify(result));
//json 응답 데이터 처리
//.each : jQuery의 반복문
//첫번째 인자로 index를 주고, 두번째 인자로 item(콜백함수)를 줌
//index를 기준으로 반복을 함
$.each(result,function(index,item){
//item : {"result", "1"}
let r slt = item;
console.log("r slt : " + r slt);
if(r slt=="1"){
alert("해당 아이디가 이미 있습니다.");
$("#userId").val("");
}
});
}
});
});
//중복 시 alert("이미 id가 등록되어 있습니다.")
//비밀번호 확인 체크
//아이디가 userPwConfirm인 요소의 focus가 out이 되었을 때
//아이디가 userPw인 요소의 값과 비교하여
//다르면 alert("비밀번호확인을 다시 해주세요. 비밀번호가 다릅니다.")
$("#userPwConfirm").on("focusout",function(){
let userPwConfirm = $("#userPwConfirm").val().trim();
let userPw = $("#userPw").val().trim();
//비밀번호확인이 다르다면
if(userPwConfirm!=userPw){
alert("비밀번호확인을 다시 해주세요. 비밀번호가 다릅니다.");
}
});
let cnt = 1;
//javascript에서 jSTL 값을 받기***
let userNoStr = "<c:out value='${userNo}' / >";
console.log("userNoStr : " + userNoStr);
/ * javascript sessionStorage : 자바스크립트의 세션*/
sessionStorage.setItem("no",userNoStr);
let noStr = sessionStorage.getItem("no");
console.log("noStr : " + noStr);
contentType:"application/json;char set=utf- 8",
data:JSON.stringify(data),
type:"post",
success:function(result){
console.log("result : " + JSON.stringify(result));
//json 응답 데이터 처리
//.each : jQuery의 반복문
//첫번째 인자로 index를 주고, 두번째 인자로 item(콜백함수)를 줌
//index를 기준으로 반복을 함
$.each(result,function(index,item){
//item : {"result", "1"}
let r slt = item;
console.log("r slt : " + r slt);
if(r slt=="1"){
alert("해당 아이디가 이미 있습니다.");
$("#userId").val("");
}
});
}
});
});
//중복 시 alert("이미 id가 등록되어 있습니다.")
//비밀번호 확인 체크
//아이디가 userPwConfirm인 요소의 focus가 out이 되었을 때
//아이디가 userPw인 요소의 값과 비교하여
//다르면 alert("비밀번호확인을 다시 해주세요. 비밀번호가 다릅니다.")
$("#userPwConfirm").on("focusout",function(){
let userPwConfirm = $("#userPwConfirm").val().trim();
let userPw = $("#userPw").val().trim();
//비밀번호확인이 다르다면
if(userPwConfirm!=userPw){
alert("비밀번호확인을 다시 해주세요. 비밀번호가 다릅니다.");
}
});
let cnt = 1;
//javascript에서 jSTL 값을 받기***
let userNoStr = "<c:out value='${userNo}' / >";
console.log("userNoStr : " + userNoStr);
/ * javascript sessionStorage : 자바스크립트의 세션*/
sessionStorage.setItem("no",userNoStr);
let noStr = sessionStorage.getItem("no");
console.log("noStr : " + noStr);
contentType:"application/json;char set=utf- 8",
data:JSON.stringify(data),
type:"post",
success:function(result){
console.log("result : " + JSON.stringify(result));
//json 응답 데이터 처리
//.each : jQuery의 반복문
//첫번째 인자로 index를 주고, 두번째 인자로 item(콜백함수)를 줌
//index를 기준으로 반복을 함
$.each(result,function(index,item){
//item : {"result", "1"}
let r slt = item;
console.log("r slt : " + r slt);
if(r slt=="1"){
alert("해당 아이디가 이미 있습니다.");
$("#userId").val("");
}
});
}
});
});
//중복 시 alert("이미 id가 등록되어 있습니다.")
//비밀번호 확인 체크
//아이디가 userPwConfirm인 요소의 focus가 out이 되었을 때
//아이디가 userPw인 요소의 값과 비교하여
//다르면 alert("비밀번호확인을 다시 해주세요. 비밀번호가 다릅니다.")
$("#userPwConfirm").on("focusout",function(){
let userPwConfirm = $("#userPwConfirm").val().trim();
let userPw = $("#userPw").val().trim();
//비밀번호확인이 다르다면
if(userPwConfirm!=userPw){
alert("비밀번호확인을 다시 해주세요. 비밀번호가 다릅니다.");
}
});
let cnt = 1;
//javascript에서 jSTL 값을 받기***
let userNoStr = "<c:out value='${userNo}' / >";
console.log("userNoStr : " + userNoStr);
/ * javascript sessionStorage : 자바스크립트의 세션*/
sessionStorage.setItem("no",userNoStr);
let noStr = sessionStorage.getItem("no");
console.log("noStr : " + noStr);
// +버튼 클릭 시 다음을 추가해줌. memAuthVOL ist[1].auth - > memAuthVOL ist[2].auth
$("button[name='add']").on("click",function(){
let str = "<input type='hidden' name='memAuthVOL ist["+cnt+"].userNo' value='${userNo}' / >";
str += "<select name='memAuthVOL ist["+cnt+"].auth' class='form- control'>";
str +="<option value='manager'>관리자</ option>";
str +="<option value='employee'>직원</ option>";
str +="<option value='employer'>고용주</ option>";
str +="</ select>";
$("#divAuth").append(str);
cnt++;
});
$("button[name='del']").on("click",function(){
console.log(cnt);
// memAuthVOL ist[0].auth는 남겨놓아야 하므로
if(cnt>1){
$("#divAuth").children().last().remove();
$("#divAuth").children().last().remove();
cnt- - ;
}
});
//id가 divAuth인 요소의 last 자식 요소로 넣어줌
//- 버튼 클릭 시 id가 divAuth인 요소의 last 자식 요소를 제거함(counter를 챙기기)
//카운터가 0인 요소는 - 를 계속 클릭하더라도 사라지지 않도록 처리.
/ *
<select path="memAuthVOL ist[1].auth" class="form- control">
<option value="manager ">관리자</ option>
<option value="employee">직원</ option>
<option value="employer ">고용주</ option>
</ select>
*/
});
</ script>
</ head>
<body>
<h1>Upload with Ajax</ h1>
<div class="uploadDiv">
<input type="file" name="uploadFile" multiple / >
</ div>
<button id="uploadBtn">Upload</ button>
<sec:csrfInput/ >
// +버튼 클릭 시 다음을 추가해줌. memAuthVOL ist[1].auth - > memAuthVOL ist[2].auth
$("button[name='add']").on("click",function(){
let str = "<input type='hidden' name='memAuthVOL ist["+cnt+"].userNo' value='${userNo}' / >";
str += "<select name='memAuthVOL ist["+cnt+"].auth' class='form- control'>";
str +="<option value='manager'>관리자</ option>";
str +="<option value='employee'>직원</ option>";
str +="<option value='employer'>고용주</ option>";
str +="</ select>";
$("#divAuth").append(str);
cnt++;
});
$("button[name='del']").on("click",function(){
console.log(cnt);
// memAuthVOL ist[0].auth는 남겨놓아야 하므로
if(cnt>1){
$("#divAuth").children().last().remove();
$("#divAuth").children().last().remove();
cnt- - ;
}
});
//id가 divAuth인 요소의 last 자식 요소로 넣어줌
//- 버튼 클릭 시 id가 divAuth인 요소의 last 자식 요소를 제거함(counter를 챙기기)
//카운터가 0인 요소는 - 를 계속 클릭하더라도 사라지지 않도록 처리.
/ *
<select path="memAuthVOL ist[1].auth" class="form- control">
<option value="manager ">관리자</ option>
<option value="employee">직원</ option>
<option value="employer ">고용주</ option>
</ select>
*/
});
</ script>
</ head>
<body>
<h1>Upload with Ajax</ h1>
<div class="uploadDiv">
<input type="file" name="uploadFile" multiple / >
</ div>
<button id="uploadBtn">Upload</ button>
<sec:csrfInput/ >
// +버튼 클릭 시 다음을 추가해줌. memAuthVOL ist[1].auth - > memAuthVOL ist[2].auth
$("button[name='add']").on("click",function(){
let str = "<input type='hidden' name='memAuthVOL ist["+cnt+"].userNo' value='${userNo}' / >";
str += "<select name='memAuthVOL ist["+cnt+"].auth' class='form- control'>";
str +="<option value='manager'>관리자</ option>";
str +="<option value='employee'>직원</ option>";
str +="<option value='employer'>고용주</ option>";
str +="</ select>";
$("#divAuth").append(str);
cnt++;
});
$("button[name='del']").on("click",function(){
console.log(cnt);
// memAuthVOL ist[0].auth는 남겨놓아야 하므로
if(cnt>1){
$("#divAuth").children().last().remove();
$("#divAuth").children().last().remove();
cnt- - ;
}
});
//id가 divAuth인 요소의 last 자식 요소로 넣어줌
//- 버튼 클릭 시 id가 divAuth인 요소의 last 자식 요소를 제거함(counter를 챙기기)
//카운터가 0인 요소는 - 를 계속 클릭하더라도 사라지지 않도록 처리.
/ *
<select path="memAuthVOL ist[1].auth" class="form- control">
<option value="manager ">관리자</ option>
<option value="employee">직원</ option>
<option value="employer ">고용주</ option>
</ select>
*/
});
</ script>
</ head>
<body>
<h1>Upload with Ajax</ h1>
<div class="uploadDiv">
<input type="file" name="uploadFile" multiple / >
</ div>
<button id="uploadBtn">Upload</ button>
<sec:csrfInput/ >
</ body>
</ html>

 

 

7. uploadController.java

package kr.or.ddit.controller;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.nio.file.Files;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import org.springframework.http.HttpHeader s;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.annotation.Secured;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import lombok.extern.slf4j.Slf4j;
import net.coobird.thumbnailator.Thumbnailator;
@Slf4j
@RequestMapping("/ upload")
@Controller
public class UploadController {
@GetMapping("/ uploadForm")
public void uploadForm() {
//리턴타입을 void로 하면 / upload/ uploadForm.jsp 로 조립이 됨
log.info("upload form");
}
// <input type="file" name="uploadFile" multiple / >
//골뱅이PreAuthorize("hasRole('ROLE_MEMBER') and hasRole('ROLE_ADMIN')")
//골뱅이PreAuthorize("hasRole('ROLE_MEMBER') or hasRole('ROLE_ADMIN')")
//골뱅이PreAuthorize("hasAnyRole('ROLE_ADMIN','ROLE_MEMBER')")
//골뱅이Secured({"ROLE_ADMIN","ROLE_MEMBER"})
//골뱅이PreAuthorize("isAuthenticated()") : 로그인한 사용자만 접근 가능
@PreAuthorize("isAnonymous()")
@PostMapping("/ uploadFormAction")
public void uploadFormAction(MultipartFile[] uploadFile) {
// MultipartFile : 스프링에서 제공해주는 타입
/ *
- - 잘 씀
String getOriginalFileName() : 업로드 되는 파일의 이름(실제 파일명)
boolean isEmpty() : 파일이 없다면 true
long getSize() : 업로드되는 파일의 크기
transferTo(File file) : 파일을 저장
- - 잘 안씀..
String getName() : <input type="file" name="uploadFile" 에서 uploadFile을 가져옴
byte[] getBytes() : byte[]로 파일 데이터 반환
inputStream getInputStream() : 파일데이터와 연결된 InputStream을 반환
*/
//파일이 저장되는 경로
String uploadFolder = "C:\\upload";
for(MultipartFile multipartFile : uploadFile) {
log.info("- - - - - - - - - - - - - - - - - - - - - - - - - - - ");
//이미지 명
log.info("Upload File Name : " + multipartFile.getOriginalFilename());
log.info("Upload File Size : " + multipartFile.getSize());
// uploadFolder : C:\\upload
// multipartFile.getOriginalFilename() : img01.jpg
File saveFile = new File(uploadFolder, multipartFile.getOriginalFilename());
try {
//파일이 복사 됨
multipartFile.transferTo(saveFile);
} catch (IllegalStateException e) {
log.error(e.getMessage());
} catch (IOException e) {
log.error(e.getMessage());
}
}// end for
}
//요청 URI => localhost/ upload/ uploadAjax
@GetMapping("/ uploadAjax")
public String uploadAjax() {
//forwarding
//골뱅이PreAuthorize("isAuthenticated()") : 로그인한 사용자만 접근 가능
@PreAuthorize("isAnonymous()")
@PostMapping("/ uploadFormAction")
public void uploadFormAction(MultipartFile[] uploadFile) {
// MultipartFile : 스프링에서 제공해주는 타입
/ *
- - 잘 씀
String getOriginalFileName() : 업로드 되는 파일의 이름(실제 파일명)
boolean isEmpty() : 파일이 없다면 true
long getSize() : 업로드되는 파일의 크기
transferTo(File file) : 파일을 저장
- - 잘 안씀..
String getName() : <input type="file" name="uploadFile" 에서 uploadFile을 가져옴
byte[] getBytes() : byte[]로 파일 데이터 반환
inputStream getInputStream() : 파일데이터와 연결된 InputStream을 반환
*/
//파일이 저장되는 경로
String uploadFolder = "C:\\upload";
for(MultipartFile multipartFile : uploadFile) {
log.info("- - - - - - - - - - - - - - - - - - - - - - - - - - - ");
//이미지 명
log.info("Upload File Name : " + multipartFile.getOriginalFilename());
log.info("Upload File Size : " + multipartFile.getSize());
// uploadFolder : C:\\upload
// multipartFile.getOriginalFilename() : img01.jpg
File saveFile = new File(uploadFolder, multipartFile.getOriginalFilename());
try {
//파일이 복사 됨
multipartFile.transferTo(saveFile);
} catch (IllegalStateException e) {
log.error(e.getMessage());
} catch (IOException e) {
log.error(e.getMessage());
}
}// end for
}
//요청 URI => localhost/ upload/ uploadAjax
@GetMapping("/ uploadAjax")
public String uploadAjax() {
//forwarding
//골뱅이PreAuthorize("isAuthenticated()") : 로그인한 사용자만 접근 가능
@PreAuthorize("isAnonymous()")
@PostMapping("/ uploadFormAction")
public void uploadFormAction(MultipartFile[] uploadFile) {
// MultipartFile : 스프링에서 제공해주는 타입
/ *
- - 잘 씀
String getOriginalFileName() : 업로드 되는 파일의 이름(실제 파일명)
boolean isEmpty() : 파일이 없다면 true
long getSize() : 업로드되는 파일의 크기
transferTo(File file) : 파일을 저장
- - 잘 안씀..
String getName() : <input type="file" name="uploadFile" 에서 uploadFile을 가져옴
byte[] getBytes() : byte[]로 파일 데이터 반환
inputStream getInputStream() : 파일데이터와 연결된 InputStream을 반환
*/
//파일이 저장되는 경로
String uploadFolder = "C:\\upload";
for(MultipartFile multipartFile : uploadFile) {
log.info("- - - - - - - - - - - - - - - - - - - - - - - - - - - ");
//이미지 명
log.info("Upload File Name : " + multipartFile.getOriginalFilename());
log.info("Upload File Size : " + multipartFile.getSize());
// uploadFolder : C:\\upload
// multipartFile.getOriginalFilename() : img01.jpg
File saveFile = new File(uploadFolder, multipartFile.getOriginalFilename());
try {
//파일이 복사 됨
multipartFile.transferTo(saveFile);
} catch (IllegalStateException e) {
log.error(e.getMessage());
} catch (IOException e) {
log.error(e.getMessage());
}
}// end for
}
//요청 URI => localhost/ upload/ uploadAjax
@GetMapping("/ uploadAjax")
public String uploadAjax() {
//forwarding
return "upload/ uploadAjax";
}
// Ajax는 비동기
//요청 URI => / upload/ uploadAjaxAction
//골뱅이PreAuthorize("hasRole('ROLE_MEMBER') and hasRole('ROLE_ADMIN')")
//골뱅이PreAuthorize("hasRole('ROLE_MEMBER') or hasRole('ROLE_ADMIN')")
//골뱅이PreAuthorize("hasAnyRole('ROLE_ADMIN','ROLE_MEMBER')")
//골뱅이Secured({"ROLE_ADMIN","ROLE_MEMBER"})
//골뱅이PreAuthorize("isAuthenticated()") : 로그인한 사용자만 접근 가능
@ResponseBody
@PreAuthorize("isAnonymous()")
@PostMapping("/ uploadAjaxAction")
public String uploadAjaxAction(MultipartFile[] uploadFile) {
log.info("uploadAjaxAction에 왔다");
log.info("uploadFile : " + uploadFile);
String uploadFolder
= "D:\\A_TeachingMaterial\\06_spring\\springProj\\src\\main\\webapp\\resources\\upload";
// make folder 시작 - - - - - - - - - - - - - - - - - - - - - - - - - - -
File uploadPath = new File(uploadFolder, getFolder());
log.info("upload Path : " + uploadPath);
//만약 년/월/ 일 해당 폴더가 없다면 생성
if(uploadPath.exists()==false) {
uploadPath.mkdir s();
}
// make folder 끝 - - - - - - - - - - - - - - - - - - - - - - - - - - -
//배열로부터 하나씩 파일을 꺼내오자
for(MultipartFile multipartFile : uploadFile) {
log.info("- - - - - - - - - - - - - - - - - - - - - - - ");
log.info("Upload File Name : " + multipartFile.getOriginalFilename());
log.info("Upload File Size : " + multipartFile.getSize());
//IE 처리 => 경로를 제외한 파일명만 추출
// c:\\upload\\image01.jpg => image01.jpg
String uploadFileName = multipartFile.getOriginalFilename();
uploadFileName.substring(uploadFileName.lastIndexOf("\\")+1);
log.info("only file name : " + uploadFileName);
//- - - - - - - - - - - - - 같은날 같은 이미지를 업로드 시 파일 중복 방지 시작 - - - - - - - - - - - - -
//java.util.UUID => 랜덤값 생성
UUID uuid = UUID.randomUUID(); // 임의의 값을 생성
return "upload/ uploadAjax";
}
// Ajax는 비동기
//요청 URI => / upload/ uploadAjaxAction
//골뱅이PreAuthorize("hasRole('ROLE_MEMBER') and hasRole('ROLE_ADMIN')")
//골뱅이PreAuthorize("hasRole('ROLE_MEMBER') or hasRole('ROLE_ADMIN')")
//골뱅이PreAuthorize("hasAnyRole('ROLE_ADMIN','ROLE_MEMBER')")
//골뱅이Secured({"ROLE_ADMIN","ROLE_MEMBER"})
//골뱅이PreAuthorize("isAuthenticated()") : 로그인한 사용자만 접근 가능
@ResponseBody
@PreAuthorize("isAnonymous()")
@PostMapping("/ uploadAjaxAction")
public String uploadAjaxAction(MultipartFile[] uploadFile) {
log.info("uploadAjaxAction에 왔다");
log.info("uploadFile : " + uploadFile);
String uploadFolder
= "D:\\A_TeachingMaterial\\06_spring\\springProj\\src\\main\\webapp\\resources\\upload";
// make folder 시작 - - - - - - - - - - - - - - - - - - - - - - - - - - -
File uploadPath = new File(uploadFolder, getFolder());
log.info("upload Path : " + uploadPath);
//만약 년/월/ 일 해당 폴더가 없다면 생성
if(uploadPath.exists()==false) {
uploadPath.mkdir s();
}
// make folder 끝 - - - - - - - - - - - - - - - - - - - - - - - - - - -
//배열로부터 하나씩 파일을 꺼내오자
for(MultipartFile multipartFile : uploadFile) {
log.info("- - - - - - - - - - - - - - - - - - - - - - - ");
log.info("Upload File Name : " + multipartFile.getOriginalFilename());
log.info("Upload File Size : " + multipartFile.getSize());
//IE 처리 => 경로를 제외한 파일명만 추출
// c:\\upload\\image01.jpg => image01.jpg
String uploadFileName = multipartFile.getOriginalFilename();
uploadFileName.substring(uploadFileName.lastIndexOf("\\")+1);
log.info("only file name : " + uploadFileName);
//- - - - - - - - - - - - - 같은날 같은 이미지를 업로드 시 파일 중복 방지 시작 - - - - - - - - - - - - -
//java.util.UUID => 랜덤값 생성
UUID uuid = UUID.randomUUID(); // 임의의 값을 생성
return "upload/ uploadAjax";
}
// Ajax는 비동기
//요청 URI => / upload/ uploadAjaxAction
//골뱅이PreAuthorize("hasRole('ROLE_MEMBER') and hasRole('ROLE_ADMIN')")
//골뱅이PreAuthorize("hasRole('ROLE_MEMBER') or hasRole('ROLE_ADMIN')")
//골뱅이PreAuthorize("hasAnyRole('ROLE_ADMIN','ROLE_MEMBER')")
//골뱅이Secured({"ROLE_ADMIN","ROLE_MEMBER"})
//골뱅이PreAuthorize("isAuthenticated()") : 로그인한 사용자만 접근 가능
@ResponseBody
@PreAuthorize("isAnonymous()")
@PostMapping("/ uploadAjaxAction")
public String uploadAjaxAction(MultipartFile[] uploadFile) {
log.info("uploadAjaxAction에 왔다");
log.info("uploadFile : " + uploadFile);
String uploadFolder
= "D:\\A_TeachingMaterial\\06_spring\\springProj\\src\\main\\webapp\\resources\\upload";
// make folder 시작 - - - - - - - - - - - - - - - - - - - - - - - - - - -
File uploadPath = new File(uploadFolder, getFolder());
log.info("upload Path : " + uploadPath);
//만약 년/월/ 일 해당 폴더가 없다면 생성
if(uploadPath.exists()==false) {
uploadPath.mkdir s();
}
// make folder 끝 - - - - - - - - - - - - - - - - - - - - - - - - - - -
//배열로부터 하나씩 파일을 꺼내오자
for(MultipartFile multipartFile : uploadFile) {
log.info("- - - - - - - - - - - - - - - - - - - - - - - ");
log.info("Upload File Name : " + multipartFile.getOriginalFilename());
log.info("Upload File Size : " + multipartFile.getSize());
//IE 처리 => 경로를 제외한 파일명만 추출
// c:\\upload\\image01.jpg => image01.jpg
String uploadFileName = multipartFile.getOriginalFilename();
uploadFileName.substring(uploadFileName.lastIndexOf("\\")+1);
log.info("only file name : " + uploadFileName);
//- - - - - - - - - - - - - 같은날 같은 이미지를 업로드 시 파일 중복 방지 시작 - - - - - - - - - - - - -
//java.util.UUID => 랜덤값 생성
UUID uuid = UUID.randomUUID(); // 임의의 값을 생성
//원래의 파일 이름과 구분하기 위해 _를 붙임
uploadFileName = uuid.toString() + "_" + uploadFileName;
//- - - - - - - - - - - - - 같은날 같은 이미지를 업로드 시 파일 중복 방지 끝 - - - - - - - - - - - - -
// File 객체 설계(복사할 대상 경로 , 파일명)
//File saveFile = new File(uploadFolder, uploadFileName);
// uploadPath : D:\\A_TeachingMaterial\\06_spring\\springProj\\src\\
//main\\webapp\\resources\\upload\\2022\\07\\22
File saveFile = new File(uploadPath, uploadFileName);
try {
//파일 복사가 일어남
multipartFile.transferTo(saveFile);
//이미지인지 체킹
if(checkImageType(saveFile)) {//이미지라면..
FileOutputStream thumbnail = new FileOutputStream(
new File(uploadPath, "s_" + uploadFileName)
);
//섬네일 생성
Thumbnailator.createThumbnail(multipartFile.getInputStream(),thumbnail,100,100);
thumbnail.close();
}
return "1";
} catch (IllegalStateException e) {
log.error(e.getMessage());
return "0";
} catch (IOException e) {
log.error(e.getMessage());
return "0";
}//tnd catch
}// end for
return "0";
}// uploadAjaxAction
//년/월/일 폴더 생성
public static String getFolder() {
// 2022- 07- 22 형식(format) 지정
//간단한 날짜 형식
SimpleDateFormat sdf = new SimpleDateFormat("yyyy- MM- dd");
//날짜 객체 생성(java.util패키지)
Date date = new Date();
// 2022- 07- 22
String str = sdf.format(date);
//원래의 파일 이름과 구분하기 위해 _를 붙임
uploadFileName = uuid.toString() + "_" + uploadFileName;
//- - - - - - - - - - - - - 같은날 같은 이미지를 업로드 시 파일 중복 방지 끝 - - - - - - - - - - - - -
// File 객체 설계(복사할 대상 경로 , 파일명)
//File saveFile = new File(uploadFolder, uploadFileName);
// uploadPath : D:\\A_TeachingMaterial\\06_spring\\springProj\\src\\
//main\\webapp\\resources\\upload\\2022\\07\\22
File saveFile = new File(uploadPath, uploadFileName);
try {
//파일 복사가 일어남
multipartFile.transferTo(saveFile);
//이미지인지 체킹
if(checkImageType(saveFile)) {//이미지라면..
FileOutputStream thumbnail = new FileOutputStream(
new File(uploadPath, "s_" + uploadFileName)
);
//섬네일 생성
Thumbnailator.createThumbnail(multipartFile.getInputStream(),thumbnail,100,100);
thumbnail.close();
}
return "1";
} catch (IllegalStateException e) {
log.error(e.getMessage());
return "0";
} catch (IOException e) {
log.error(e.getMessage());
return "0";
}//tnd catch
}// end for
return "0";
}// uploadAjaxAction
//년/월/일 폴더 생성
public static String getFolder() {
// 2022- 07- 22 형식(format) 지정
//간단한 날짜 형식
SimpleDateFormat sdf = new SimpleDateFormat("yyyy- MM- dd");
//날짜 객체 생성(java.util패키지)
Date date = new Date();
// 2022- 07- 22
String str = sdf.format(date);
//원래의 파일 이름과 구분하기 위해 _를 붙임
uploadFileName = uuid.toString() + "_" + uploadFileName;
//- - - - - - - - - - - - - 같은날 같은 이미지를 업로드 시 파일 중복 방지 끝 - - - - - - - - - - - - -
// File 객체 설계(복사할 대상 경로 , 파일명)
//File saveFile = new File(uploadFolder, uploadFileName);
// uploadPath : D:\\A_TeachingMaterial\\06_spring\\springProj\\src\\
//main\\webapp\\resources\\upload\\2022\\07\\22
File saveFile = new File(uploadPath, uploadFileName);
try {
//파일 복사가 일어남
multipartFile.transferTo(saveFile);
//이미지인지 체킹
if(checkImageType(saveFile)) {//이미지라면..
FileOutputStream thumbnail = new FileOutputStream(
new File(uploadPath, "s_" + uploadFileName)
);
//섬네일 생성
Thumbnailator.createThumbnail(multipartFile.getInputStream(),thumbnail,100,100);
thumbnail.close();
}
return "1";
} catch (IllegalStateException e) {
log.error(e.getMessage());
return "0";
} catch (IOException e) {
log.error(e.getMessage());
return "0";
}//tnd catch
}// end for
return "0";
}// uploadAjaxAction
//년/월/일 폴더 생성
public static String getFolder() {
// 2022- 07- 22 형식(format) 지정
//간단한 날짜 형식
SimpleDateFormat sdf = new SimpleDateFormat("yyyy- MM- dd");
//날짜 객체 생성(java.util패키지)
Date date = new Date();
// 2022- 07- 22
String str = sdf.format(date);
return str.replace("- ", File.separator);
}
//용량이 큰 파일을 섬네일 처리를 하지 않으면
//모바일과 같은 환경에서 많은 데이터를 소비해야 하므로
//이미지의 경우 특별한 경우가 아니면 섬네일을 제작해야 함.
//섬네일은 이미지만 가능함.
//이미지 파일의 판단
public static boolean checkImageType(File file) {
/ *
.jpeg / .jpg(JPEG 이미지)의 MIME 타입 : image/jpeg
*/
// MIME 타입을 통해 이미지 여부 확인
//file.toPath() : 파일 객체를 path객체로 변환
try {
String contentType = Files.probeContentType(file.toPath());
log.info("contentType : " + contentType);
// MIME 타입 정보가 image로 시작하는지 여부를 return
return contentType.startsWith("image");
} catch (IOException e) {
e.printStackTrace();
}
//이 파일이 이미지가 아닐 경우
return false;
}
//파일 다운로드
//
localhost/ upload/ download?fileName=2022/ 07/ 25/ cd862ebd- 10a2- 4220- bbbb- 5bbf8ffdadd7_phone01.jpg
@ResponseBody
@GetMapping("/ download")
public ResponseEntity<Resource> download(@RequestParam String fileName){
log.info("fileName : " + fileName);
//resource : 다운로드 받을 파일(자원)
Resource resource = new FileSystemResource(
"D:\\A_TeachingMaterial\\06_spring\\springProj\\src\\main\\webapp\\resources\\upload\\"
+fileName
);
// cd862ebd- 10a2- 4220- bbbb- 5bbf8ffdadd7_phone01.jpg
String resourceName = resource.getFilename();
// header : 인코딩 정보, 파일명 정보
HttpHeader s header s = new HttpHeader s();
try {
header s.add("Content- Disposition", "attachment;filename="+
return str.replace("- ", File.separator);
}
//용량이 큰 파일을 섬네일 처리를 하지 않으면
//모바일과 같은 환경에서 많은 데이터를 소비해야 하므로
//이미지의 경우 특별한 경우가 아니면 섬네일을 제작해야 함.
//섬네일은 이미지만 가능함.
//이미지 파일의 판단
public static boolean checkImageType(File file) {
/ *
.jpeg / .jpg(JPEG 이미지)의 MIME 타입 : image/jpeg
*/
// MIME 타입을 통해 이미지 여부 확인
//file.toPath() : 파일 객체를 path객체로 변환
try {
String contentType = Files.probeContentType(file.toPath());
log.info("contentType : " + contentType);
// MIME 타입 정보가 image로 시작하는지 여부를 return
return contentType.startsWith("image");
} catch (IOException e) {
e.printStackTrace();
}
//이 파일이 이미지가 아닐 경우
return false;
}
//파일 다운로드
//
localhost/ upload/ download?fileName=2022/ 07/ 25/ cd862ebd- 10a2- 4220- bbbb- 5bbf8ffdadd7_phone01.jpg
@ResponseBody
@GetMapping("/ download")
public ResponseEntity<Resource> download(@RequestParam String fileName){
log.info("fileName : " + fileName);
//resource : 다운로드 받을 파일(자원)
Resource resource = new FileSystemResource(
"D:\\A_TeachingMaterial\\06_spring\\springProj\\src\\main\\webapp\\resources\\upload\\"
+fileName
);
// cd862ebd- 10a2- 4220- bbbb- 5bbf8ffdadd7_phone01.jpg
String resourceName = resource.getFilename();
// header : 인코딩 정보, 파일명 정보
HttpHeader s header s = new HttpHeader s();
try {
header s.add("Content- Disposition", "attachment;filename="+
return str.replace("- ", File.separator);
}
//용량이 큰 파일을 섬네일 처리를 하지 않으면
//모바일과 같은 환경에서 많은 데이터를 소비해야 하므로
//이미지의 경우 특별한 경우가 아니면 섬네일을 제작해야 함.
//섬네일은 이미지만 가능함.
//이미지 파일의 판단
public static boolean checkImageType(File file) {
/ *
.jpeg / .jpg(JPEG 이미지)의 MIME 타입 : image/jpeg
*/
// MIME 타입을 통해 이미지 여부 확인
//file.toPath() : 파일 객체를 path객체로 변환
try {
String contentType = Files.probeContentType(file.toPath());
log.info("contentType : " + contentType);
// MIME 타입 정보가 image로 시작하는지 여부를 return
return contentType.startsWith("image");
} catch (IOException e) {
e.printStackTrace();
}
//이 파일이 이미지가 아닐 경우
return false;
}
//파일 다운로드
//
localhost/ upload/ download?fileName=2022/ 07/ 25/ cd862ebd- 10a2- 4220- bbbb- 5bbf8ffdadd7_phone01.jpg
@ResponseBody
@GetMapping("/ download")
public ResponseEntity<Resource> download(@RequestParam String fileName){
log.info("fileName : " + fileName);
//resource : 다운로드 받을 파일(자원)
Resource resource = new FileSystemResource(
"D:\\A_TeachingMaterial\\06_spring\\springProj\\src\\main\\webapp\\resources\\upload\\"
+fileName
);
// cd862ebd- 10a2- 4220- bbbb- 5bbf8ffdadd7_phone01.jpg
String resourceName = resource.getFilename();
// header : 인코딩 정보, 파일명 정보
HttpHeader s header s = new HttpHeader s();
try {
header s.add("Content- Disposition", "attachment;filename="+
new String(resourceName.getBytes("UTF- 8"),"ISO- 8859- 1"));
} catch (UnsupportedEncodingException e) {
log.info(e.getMessage());
}
return new ResponseEntity<Resource>(resource, header s, HttpStatus.OK);
}
}