[Java] 파일 업로드
by 개발자 우디데이터 모델
package com.test.board.common.model;
import lombok.Data;
import org.springframework.web.multipart.MultipartFile;
@Data
public class SmartEditorFile {
private MultipartFile filedata;
private String callback;
private String callback_func;
}
서비스 처리 예시1 - SetFile
@RequestMapping(method = RequestMethod.POST ,value = "/insert")
public ModelAndView insert(MultipartHttpServletRequest req, HttpServletResponse res , Board board) throws Exception{
ModelAndView mav = new ModelAndView("front/view/board/list");
if(board.getTitle().isEmpty()){
try {
return WebUtil.alertAndBack("제목을 입력하세요.", res);
} catch (IOException e) {
e.printStackTrace();
}
}
if(board.getContent().isEmpty()){
try {
return WebUtil.alertAndBack("내용을 입력하세요.", res);
} catch (IOException e) {
e.printStackTrace();
}
}
board.setIp(InetAddress.getLocalHost().getHostAddress());
board.setCategory("board");
User user = (User)req.getSession().getAttribute("user");
if(user != null){
board.setUser(user.getPk());
board.setWriteName(user.getName());
}
List<MultipartFile> fileList = null;
if(req.getFiles("file").get(0).getSize() != 0){
fileList = req.getFiles("file");
}
if(fileList != null && fileList.size() != 0){
for(MultipartFile file : fileList){
if(!checkImageType(file)){
try {
return WebUtil.alertAndBack("이미지파일만 업로드 가능합니다.", res);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
if(service.insertBoard(board) == 0){
try {
return WebUtil.alertAndBack("게시글 등록을 실패하였습니다.", res);
} catch (IOException e) {
e.printStackTrace();
}
}
if(fileList != null && fileList.size() != 0){
for(MultipartFile file : fileList){
if(file != null && file.getSize() != 0){
String fileName = storeFile(file, directory);
File fileModel = new File();
fileModel.setBoard(board.getPk());
fileModel.setFilename(fileName);
fileModel.setFileSize(file.getSize());
fileModel.setFileUrl(rootPath + "/"+directory + "/" + fileName);
if (service.fileUpload(fileModel) == 0) {
try {
return WebUtil.alertAndBack("파일등록에 실패하였습니다.", res);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
mav.setViewName("redirect:list");
return mav;
}
서비스 처리 예시2 - GetFile
@RequestMapping(method = RequestMethod.POST ,value = "/update")
public ModelAndView update(MultipartHttpServletRequest req, HttpServletResponse res , Board board) throws Exception{
User user = (User)req.getSession().getAttribute("user");
if(user == null || board.getUser() == null){
return WebUtil.alertAndBack("게시글을 수정할 수 없습니다.", res);
}
if(!user.getPk().equals(board.getUser())){
return WebUtil.alertAndBack("게시글을 수정할 수 없습니다.", res);
}
if(board.getTitle().isEmpty()){
try {
return WebUtil.alertAndBack("제목을 입력하세요.", res);
} catch (IOException e) {
e.printStackTrace();
}
}
if(board.getContent().isEmpty()){
try {
return WebUtil.alertAndBack("내용을 입력하세요.", res);
} catch (IOException e) {
e.printStackTrace();
}
}
List<MultipartFile> fileList = null;
if(req.getFiles("file").get(0).getSize() != 0){
fileList = req.getFiles("file");
}
if(fileList != null && fileList.size() != 0){
for(MultipartFile file : fileList){
if(!checkImageType(file)){
try {
return WebUtil.alertAndBack("이미지파일만 업로드 가능합니다.", res);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
if(service.updateBoard(board) == 0){
try {
return WebUtil.alertAndBack("게시글 수정을 실패하였습니다.", res);
} catch (IOException e) {
e.printStackTrace();
}
}
if(fileList != null && fileList.size() != 0){
for(MultipartFile file : fileList){
if(file != null && file.getSize() != 0){
String fileName = storeFile(file, directory);
File fileModel = new File();
fileModel.setBoard(board.getPk());
fileModel.setFilename(fileName);
fileModel.setFileSize(file.getSize());
fileModel.setFileUrl(rootPath + "/"+directory + "/" + fileName);
if (service.fileUpload(fileModel) == 0) {
try {
return WebUtil.alertAndBack("파일등록에 실패하였습니다.", res);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
ModelAndView mav = new ModelAndView("redirect:list");
return mav;
}
파일 저장 경로설정
private Path mkdir(String savePath){
String uploadPath = rootPath + "/" + savePath + "/";
Path fileStorageLocation = Paths.get(uploadPath).toAbsolutePath().normalize();
try {
Files.createDirectories(fileStorageLocation);
} catch (Exception ex) {
throw new RuntimeException("Could not create the directory where the uploaded files will be stored.", ex);
}
return fileStorageLocation;
}
파일 저장
@Value("${image.root.path}")
private String rootPath;
private String directory = "board";
private String storeFile(MultipartFile file, String savePath) {
String fileName = StringUtils.cleanPath(file.getOriginalFilename());
String ext = "";
try{
int idx = fileName.lastIndexOf(".");
if(idx > 0) ext = fileName.substring(idx+1);
}catch(Exception e){}
String saveName = System.currentTimeMillis() + "." + ext;;
try {
// Check if the file's name contains invalid characters
if(fileName.contains("..")) {
throw new RuntimeException("Sorry! Filename contains invalid path sequence " + fileName);
}
// 업로드 경로에 파일명을 추가하여 경로 수정
Path targetLocation = mkdir(savePath).resolve(saveName);
Files.copy(file.getInputStream(), targetLocation);
return saveName;
} catch (IOException ex) {
throw new RuntimeException("Could not store file " + fileName + ". Please try again!", ex);
}
}
파일 이미지 타입 변경
private boolean checkImageType(MultipartFile file) {
String fileName = file.getOriginalFilename();
String ext = fileName.substring(fileName.lastIndexOf(".") + 1);
if(ext.equals("jpg") || ext.equals("gif") || ext.equals("png") || ext.equals("jfif")){
return true;
}else{
return false;
}
}
파일 삭제
@ResponseBody
@RequestMapping(method = RequestMethod.POST ,value = "/fileDelete")
public DefResult fileDelete(HttpServletRequest req, HttpServletResponse res , File file ) throws Exception{
DefResult result = new DefResult();
if(file == null || file.getPk() == null){
result.setResultCode("9999");
result.setResultMsg("파일을 삭제할 수 없습니다.");
return result;
}
file = service.detailFile(file);
java.io.File deleteFile = new java.io.File(rootPath + "/" + directory + "/"+file.getFilename());
if(!deleteFile.exists()) {
result.setResultCode("9999");
result.setResultMsg("파일이 존재하지 않습니다.");
return result;
}
if(!deleteFile.delete()){
result.setResultCode("9999");
result.setResultMsg("파일삭제를 실패하였습니다.");
return result;
}
if(service.delFile(file) == 0){
result.setResultCode("9999");
result.setResultMsg("파일삭제를 실패하였습니다.");
return result;
}
return result;
}
블로그의 정보
우디의 개발스터디
개발자 우디