[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; }
블로그의 정보
우디의 개발스터디
개발자 우디