MultipartRequest를 통해 업로드를 하면, 생성자에 FileRenamePolicy 인스턴스를 파라미터로 전달합니다.
일반적으로 DefaultFileRenamePolicy를 많이 사용하게 되는데요.
이 DefaultFileRenamePolicy는 간단한 역할을 합니다.
public class DefaultFileRenamePolicy implements FileRenamePolicy { // This method does not need to be synchronized because createNewFile() // is atomic and used here to mark when a file name is chosen public File rename(File f) { if (createNewFile(f)) { return f; } String name = f.getName(); String body = null; String ext = null; int dot = name.lastIndexOf("."); if (dot != -1) { body = name.substring(0, dot); ext = name.substring(dot); // includes "." } else { body = name; ext = ""; } // Increase the count until an empty spot is found. // Max out at 9999 to avoid an infinite loop caused by a persistent // IOException, like when the destination dir becomes non-writable. // We don't pass the exception up because our job is just to rename, // and the caller will hit any IOException in normal processing. int count = 0; while (!createNewFile(f) && count < 9999) { count++; String newName = body + count + ext; f = new File(f.getParent(), newName); } return f; } private boolean createNewFile(File f) { try { return f.createNewFile(); } catch (IOException ignored) { return false; } } }
코드에서 보시다 시피 중복된 파일이 있으면 파일이름 뒤에 1~9999까지의 숫자를 붙여서 파일의 rename을 진행하고 있는것을 확인 할 수 있습니다.
만약 서버의 업로드 서버의 인코딩 설정 문제로 한글이 깨지거나 할수 있습니다. 그렇기 때문에 저는 Timestamp를 통해 파일이름을 변경하고 있습니다. 이렇듯 MultipartRequest에서 File Rename Policy를 Timestamp로 변경하는 방법을 진행해 보겠습니다.
package net.tutorial.util; import java.io.File; import com.oreilly.servlet.multipart.FileRenamePolicy; public class TimestampFileRenamePolicy implements FileRenamePolicy { @Override public File rename(File f) { String name = f.getName(); String body = null; String ext = null; int dot = name.lastIndexOf("."); if (dot != -1) { ext = name.substring(dot); // includes "." } else { ext = ""; } body = Long.toString( System.currentTimeMillis() ); File renameFile = new File( f.getParent(), body + ext ); if( renameFile.exists() ){ int count = 0; do { count++; String newName = body + count + ext; renameFile = new File(f.getParent(), newName); }while( renameFile.exists() && count < 9999 ); } f.renameTo( renameFile ); return renameFile; } }
System.currentTimeMillis()를 통해 현재의 시간을 ms 단위로 구한뒤에 이를 파일이름에 붙입니다. 만약 그럴일은 없겠지만..^^ 동시에 파일 업로드를 진행해서 파일이름이 똑같다면, Timestamp뒤에 1~9999를 붙여서 처리하는 TimeStampRenamePolicy를 만들어 보았습니다.
'Web > JAVA' 카테고리의 다른 글
java.net.SocketException: Connection reset 발생시 처리 방법 (0) | 2013.11.14 |
---|---|
JAVA - java.lang.UnsupportedClassVersionError: Bad version number in .class file 에러 발생 (4) | 2011.03.08 |
cos.jar 의 MultipartRequest를 확장한 확장자 체크 만들기. (1) | 2011.02.15 |
JAVA - 정규식을 이용한 문자열에서 HTML 태그 제거하기 (0) | 2010.09.29 |