우디의 개발스터디

[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;
}

 

 

 

블로그의 정보

우디의 개발스터디

개발자 우디

활동하기