2014. 9. 2. 14:57ㆍ공부/JAVA
텍스트 파일을 ajax로 업로드 하고, 그 파일을 분석해서 사용자 인터페이스를 구성해야 하는 내용이 있어서
오랜만에 파일 업로드 구현...
servlet api 3.0 이후부터는 좀 편하게 구현이 가능해짐...
원 소스코드는 아래 URL에서 구해옴..
거의 수정한 거 없음 ㅠㅠ, 다만 ajax response 로 수정
http://www.codejava.net/java-ee/servlet/java-file-upload-example-with-servlet-30-api
HTML FORM ( jquery 가 필요합니다. )
<form id="uploadForm" enctype="multipart/form-data">
<input type="file" id="fileId1" name="file1" value="VND 파일선택"/>
<input type="file" id="fileId2" name="file2" value="Config 파일 선택"/>
</form>
<button id="btn-upload">file upload</button>
<script type="text/javascript">
$('#btn-upload').click( function () {
var form = new FormData(document.getElementById('uploadForm'));
$.ajax({
url: "/nfv/ajax/vnfCatalog/file/upload",
data: form,
dataType: 'text',
processData: false,
contentType: false,
type: 'POST',
success: function (response) {
// more action
},
error: function ( request, status, error ) {
alert( request.responseText );
}
});
});
</script>
서버사이드 ( 서블릿 API 3.0 / 톰캣 7.0 / java 1.6 이상이 필요 )
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import org.apache.tomcat.util.http.fileupload.FileUploadBase.SizeLimitExceededException;
import com.sun.jersey.api.client.ClientResponse;
@WebServlet("/file/upload")
@MultipartConfig(fileSizeThreshold=1024*1024*2, maxFileSize=1024*1024*5, maxRequestSize=1024*1024*10 )
public class FileUploadController extends HttpServlet {
private static final long serialVersionUID = 1L;
private static final int MAX_FILE_SIZE = 5;
private static final String SAVE_DIR = "uploadFiles";
private static final Logger LOGGER = Logger.getLogger(ClientResponse.class.getName());
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException
{
// ajax 로 받은 데이터 중 한글이 깨지는 것 방지
response.setContentType("text/html; charset=utf-8");
String msg = "파일 업로드 중 정의되지 않은 오류가 발생했습니다. 관리자에게 문의 바랍니다.";
// 어플리케이션 절대경로 받아옴
String appPath = request.getServletContext().getRealPath("");
LOGGER.info( "appPath : " + appPath );
// 저장할 디렉토리 패쓰 설정
String savePath = appPath + File.separator + SAVE_DIR;
LOGGER.info( "savePath : " + savePath );
try
{
// 저장할 디렉토리가 없으면 새로 만듦
File fileSaveDir = new File(savePath);
if (!fileSaveDir.exists()) fileSaveDir.mkdir();
// file 구분해서 write
for (Part part : request.getParts()) {
String fileName = extractFileName(part);
part.write(savePath + File.separator + fileName);
}
response.getWriter().print( "전송이 완료되었습니다." );
}
catch ( Exception e )
{
LOGGER.warning( e.toString() );
response.setStatus( HttpServletResponse.SC_INTERNAL_SERVER_ERROR );
if ( e.getCause() instanceof FileNotFoundException )
{
msg = "업로드할 파일을 선택해 주십시요.";
LOGGER.warning( msg );
response.getWriter().write( msg );
}
else if ( e.getCause() instanceof SizeLimitExceededException )
{
msg = "업로드한 파일이 업로드 한계 사이즈 [" + MAX_FILE_SIZE + "MB] 를 초과합니다.";
LOGGER.warning( msg );
response.getWriter().write( msg );
}
else
{
msg = "파일 업로드 중 정의되지 않은 오류가 발생했습니다. 관리자에게 문의 바랍니다.";
LOGGER.warning( msg );
response.getWriter().write( msg );
}
response.flushBuffer();
}
}
/**
* HTTP 헤더에서 파일명을 분리합니다.
*/
private String extractFileName(Part part)
{
String contentDisp = part.getHeader("content-disposition");
String[] items = contentDisp.split(";");
for (String s : items)
{
if (s.trim().startsWith("filename"))
{
return s.substring(s.indexOf("=") + 2, s.length()-1);
}
}
return "";
}
}
나중에 또 쓸거 같아서 만들어 놓음