Spring 파일 업로드 기능

이 글은 Spring의 파일 업로드 기능을 살펴보겠습니다.
1. Maven의 웹 프로젝트를 만들고 Pom을 설정합니다.xml 파일, 의존도 증가:

<dependency>

  <groupId>org.springframework.boot</groupId>

  <artifactId>spring-boot-starter-web</artifactId>

  <version>1.0.2.RELEASE</version>

</dependency> 
2. 웹 앱 디렉터리에 있는 index.jsp 파일에 양식을 입력합니다.

<html>

<body>

<form method="POST" enctype="multipart/form-data"

   action="/upload">

  File to upload: <input type="file" name="file"><br /> Name: <input

    type="text" name="name"><br /> <br /> <input type="submit"

                           value="Upload"> Press here to upload the file!

</form>

</body>

</html> 

이 폼은 바로 우리가 시뮬레이션한 업로드 페이지입니다.
3. 이 양식을 처리하는 Controller를 작성합니다.

import java.io.BufferedOutputStream;

import java.io.File;

import java.io.FileOutputStream;

 

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

import org.springframework.web.bind.annotation.RequestParam;

import org.springframework.web.bind.annotation.ResponseBody;

import org.springframework.web.multipart.MultipartFile;

 

@Controller

public class FileUploadController {

 

  @RequestMapping(value="/upload", method=RequestMethod.GET)

  public @ResponseBody String provideUploadInfo() {

    return "You can upload a file by posting to this same URL.";

  }

 

  @RequestMapping(value="/upload", method=RequestMethod.POST)

  public @ResponseBody String handleFileUpload(@RequestParam("name") String name,

      @RequestParam("file") MultipartFile file){

    if (!file.isEmpty()) {

      try {

        byte[] bytes = file.getBytes();

        BufferedOutputStream stream =

            new BufferedOutputStream(new FileOutputStream(new File(name + "-uploaded")));

        stream.write(bytes);

        stream.close();

        return "You successfully uploaded " + name + " into " + name + "-uploaded !";

      } catch (Exception e) {

        return "You failed to upload " + name + " => " + e.getMessage();

      }

    } else {

      return "You failed to upload " + name + " because the file was empty.";

    }

  }

 

} 

4. 그리고 우리는 업로드된 파일에 대해 제한을 하고main 방법을 작성하여 이 웹을 시작합니다.

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.EnableAutoConfiguration;

import org.springframework.boot.context.embedded.MultiPartConfigFactory;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.ComponentScan;

import org.springframework.context.annotation.Configuration;

 

import javax.servlet.MultipartConfigElement;

 

@Configuration

@ComponentScan

@EnableAutoConfiguration

public class Application {

 

  @Bean

  public MultipartConfigElement multipartConfigElement() {

    MultiPartConfigFactory factory = new MultiPartConfigFactory();

    factory.setMaxFileSize("128KB");

    factory.setMaxRequestSize("128KB");

    return factory.createMultipartConfig();

  }

 

  public static void main(String[] args) {

    SpringApplication.run(Application.class, args);

  }

} 

5. 그리고 방문http://localhost:8080/upload페이지를 볼 수 있습니다.
위의 예는 하나의 파일 업로드 기능을 실현하는 것이다. 만약에 우리가 지금 파일을 대량으로 업로드하는 기능을 실현하고자 한다면 우리는 위의 코드를 간단하게 수정하기만 하면 된다. 편폭의 문제를 고려하여 아래는 위와 다른 코드만 붙이고 붙이지 않은 설명은 위와 같다.
1.batchUpload를 추가합니다.jsp 파일

<html>

<body>

<form method="POST" enctype="multipart/form-data"

   action="/batch/upload">

  File to upload: <input type="file" name="file"><br />

  File to upload: <input type="file" name="file"><br />

  <input type="submit" value="Upload"> Press here to upload the file!

</form>

</body>

</html> 
2. BatchFileUploadController를 추가합니다.java 파일:

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

import org.springframework.web.bind.annotation.ResponseBody;

import org.springframework.web.multipart.MultipartFile;

import org.springframework.web.multipart.MultipartHttpServletRequest;

 

import javax.servlet.http.HttpServletRequest;

import java.io.BufferedOutputStream;

import java.io.File;

import java.io.FileOutputStream;

import java.util.List;

 

/**

 * Created by wenchao.ren on 2014/4/26.

 */

 

@Controller

public class BatchFileUploadController {

 

  @RequestMapping(value="/batch/upload", method= RequestMethod.POST)

  public @ResponseBody

  String handleFileUpload(HttpServletRequest request){

    List<MultipartFile> files = ((MultipartHttpServletRequest)request).getFiles("file");

    for (int i =0; i< files.size(); ++i) {

      MultipartFile file = files.get(i);

      String name = file.getName();

      if (!file.isEmpty()) {

        try {

          byte[] bytes = file.getBytes();

          BufferedOutputStream stream =

              new BufferedOutputStream(new FileOutputStream(new File(name + i)));

          stream.write(bytes);

          stream.close();

        } catch (Exception e) {

          return "You failed to upload " + name + " => " + e.getMessage();

        }

      } else {

        return "You failed to upload " + name + " because the file was empty.";

      }

    }

    return "upload successful";

  }

} 

이렇게 간단하게 파일을 대량으로 업로드하는 기능은 ok입니다. 아주 간단하지 않습니까? 
주의: 위의 코드는 단지 시범을 보이기 위한 것이기 때문에 인코딩 스타일에 있어서 임의적인 방식을 채택하였기 때문에 모두가 모방하는 것을 건의하지 않습니다.
이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.

좋은 웹페이지 즐겨찾기