Scenario: 이미지 파일첨부를 하려는데 기존 소스는 다중 파일첨부 였다, (multipartHttpServletRequest 리스트를 받아서 리스트를 돌리는 구조의 코드였음.) 이것을 살짝 변형 시켜서 단일 파일첨부구조와 재활용성이 가능하게 바꾸려고 고쳐보았다.
Solutions: 다음
1. 가장먼저 Multipart 객체를 받아서 파일과, 함께보내진 폼 요소를 파싱해줄 자바의 파일유틸부터 만들어줌
- //파일 하나만 업로드시킬려고만듬 FileUtil.java (클래스가 없을경우 만들어 줘야함)
- public Map<String,Object> parseInsertFileInfoOne(Map<String,Object> map, HttpServletRequest request) throws Exception{
- MultipartHttpServletRequest multipartHttpServletRequest = (MultipartHttpServletRequest)request;
- Iterator<String> iterator = multipartHttpServletRequest.getFileNames();
- MultipartFile multipartFile = null;
- String originalFileName = null;
- String originalFileExtension = null;
- String storedFileName = null;
- Map<String, Object> FileInfoMap = null;
- //폴더가 없으면 해당 폴더 생성
- File file = new File(CommonUtils.filePath);
- if(file.exists() == false){
- file.mkdirs();
- }
- while(iterator.hasNext()){
- multipartFile = multipartHttpServletRequest.getFile(iterator.next());
- if(multipartFile.isEmpty() == false){
- originalFileName = multipartFile.getOriginalFilename();
- originalFileExtension = originalFileName.substring(originalFileName.lastIndexOf("."));
- storedFileName = CommonUtils.getRandomString() + originalFileExtension;
- file = new File(CommonUtils.filePath + storedFileName);
- multipartFile.transferTo(file);
- FileInfoMap = new HashMap<String,Object>();
- //인터셉트 맵 자체를 리턴해줄 파일맵에다 넣어줌. 그렇다면 구지 뉴 객체를 생성안해도 될듯
- FileInfoMap = map;
- FileInfoMap.put("ORIGINAL_FILE_NAME", originalFileName);
- FileInfoMap.put("STORED_FILE_NAME", storedFileName);
- FileInfoMap.put("FILE_SIZE", multipartFile.getSize());
- // FileInfoMap.put("REFER_IDX", (String)map.get("IDX"));
- // FileInfoMap.put("NAME", (String)map.get("NAME"));
- // FileInfoMap.put("PJT_SCH_TITLE", (String)map.get("PJT_SCH_TITLE"));
- // FileInfoMap.put("PJT_SCH_CONTENT", (String)map.get("PJT_SCH_CONTENT"));
- }
- }
- return FileInfoMap;
- }
2.Service 객체에서 쓰는방법 예시 (컨트롤러에서 서비스로 보내준뒤 서비스에서 파일유틸 호출)
- //serviceImpl.java
- @Override
- public void insertProjectSchedule(Map<String, Object> map, HttpServletRequest request) throws Exception {
- Map<String, Object> resultMap = fileUtils.parseInsertFileInfoOne(map, request);
- projectDAO.insertProjectSchedule(resultMap);
- }
3.마이바티스 예시 (많은 파일 속성을 갖고있지만, 이 프로젝트에선 저장된 파일명만 쓴다고 가정
- <!-- 예시 sql -->
- INSERT INTO PJT_SCHEDULE
- (
- PJT_SCH_IDX,
- PJT_IDX,
- SCH_TITLE,
- SCH_CONTENT,
- CREA_DATE,
- DEL_FLAG,
- IMG_NAME
- )
- VALUES
- (
- PJT_SCHEDULE_IDX_SEQ.NEXTVAL,
- #{REFER_IDX},
- #{PJT_SCH_TITLE},
- #{PJT_SCH_CONTENT},
- SYSDATE,
- 'N',
- #{STORED_FILE_NAME}
- )
4.로컬에 저장된 사진들을 띄울때. (파일패스 경로 전역변수는 적절한곳에 추가해줌)
- /* 이미지 파일불러올때 */
- //Commoncontroller.java
- //이미지 파일 띄울때 컨트롤러를 경유해서 로컬 저장소에 접근하는 것
- @RequestMapping(value="common/getImage.do")
- protected void getImageFile(CommandMap commandMap, HttpServletResponse response) throws Exception
- {
- String fileName = (String) commandMap.get("IMG_NAME");
- if(!fileName.isEmpty())
- {
- File file = new File(CommonUtils.filePath+fileName);
- response.setHeader("Content-Type", "image/*");
- response.setHeader("Content-Length", String.valueOf(file.length()));
- response.setHeader("Content-Disposition", "inline; filename=\"" + file.getName() + "\"");
- Files.copy(file.toPath(), response.getOutputStream());
- response.getOutputStream().flush();
- response.getOutputStream().close();
- }
- }
- //common utils.java에 변수추가(파일패스)
- public static final String filePath = "C:\\dev\\upload\\";
'To be Developer > Spring' 카테고리의 다른 글
WebAplicationContext 란? (1) | 2018.05.17 |
---|---|
[AOP]Root Aplication Context, Servlet Context 그리고 AOP (0) | 2018.04.06 |
[Spring]Container의 관계 (0) | 2017.09.19 |
[Spring]2-Layered Architecture (0) | 2017.09.18 |
[Spring]Could not load JDBC driver class [oracle.jdbc.driver.OracleDriver] (0) | 2017.01.10 |