반응형
스프링 자바 파일 다운로드 java file download 예제
자바 스프링에서 파일을 다운로드 하는 예제를 올려보겠습니다. 저는 각종 문서 템플릿을 사용자들이 다운받을 수 있도록 JSP페이지에 기능을 추가 하였습니다. 파일 다운로드 로직을 유틸자바파일로 생성하고, 컨트롤러단에서 사용하였습니다. JSP 에서 url로 호출하여 사용하였습니다. 순서대로 진행하시면, 자연스럽게 이해되실꺼에요.
1. 자바파일다운로드 코딩로직 (DownloadView.java 파일을 생성해준다.)
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.util.FileCopyUtils;
public class DownloadView {
public void filDown(HttpServletRequest request,
HttpServletResponse response, String filePath, String realFilNm,
String viewFileNm) throws IOException {
File file = new File( filePath + realFilNm);
System.out.println("root = " + filePath + realFilNm);
if (file.exists() && file.isFile()) {
response.setContentType("application/octet-stream; charset=utf-8");
response.setContentLength((int) file.length());
String browser = getBrowser(request);
String disposition = getDisposition(viewFileNm, browser);
response.setHeader("Content-Disposition", disposition);
response.setHeader("Content-Transfer-Encoding", "binary");
OutputStream out = response.getOutputStream();
FileInputStream fis = null;
fis = new FileInputStream(file);
FileCopyUtils.copy(fis, out);
if (fis != null)
fis.close();
out.flush();
out.close();
}
}
private String getBrowser(HttpServletRequest request) {
String header = request.getHeader("User-Agent");
if (header.indexOf("MSIE") > -1 || header.indexOf("Trident") > -1)
return "MSIE";
else if (header.indexOf("Chrome") > -1)
return "Chrome";
else if (header.indexOf("Opera") > -1)
return "Opera";
return "Firefox";
}
private String getDisposition(String filename, String browser)
throws UnsupportedEncodingException {
String dispositionPrefix = "attachment;filename=";
String encodedFilename = null;
if (browser.equals("MSIE")) {
encodedFilename = URLEncoder.encode(filename, "UTF-8").replaceAll(
"\\+", "%20");
} else if (browser.equals("Firefox")) {
encodedFilename = "\""
+ new String(filename.getBytes("UTF-8"), "8859_1") + "\"";
} else if (browser.equals("Opera")) {
encodedFilename = "\""
+ new String(filename.getBytes("UTF-8"), "8859_1") + "\"";
} else if (browser.equals("Chrome")) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < filename.length(); i++) {
char c = filename.charAt(i);
if (c > '~') {
sb.append(URLEncoder.encode("" + c, "UTF-8"));
} else {
sb.append(c);
}
}
encodedFilename = sb.toString();
}
return dispositionPrefix + encodedFilename;
}
}
2. 컨트롤러단에서 객체를 생성하고 호출한다. (여기는 컨트롤러에서 서블릿 하나를 추가해줍니다.)
// 문서템플릿 파일 다운로드
@RequestMapping(value = "/document/fileDownload.do")
public void fileDownload(
@RequestParam("document_nm") String document_nm
, HttpSession session
, HttpServletRequest req
, HttpServletResponse res
, ModelAndView mav) throws Throwable
{
try {
DownloadView fileDown = new DownloadView(); //파일다운로드 객체생성
fileDown.filDown(req, res, "파일경로입력" + "/" , "파일이름이력", "다운받았을때출력되는파일이름입력"); //파일다운로드
} catch (Exception e) {
e.printStackTrace();
logger.error(e.toString());
}
}
위에 한글로 표기해 논거처럼 객체를 생성한 후에, 알맞게 입력해줍니다. 파일경로입력 과 파일이름입력 은 사용자들에게 서버에서 다운시켜주고 싶은 파일경로와 파일명을 입력하면 됩니다. 마지막 다운받았을때출력되는파일이름은 말 그대로 사용자들이 다운했을때, 보여지는 파일명 입니다.
3. JSP 파일에서 RequestMapping 으로 값을 준 url로 컨트롤러 서블릿(위에2번)을 호출한다.
//문서다운로드
function fn_downfile(document_nm){
location.href="/document/fileDownload.do?document_nm=" + document_nm);
}
위와 같이 JSP파일에서 스크립트로 추가 해준 다음에, 버튼을 하나 생성하여 fn_downfile()을 호출하시면 됩니다.
document_nm 은 변수에요. 스크립트가 호출되면서 저 문서에 맞는 파라미터값을 서블릿에서 처리하며, 원하는 파일이 다운로드 되겠죠?
반응형