java file download - 스프링 컨트롤러에서 파일 다운로드하기
나는 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));
}
웹 사이트에서 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
도없는 경우 먼저 바이트 배열로 지정 하지 않는 것이 좋습니다. 대신 다음을 사용하는 것이 좋습니다.
-
InputStreamResource
, -
PathResource
(Spring 4.0 이후) 또는 -
FileSystemResource
,
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);
}
이 코드는 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();
}
}
내가 빨리 생각할 수있는 것은 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";
나에게 적합한 다음 솔루션
@RequestMapping(value="/download")
public void getLogFile(HttpSession session,HttpServletResponse response) throws Exception {
try {
String fileName="archivo demo.pdf";
String filePathToBeServed = "C:\\software\\Tomcat 7.0\\tmpFiles\\";
File fileToDownload = new File(filePathToBeServed+fileName);
InputStream inputStream = new FileInputStream(fileToDownload);
response.setContentType("application/force-download");
response.setHeader("Content-Disposition", "attachment; filename="+fileName);
IOUtils.copy(inputStream, response.getOutputStream());
response.flushBuffer();
inputStream.close();
} catch (Exception exception){
System.out.println(exception.getMessage());
}
}