자바로 파일다운로를 하는 경우
파일명에 한글이 있거나 공백, 가로등 특수문자가 있는경우
브라우저 별로 참 다양한 파일명으로 다운로드 된다.
각 브라우저별로 파일을 다운로드 할때 적당한 인코딩을 하여
다운로드 받는 파일명 처리를 해주어야 한다.
아래 소스에서 각 브라우저 별로
다운로드 되는 파일명을 적절하게 인코딩하여 내려준다.
@RequestMapping( value = "/download.do" )
public void filedown( @RequestParam Map<String, Object> param, HttpServletRequest request,
HttpServletResponse response ) throws Exception {
File file = (File) param.get( "downloadFile" );
String displayFileName = String.valueOf( param.get( "displayFileName" ) );
String encodedFilename = "";
response.setContentType( "application/download; UTF-8" );
response.setContentLength( (int) file.length() );
String header = request.getHeader( "User-Agent" );
if ( header.indexOf( "MSIE" ) > -1 ) {
encodedFilename = URLEncoder.encode( displayFileName, "UTF-8" ).replaceAll( "\\+", "%20" );
}
else if ( header.indexOf( "Trident" ) > -1 ) {
encodedFilename = URLEncoder.encode( displayFileName, "UTF-8" ).replaceAll( "\\+", "%20" );
}
else if ( header.indexOf( "Chrome" ) > -1 ) {
StringBuffer sb = new StringBuffer();
for ( int i = 0; i < displayFileName.length(); i++ ) {
char c = displayFileName.charAt( i );
if ( c > '~' ) {
sb.append( URLEncoder.encode( "" + c, "UTF-8" ) );
}
else {
sb.append( c );
}
}
encodedFilename = sb.toString();
}
else if ( header.indexOf( "Opera" ) > -1 ) {
encodedFilename = "\"" + new String( displayFileName.getBytes( "UTF-8" ), "8859_1" ) + "\"";
}
else if ( header.indexOf( "Safari" ) > -1 ) {
encodedFilename = "\"" + new String( displayFileName.getBytes( "UTF-8" ), "8859_1" ) + "\"";
encodedFilename = URLDecoder.decode( encodedFilename );
}else{
encodedFilename = "\"" + new String( displayFileName.getBytes( "UTF-8" ), "8859_1" ) + "\"";
encodedFilename = URLDecoder.decode( encodedFilename );
}
response.setHeader( "Content-Disposition", "attachment; filename=\"" + encodedFilename + "\";" );
response.setHeader( "Content-Transfer-Encoding", "binary" );
OutputStream out = response.getOutputStream();
FileInputStream fis = null;
try {
fis = new FileInputStream( file );
FileCopyUtils.copy( fis, out );
}
catch ( FileNotFoundException e ) {
if ( LOGGER.isErrorEnabled() ) {
LOGGER.error( e.getMessage(), e );
}
throw new KpxBizException( messageSource, "ERROR.0104" );
}
finally {
IOUtils.closeQuietly( fis );
}
out.flush();
}
'Java' 카테고리의 다른 글
자바 엑셀파일 읽기 - java read excel, xlsx, xls (0) | 2019.08.14 |
---|---|
jstl <c:url value=""> 사용시 ;jsessionid= 붙는 현상 (0) | 2018.03.06 |
JAVA 메일 발송시 hanmail, daum 메일 제목에 _(언더바 나오는 현상) (0) | 2018.02.22 |
전자정부 프레임워크 3.7 버전에서 오류 메세지 (0) | 2018.02.20 |
mybatis foreach 구문 list 안에 map이 있는 경우 (0) | 2018.01.24 |