가자공부하러!

11. Spring Boot 파일 업로드/파일 다운로드 본문

공부/Spring Boot

11. Spring Boot 파일 업로드/파일 다운로드

오피스엑소더스 2019. 9. 2. 19:28

1. 기초 설정

  > spring boot version 2.1.7(Spring Starter Project, Maven Project)

  > jdk 8

  > sts3

  > 필요 디펜던시(보이기/숨기기) :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<!-- file io on web -->
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-io</artifactId>
    <version>1.3.2</version>
</dependency>
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/com.servlets/cos -->
<dependency>
    <groupId>com.servlets</groupId>
    <artifactId>cos</artifactId>
    <version>09May2002</version>
</dependency>        
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.3</version>
</dependency>
cs

  > upload 관련 설정

- 순서

- application.yml에 파일 업/다운로드 관련 설정 추가

- PdsController에 파일 업로드 관련 내용 세팅

- RequestParam : MultipartFile fileload

- 실제 파일 업로드 코드 : org.apache.commons.io.FileUtils.writeByteArrayToFile(File file, byte[] data);

- spring.servlet.multipart.maxFileSize, spring.servlet.multipart.maxRequestSize

- application.yml에 등록

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
spring: 
  datasource:
    hikari:
      jdbc-url: jdbc:oracle:thin:@localhost:1521/xe
      pool-name: hikari-cp
      maximum-pool-size30
      minimum-idle: 2
      driver-class-name: oracle.jdbc.OracleDriver
      username: --
      password: --
  servlet:
    multipart:
      max-file-size: 10MB
      max-request-size: 10MB
      enabled: true
cs
- PdsController 업로드 부분
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
/**자료실 게시물 저장하는 메소드
 * @param model
 * @param sourceFile
 * @return
 * @throws IOException
 */
@RequestMapping(value = "pds/savefile", method = RequestMethod.POST)
public String showPdsSaveFile(Model model,  
        @RequestParam(value="fileload", required = false) MultipartFile fileload,
        PdsDTO pdsDTO,
        HttpServletRequest req) throws IOException {
    
    System.out.println("show pds" + fileload.getOriginalFilename());
    
    //서버에 파일을 저장할 때에는 파일명을 시간값으로 변경
    //DB에 저장할 때에는 원본 파일명과 시간값을 모두 저장
    //filename 취득
    String filename = fileload.getOriginalFilename();
    pdsDTO.setFilename(filename);
    pdsDTO.setOrigin_filename(filename);
    //upload 경로 설정(tomcat realpath)
    String fuploadPath = req.getServletContext().getRealPath("/upload");
 
    //폴더 경로 설정
    String f = pdsDTO.getFilename();
    String newfilename = FUpUtil.name(f);
    
    //업로드 수행
    pdsDTO.setFilename(newfilename);
    
    File file = new File(fuploadPath + "/" + newfilename);
 
    System.out.println("pdswrite pdsdto : " + pdsDTO.toString());
    
    try {
        //실제 파일이 업로드 되는 부분
        FileUtils.writeByteArrayToFile(file, fileload.getBytes() );
        
        //db에 값 저장
        pdsService.uploadPds(pdsDTO);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    
    return "pdswrite.tiles";
}
cs


  > download 관련 설정
- 순서 : view에서 Controller로 다운로드 요청을 보내면 컨트롤러에서 다운로드 수행
- PdsController 다운로드 부분
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/**파일이름, seq 번호를 받아서 해당 파일을 다운로드 시켜주는 기능을 가진 메소드
 * @param param
 * @param req
 * @return
 * @throws IOException
 */
@RequestMapping(value = "pds/downloadfile", method = {RequestMethod.GET, RequestMethod.POST})
public ResponseEntity<Resource> downloadFile(String filename, int seq,
            HttpServletRequest req) throws IOException {
    //경로 설정
    String fuploadPath = req.getServletContext().getRealPath("/upload");
    
    //파일정보 설정
    PdsDTO pdsdto = pdsService.getOnePds(seq);
    String fileName = pdsdto.getFilename();
    String origin_fileName = pdsdto.getOrigin_filename();
    File file = new File(fuploadPath + "/" + fileName);
    
    HttpHeaders headers = new HttpHeaders();
    headers.add("Cache-Control""no-cache, no-store, must-revalidate");
    headers.add("Pragma""no-cache");
    headers.add("Expires""0");
    headers.add("Content-Disposition""attatchment; filename=\"" + 
            new String(origin_fileName.getBytes("UTF-8"), "ISO-8859-1"+ 
            "\"");
 
    InputStreamResource resource = new InputStreamResource(new FileInputStream(file));
 
    return ResponseEntity.ok()
            .headers(headers)
            .contentLength(file.length())
            .contentType(MediaType.parseMediaType("application/octet-stream"))
            .body(resource);
}
cs






Comments