자바로 파일다운로를 하는 경우

파일명에 한글이 있거나 공백, 가로등 특수문자가 있는경우

브라우저 별로 참 다양한 파일명으로 다운로드 된다.


각 브라우저별로 파일을 다운로드 할때 적당한 인코딩을 하여

다운로드 받는 파일명 처리를 해주어야 한다.


아래 소스에서 각 브라우저 별로

다운로드 되는 파일명을 적절하게 인코딩하여 내려준다.


@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();

}



+ Recent posts