자바 파일다운로드 & 한글,특수문자 깨짐 방지
자바로 파일다운로를 하는 경우
파일명에 한글이 있거나 공백, 가로등 특수문자가 있는경우
브라우저 별로 참 다양한 파일명으로 다운로드 된다.
각 브라우저별로 파일을 다운로드 할때 적당한 인코딩을 하여
다운로드 받는 파일명 처리를 해주어야 한다.
아래 소스에서 각 브라우저 별로
다운로드 되는 파일명을 적절하게 인코딩하여 내려준다.
@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();
}