[java] 스프링 컨트롤러에서 파일 다운로드하기


3 Answers

나는 ResourceHttpMessageConverter와 함께 Spring에 내장 된 지원을 사용하여 라인을 스트리밍 할 수 있었다. 이것은 mime-type을 결정할 수 있다면 content-length와 content-type을 설정합니다.

@RequestMapping(value = "/files/{file_name}", method = RequestMethod.GET)
@ResponseBody
public FileSystemResource getFile(@PathVariable("file_name") String fileName) {
    return new FileSystemResource(myService.getFileFor(fileName)); 
}
Question

웹 사이트에서 PDF를 다운로드해야하는 요구 사항이 있습니다. PDF는 freemarker와 iText와 같은 PDF 생성 프레임 워크의 조합으로 생각되는 코드 내에서 생성되어야합니다. 더 좋은 방법이 있니?

그러나, 내 주요 문제는 어떻게 사용자가 스프링 컨트롤러를 통해 파일을 다운로드하도록 허용 하는가?




Spring 3.0을 사용하면 HttpEntity 반환 객체를 사용할 수 있습니다. 이것을 사용하면 컨트롤러에 HttpServletResponse 객체가 필요하지 않으므로 테스트하기가 쉽습니다. 이것을 제외하고,이 대답은 Infeligo와 상대적으로 같습니다 .

pdf 프레임 워크의 반환 값이 바이트 배열 인 경우 (다른 반환 값에 대한 내 대답의 두 번째 부분 읽기) :

@RequestMapping(value = "/files/{fileName}", method = RequestMethod.GET)
public HttpEntity<byte[]> createPdf(
                 @PathVariable("fileName") String fileName) throws IOException {

    byte[] documentBody = this.pdfFramework.createPdf(filename);

    HttpHeaders header = new HttpHeaders();
    header.setContentType(MediaType.APPLICATION_PDF);
    header.set(HttpHeaders.CONTENT_DISPOSITION,
                   "attachment; filename=" + fileName.replace(" ", "_"));
    header.setContentLength(documentBody.length);

    return new HttpEntity<byte[]>(documentBody, header);
}

PDF 프레임 워크 ( documentBbody )의 반환 유형이 아직 바이트 배열이 아니며 ByteArrayInputStream 도없는 경우 먼저 바이트 배열로 지정 하지 않는 것이 좋습니다. 대신 다음을 사용하는 것이 좋습니다.

FileSystemResource 예제 :

@RequestMapping(value = "/files/{fileName}", method = RequestMethod.GET)
public HttpEntity<byte[]> createPdf(
                 @PathVariable("fileName") String fileName) throws IOException {

    File document = this.pdfFramework.createPdf(filename);

    HttpHeaders header = new HttpHeaders();
    header.setContentType(MediaType.APPLICATION_PDF);
    header.set(HttpHeaders.CONTENT_DISPOSITION,
                   "attachment; filename=" + fileName.replace(" ", "_"));
    header.setContentLength(document.length());

    return new HttpEntity<byte[]>(new FileSystemResource(document),
                                  header);
}



내가 빨리 생각할 수있는 것은 pdf를 생성하여 webapp / downloads / <RANDOM-FILENAME> .pdf에 코드로 저장하고 HttpServletRequest를 사용하여이 파일로 전달합니다.

request.getRequestDispatcher("/downloads/<RANDOM-FILENAME>.pdf").forward(request, response);

또는 당신이 view resolver를 뭔가 같이 구성 할 수 있다면,

  <bean id="pdfViewResolver"
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="viewClass"
              value="org.springframework.web.servlet.view.JstlView" />
    <property name="order" value=”2″/>
    <property name="prefix" value="/downloads/" />
    <property name="suffix" value=".pdf" />
  </bean>

그럼 그냥 돌려 보내라.

return "RANDOM-FILENAME";



이 코드는 jsp에서 링크를 클릭하면 스프링 컨트롤러에서 자동으로 파일을 다운로드하기 위해 잘 작동합니다.

@RequestMapping(value="/downloadLogFile")
public void getLogFile(HttpSession session,HttpServletResponse response) throws Exception {
    try {
        String filePathToBeServed = //complete file name with path;
        File fileToDownload = new File(filePathToBeServed);
        InputStream inputStream = new FileInputStream(fileToDownload);
        response.setContentType("application/force-download");
        response.setHeader("Content-Disposition", "attachment; filename="+fileName+".txt"); 
        IOUtils.copy(inputStream, response.getOutputStream());
        response.flushBuffer();
        inputStream.close();
    } catch (Exception e){
        LOGGER.debug("Request could not be completed at this moment. Please try again.");
        e.printStackTrace();
    }

}



Related