KyungHwan's etc.

스프링프레임워크 간단한 파일업로드 샘플 본문

Java/스프링프레임워크

스프링프레임워크 간단한 파일업로드 샘플

KyungHwan_0 2018. 10. 3. 21:21

스프링프레임워크 간단한 파일업로드 샘플

1. 환경설정

pom.xml

<!-- common fileupload -->
<dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.2.1</version>
</dependency>
<dependency>

        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>1.4</version>
</dependency>


spring-servlet.xml

<!-- 멀티파트 리졸버 -->

<bean id="multipartResolver"  class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

        <!-- 최대업로드 가능한 바이트크기 -->
        <property name="maxUploadSize" value="52428800" />

        <!-- 디스크에 임시 파일을 생성하기 전에 메모리에 보관할수있는 최대 바이트 크기 -->
        <!-- property name="maxInMemorySize" value="52428800" / -->
        <!-- defaultEncoding -->
        <property name="defaultEncoding" value="utf-8" />

</bean>


2.컨트롤러 / 뷰 작성

WEB-INF/views/form.jsp

<body>
<h1>파일 업로드 예제</h1>
<form method="post" action="upload" enctype="multipart/form-data">
        <label>email:</label>
        <input type="text" name="email">

        <br><br>
        <label>파일:</label>
        <input type="file" name="file1">

        <br><br>

        <input type="submit" value="upload">

</form>
</body>

파일 업로드를 할때에는 파일 업로드를 할 때는 form의 enctype = multipart/form-data로 작성해야하고, method = post여야 한다.(따로 포스팅을 해두었음.)


FileUploadController

@Controller
public class FileUploadController {
 @Autowired
 FileUploadService fileUploadService;
 
 @RequestMapping( "/form" )
 public String form() {
   return "form";
}
 
 @RequestMapping( "/upload" )
 public String upload(
     Model model,
     @RequestParam("email") String email,
     @RequestParam("file1") MultipartFile file) {
   
   String url = fileUploadService.restore(file);
   model.addAttribute("url", url);
   return "result";
}
}


FileUploadService

@Service
public class FileUploadService {
 // 리눅스 기준으로 파일 경로를 작성 ( 루트 경로인 /으로 시작한다. )
 // 윈도우라면 workspace의 드라이브를 파악하여 JVM이 알아서 처리해준다.
 // 따라서 workspace가 C드라이브에 있다면 C드라이브에 upload 폴더를 생성해 놓아야 한다.
 private static final String SAVE_PATH = "/upload"; //파일이 저장될 위치
 private static final String PREFIX_URL = "/upload/"; //저장된 파일을 jsp에서 불러오기 위한 경로
 
 public String restore(MultipartFile multipartFile) {
   String url = null;
   
   try {
     // 파일 정보
     String originFilename = multipartFile.getOriginalFilename();
     String extName
       = originFilename.substring(originFilename.lastIndexOf("."), originFilename.length());
     Long size = multipartFile.getSize();
     
     // 서버에서 저장 할 파일 이름
     String saveFileName = genSaveFileName(extName);
     
     System.out.println("originFilename : " + originFilename);
     System.out.println("extensionName : " + extName);
     System.out.println("size : " + size);
     System.out.println("saveFileName : " + saveFileName);
     
     writeFile(multipartFile, saveFileName);
     url = PREFIX_URL + saveFileName; //View에서 이미지파일을 바로보기 위해산 경로
       
       
  }
   catch (IOException e) {
     // 원래라면 RuntimeException 을 상속받은 예외가 처리되어야 하지만
     // 편의상 RuntimeException을 던진다.
     // throw new FileUploadException();
     throw new RuntimeException(e);
  }
   return url;
}
 
 
 // 현재 시간을 기준으로 파일 이름 생성 이름중복으로 덮어쓰기가 될 문제 때문에
 private String genSaveFileName(String extName) {
   String fileName = "";
   
   Calendar calendar = Calendar.getInstance();
   fileName += calendar.get(Calendar.YEAR);
   fileName += calendar.get(Calendar.MONTH);
   fileName += calendar.get(Calendar.DATE);
   fileName += calendar.get(Calendar.HOUR);
   fileName += calendar.get(Calendar.MINUTE);
   fileName += calendar.get(Calendar.SECOND);
   fileName += calendar.get(Calendar.MILLISECOND);
   fileName += extName;
   
   return fileName;
}
 
 
 // 파일을 실제로 write 하는 메서드
 private boolean writeFile(MultipartFile multipartFile, String saveFileName)
               throws IOException{
   boolean result = false;

   byte[] data = multipartFile.getBytes();
   FileOutputStream fos = new FileOutputStream(SAVE_PATH + "/" + saveFileName);
   fos.write(data);
   fos.close();
   
   return result;
}
}


result.jsp(결과 페이지)

<h1>Upload completed</h1>
<div class="result-images">

        <img src="${pageContext.request.contextPath }${url }" style="width:150px">

</div>

<p> <a href='/fileupload/form'> 다시 업로드 하기 </a> /p>

${ url }은 컨트롤러에서 넘겨준 파일이 저장된 경로명.


실제 파일이 저장된 서버 상의 위치( 물리 주소 )와, 애플리케이션에서 보여주고자 하는 파일 경로( 가상 주소 )가 일치 되지 않으면 엑박이 발생함.


따라서 실제 파일이 저장되어 있는 위치와 애플리케이션 상의 위치를 일치시키는 작업이 필요하다.


spring-servlet.xml

<!-- resource mapping -->
<!-- location : 물리적 주소 / mapping : 가상 주소 -->
<mvc:resources location="file:/upload/" mapping="/upload/*"/>



Reference

http://victorydntmd.tistory.com/

Comments