작성
·
762
·
수정됨
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의 파일명과 같으면 제출이 안되게 할지 중에서 생각해보니 파일명은 같지만 다른 사진이 있을 수 있기 때문에 바뀐 파일명이 올라가게 했으면 좋겠습니다. 괜찮으시다면 바뀐 파일명이 올라가는 방법과 파일명이 같으면 제출이 안되게 하는법 두가지 방법 한번 알려주실 수 있을까요?? 고민을 많이 해봤는데 딱히 떠오르지 않고 아직 초보라서 구현하기 힘드네요;; 선생님의 도움의 손길을 간절히 바랍니다.
답변 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를 다시 한번 갱신 시키시고 해보세요~~