개발 무지렁이

[Spring] 파일 업로드와 파일 다운로드 설정 및 기능구현 본문

Backend/스프링

[Spring] 파일 업로드와 파일 다운로드 설정 및 기능구현

Gaejirang-e 2023. 5. 5. 20:07

파일 업로드 컴포넌트


MultipartResolver
(구현체: CommonsMultipartResolver)

⚠️. 파일을 업로드할 때, method는 반드시 post여야한다.
(get은 길이제한이 있기 때문에)

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

[UploadController.java]

  @Controller
  public class UploadController {
      @RequestMapping("/upload.do")
      public String upload(UploadDTO dto, HttpSession session, Model model) {
          try {
              // 저장할 폴더의 위치 가져오기
              String saveDir = session.getServletContext().getRealPath("/WEB-INF/save");

              MultipartFile file = dto.getFile();
              String fileName = file.getOriginalFilename();
              file.transferTo(new File(saveDir + "/" + fileName));
              dto.setFileName(fileName);
              dto.setFileSize(file.getSize()); // 첨부된 파일용량

              model.addAttribute("saveDir", saveDir);
          } catch (IOException e) {
              e.printStackTrace();
          }
          return "uploadResult";
      }
  }
📌. 세션에서 실제 경로 가져오기
: session.getServletContext().getRealPath("/WEB-INF/save");

📌. file.transferTo
: 업로드된 파일을 서버의 원하는 폴더에 저장


📌. File 객체
Tistory's Card

[UploadDTO.java]

  @Setter
  @Getter
  @Component
  public class UploadDTO {
      private String name;
      private MultipartFile file;
      private String fileName;
      private long fileSize;
  }

파일 다운로드


DownLoadCustomView
다운로드 기능을 담당하는 클래스

BeanNameViewResolver
Controller가 리턴하는 ViewName과 동일한 이름을 갖는 Bean을 뷰 객체로 사용한다.

  <bean id="customView" class="soa.spring3.down.DownLoadCustomView" />

  <bean id="viewResolver"
        class="org.springframework.web.servlet.view.BeanNameViewResolver">
        <property name="order" value="1" />
  </bean>

[DownLoadCustomView.java]

  @Component("downLoadView") // bean생성 <bean id="customView" class="~.DownLoadView" /> 대신
  public class DownLoadCustomView extends AbstractView {
      @Override
      protected void renderMergedOutputModel(Map<String, Object> map,
              HttpServletRequest request, HttpServletResponse response) throws Exception {
          File file = (File)map.get("fname"); // 다운로드할 파일객체
          response.setContentType("application/download;charset-UTF-8");
          response.setContentLength((int)file.length());

          String userAgent = request.getHeader("User-Agent");
          boolean isInternetExplorer = userAgent.indexOf("MSIE") > -1;

          String fileName = null;
          if(isInternetExplorer)
              fileName = URLEncoder.encode(file.getName(), "UTF-8");
          else
              fileName = new String(file.getName().getBytes("UTF-8"), "iso-8859-1");

          response.setHeader("Content-Disposition","attachment;filename=\"" + fileName.replace("+", "%20") + "\";");

          OutputStream out = response.getOutputStream();

          FileInputStream fis = null;
          try {
              fis = new FileInputStream(file);
              FileCopyUtils.copy(fis, out)
          } catch(Exception e) {
              e.printStackTrace();
          } finally {
              if(fis != null) {
                  try {
                      fis.close();
                  } catch(IOException ex) { }
              }
          }
          out.flush();
      }
  }
Comments