inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

스프링 프레임워크는 내 손에 [스프1탄]

55.회원제 게시판으로 변경하기

똑같은 파일이름 저장시 문제점 질문드립니다.

829

학운학운

작성한 질문수 32

0

안녕하세요 선생님.

 MVC03부분에서 MemberController.java입니다.

// 회원사진 이미지 업로드(upload폴더에 저장, DB에 파일이름도 저장)

@RequestMapping("/memImageUpdate.do")

public String memImageUpdate(HttpServletRequest request, HttpSession session, RedirectAttributes rttr) {

// 파일업로드 API(cos.jar(고전적 방식), 3가지)

MultipartRequest multi=null;

int fileMaxSize=10*1024*1024; // 10MB

String savePath=request.getRealPath("resources/upload"); // 1.png

try {

// 이미지 업로드 // 1_1.png

multi=new MultipartRequest(request, savePath, fileMaxSize, "UTF-8", new DefaultFileRenamePolicy());

} catch (Exception e) {

e.printStackTrace();

rttr.addFlashAttribute("msgType", "실패 메세지");

rttr.addAttribute("msg", "파일의 크기는 10MB를 넘을 수 없습니다.");

return "redirect:/memImageForm.do";

}

// 데이터베이스 테이블에 회원이미지를 업데이트

String memID=multi.getParameter("memID");

String newProfile="";

File file=multi.getFile("memProfile");

if(file !=null) { // 업로드가 된상태(.png, .jpg, .gif)

// 이미지파일 여부를 체크->이미지 파일이 아니면 삭제(1.png)

String ext=file.getName().substring(file.getName().lastIndexOf(".")+1);

ext=ext.toUpperCase(); // PNG, GIF, JPG

if(ext.equals("PNG") || ext.equals("GIF") || ext.equals("JPG")){

// 새로 업로드된이미지(new->1.PNG), 현재DB에 있는 이미지(old->4.PNG)

String oldProfile=memberMapper.getMember(memID).getMemProfile();

File oldFile=new File(savePath+"/"+oldProfile);

if(oldFile.exists()) {

oldFile.delete();

}

newProfile=file.getName();

}else { // 이미지 파일이 아니면

if(file.exists()) {

file.delete();

}

rttr.addFlashAttribute("msgType", "실패 메세지");

rttr.addFlashAttribute("msg", "이미지 파일만 업로드 가능합니다.");

return "redirect:/memImageForm.do";

}

}

// 새로운 이미지를 테이블에 업데이트

Member mvo=new Member();

mvo.setMemID(memID);

mvo.setMemProfile(newProfile);

memberMapper.memProfileUpdate(mvo); // 이미지 업데이트 성공

Member m=memberMapper.getMember(memID);

// 세션을 새롭게 생성한다.

session.setAttribute("mvo", m);

rttr.addFlashAttribute("msgType", "성공 메세지");

rttr.addFlashAttribute("msg", "이미지 변경이 성공했습니다.");

 

return "redirect:/";

}

 

이 코드에서요 사진을 올리면 폴더에 사진파일이 올라가고 원래 DB에 저장된 이름을 가진 사진이 지워지는 거잖아요? 그런데 만약 똑같은 a.jpg 파일을 두번 연속 올리게 되면 처음에는 a.jpg가 폴더에 올라가고 db에 a.jpg가 등록되고 페이지에 a.jpg를 참조해서 사진이 잘 보입니다. 그런데 두번째 올리면 a.jpg가 파일 이름이 같아서 DefaultFileRenamePolicy에 의해서 a1.jpg로 저장이 됩니다. 그런데 여기서 문제가 a1.jpg가 폴더에 올라가고 원래 있었던 a.jpg가 삭제가 되는데 db에는 올릴 때 파일명인 a.jpg가 등록되어버려 페이지에 보여질 때 경로에 a.jpg가 되어 있어 사진이 안 보이게 됩니다. db에 DefaultFileRenamePolicy에 의해서 바뀐 파일명이 올라가게 해야 좋을지 아니면 처음 사진을 제출할 때 파일명이 db의 파일명과 같으면 제출이 안되게 할지 중에서 생각해보니 파일명은 같지만 다른 사진이 있을 수 있기 때문에 바뀐 파일명이 올라가게 했으면 좋겠습니다. 괜찮으시다면 바뀐 파일명이 올라가는 방법과 파일명이 같으면 제출이 안되게 하는법 두가지 방법 한번 알려주실 수 있을까요?? 고민을 많이 해봤는데 딱히 떠오르지 않고 아직 초보라서 구현하기 힘드네요;; 선생님의 도움의 손길을 간절히 바랍니다.

MVC Spring Security jsp spring

답변 1

1

박매일

네 기존 실습 내용에서 pom.xml에 있는 cos.jar dependency를 지우시고 다시 추가하시고 Maven Update을 해보시기 바랍니다.

<dependency>
<groupId>servlets.com</groupId>
<artifactId>cos</artifactId>
<version>05Nov2002</version>
</dependency>

그리고 MemberController.java 파일에서 MultipartRequest, DefaultFileRenamePolicy 클래스를 다시 import 시켜보시고 해보시기 바랍니다.

import com.oreilly.servlet.MultipartRequest;
import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;

MultipartRequest multi=null;
multi=new MultipartRequest(request, savePath, fileMaxSize, "UTF-8",new DefaultFileRenamePolicy());

제가 테스트 해보았는데 동일한 파일을 연속해서 올리더라도 변경된 파일이 DB Table에 저장이 됩니다.
첫 번째 업로드 파일이 a.jpg 이고 두 번째 업로드 파일이 a.jpg 이면 파일 이름이 같기 때문에 서버에
파일이 rename되어 a1.jpg로 업로드가 되고 DB Table에도 a1.jpg파일이 저장됩니다.
cos.jar API를 다시 한번 갱신 시키시고 해보세요~~

재생이 안되요

0

118

0

404 HTTP 상태 코드

0

166

2

lombok api 등록 후

0

180

2

UsernamePasswordAuthenticationToken 생성에 대해서 질문이 있습니다.

0

225

1

@RequestBody에 관해서 질문이요.

0

186

1

MVC06에 회원정보수정, 이미지등록수정 강의 영상이 없습니다

2

215

1

namespace 칸이 없습니다.

0

284

2

프로젝트 생성시 Srping MVC Project 없음

0

361

1

spring security 이후 Spring MVC06

0

226

1

Lomkob API 관련

0

205

1

깃허브 주소

0

267

1

포워딩오류? 인거 같습니다

0

343

1

css바꾸고 싶을때

0

312

1

git 연결할때 오류

0

267

1

프로젝트 생성시 Srping MVC Project 없음

0

1068

1

Oracle을 연결하고 싶은데, sql파일을 만들고나면...

0

284

1

프로젝트 생성시 Srping MVC Project 없음

0

4731

6

43강 age 0오류

0

301

1

Controller의 BoardMapper 쪽에서 문제가 있습니다.

0

386

1

Spring05 버전에서 이미지를 설정했을 때 권한이 보이지 않습니다

0

243

1

스프링 시큐리티 로그인 후 모달창 질문드립니다

0

630

0

아이디 중복확인 NullPointerException

0

366

2

새로고침해야만 등록한 글이 리스트에 뜹니다.

0

251

1

회원테이블과 권한테이블 간 관계

0

475

1