java 파일 다운로드 예제는 굉장히 많다.
대부분 지정한 폴더에는 파일이 만들어 지긴 하지만 아래 사진처럼
브라우저에서 다운로드할 경우 나타나는 알림창이 생기지를 않아
개인 프로젝트를 진행할때 애먹은 적이 있다.
하지만 결국에는 브라우저에서 다운로드 할 경우 알림창이 나타나는 소스를 찾아서 링크를 걸어둔다.
$(document).ready(function(){
$('#fileDown').click(function(){
var filename = $('#fileName').val();
window.location.assign('${ctx}/infoCenter/download.do?fileName='+fileName);
});
});
@RequestMapping(value="/download.do", produces="text/plain;charset=UTF-8")
public void fileDownload(HttpServletRequest request, HttpServletResponse response){
String fileName = request.getParameter("fileName");
String path = request.getSession().getServletContext().getRealPath("/");
File file = null;
InputStream is = null;
OutputStream os = null;
String mimetype = "application/x-msdownload";
response.setContentType(mimetype);
try {
setDisposition(fileName, request, response);
file = new File(path+"\\resource\\download\\"+fileName);
is = new FileInputStream(file);
os = response.getOutputStream();
byte b[] = new byte[(int) file.length()];
int leng = 0;
while((leng = is.read(b)) > 0){
os.write(b,0,leng);
}
is.close();
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}
void setDisposition(String filename, HttpServletRequest request,
HttpServletResponse response) throws Exception {
String browser = getBrowser(request);
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();
} else {
throw new IOException("Not supported browser");
}
response.setHeader("Content-Disposition", dispositionPrefix
+ encodedFilename);
if ("Opera".equals(browser)) {
response.setContentType("application/octet-stream;charset=UTF-8");
}
}
private String getBrowser(HttpServletRequest request) {
String header = request.getHeader("User-Agent");
if (header.indexOf("MSIE") > -1) {
return "MSIE";
} else if (header.indexOf("Chrome") > -1) {
return "Chrome";
} else if (header.indexOf("Opera") > -1) {
return "Opera";
} else if (header.indexOf("Firefox") > -1) {
return "Firefox";
} else if (header.indexOf("Mozilla") > -1) {
if (header.indexOf("Firefox") > -1) {
return "Firefox";
}else{
return "MSIE";
}
}
return "MSIE";
}
+추가
파일 대용량 처리
byte b[] = new byte[(int) file.length()]; //용량이 커질경우 바이트 버퍼가 커짐
int leng = 0;
while((leng = is.read(b)) > 0){ //한번에 처리를 하면 문제 발생
os.write(b,0,leng);
}
// 아래와 같이 코드 적용
byte[] b = new byte[2048];
int leng = 0;
while((leng = is.read(b)) != -1){
os.write(b,0,leng);
}
도움이 된 블로그
https://aljjabaegi.tistory.com/340