jQuery Uploadify + Apache Fileupload 비동기 파일 업로드 예
1. 업로드되는 파일의 크기와 유형을 제한할 수 있습니다. 이론적으로는 모든 유형의 파일을 업로드할 수 있습니다(API에 따라 구성 가능).
2. Apache commons-fileupload-1.3.1.jar은 백그라운드에서 업로드 툴킷으로 사용됩니다. 이 예는 한 번에 여러 파일 업로드를 지원합니다.
3. 파일 업로드 디렉토리는 임의로 지정할 수 있습니다. web.xml에서 구성하십시오.
Uploadify API에 대한 자세한 내용은 http://www.uploadify.com/documentation/을 참조하세요.
파일업로드서블릿
다음과 같이 코드 코드를 복사합니다.
패키지 com.xiaoxing.upload;
java.io.파일 가져오기;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;
java.util.Date 가져오기;
import java.util.Iterator;
java.util.List 가져오기;
java.util.UUID 가져오기;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
org.apache.commons.fileupload.FileItem 가져오기;
org.apache.commons.fileupload.disk.DiskFileItemFactory 가져오기;
org.apache.commons.fileupload.servlet.ServletFileUpload 가져오기;
/**
* <h1>Apache Fileupload 파일 업로드(2014-5-3)</h1>
* <p>1. 이 예에 관심이 있고 더 자세히 알고 싶다면 Java Private School 온라인 학습 커뮤니티(329232140)에 가입하세요.</p>
* <p>2. 이 예제는 약간의 수정을 거쳐 실제 프로젝트에 이식할 수 있습니다. </p>
*/
공개 클래스 FileUploadServlet은 HttpServlet을 확장합니다.
개인 정적 최종 긴 serialVersionUID = 7579265950932321867L;
//기본 파일 업로드 디렉터리 설정(web.xml에서 구성하지 않은 경우)
private String uploadDir = "c:/"; //파일 업로드 디렉터리
private String tempUploadDir = "c:/"; // 파일이 임시로 저장되는 디렉터리(세션이 파괴된 후 리스너에 의해 자동으로 삭제됨)
/*
* (Javadoc이 아닌)
* @javax.servlet.GenericServlet#init() 참조
* 파일 업로드 디렉터리가 web.xml에 구성되어 있으면 먼저 파일 디렉터리가 있는지 확인하는 데 사용됩니다. 존재하지 않으면 새로 만듭니다.
*/
@보수
public void init()에서 ServletException이 발생합니다.
// 이 프로젝트가 위치한 실제 하드 디스크 디렉터리를 가져옵니다.
문자열 경로 = getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
path = path.substring(0, path.indexOf("WEB-INF"));
// 타겟이 존재하는지 확인하고 존재하지 않으면 생성합니다.
String uploadDir = path.concat(this.getInitParameter("uploadDir"));
String tempUploadDir = path.concat(this.getInitParameter("tempUploadDir"));
파일 f_uploadDir = 새 파일(uploadDir);
파일 f_tempUploadDir = 새 파일(tempUploadDir);
if (!f_uploadDir.exists()) {
f_uploadDir.mkdirs();
}
if (!f_tempUploadDir.exists()) {
f_tempUploadDir.mkdirs();
}
//변수에 값 할당
this.uploadDir = uploadDir;
this.tempUploadDir = tempUploadDir;
}
/*
* (Javadoc이 아닌)
* @javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) 참조
* get 메소드로 제출된 데이터를 수락하지 않고 업로드 실패 상태 코드를 반환합니다.
*/
@보수
protected void doGet(HttpServletRequest 요청, HttpServletResponse 응답)은 ServletException, IOException을 발생시킵니다.
this.setResponse(응답);
PrintWriter 출력 = response.getWriter();
out.print("{/"error/":/"-1/"") // 잘못된 제출 방법
}
/*
* (Javadoc이 아닌)
* @javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) 참조
* 파일 업로드 요청은 일반적으로 POST를 통해 제출됩니다.
*/
@보수
protected void doPost(HttpServletRequest 요청, HttpServletResponse 응답)은 ServletException, IOException을 발생시킵니다.
this.setResponse(response); //프론트엔드 파싱을 위한 응답 유형을 설정합니다.
PrintWriter 출력 = response.getWriter();
문자열 결과 = "";
노력하다 {
// 파일 업로드 요청인지 확인
boolean isMultipart = ServletFileUpload.isMultipartContent(요청);
if (isMultipart) {
DiskFileItemFactory Factory = new DiskFileItemFactory(); // 팩토리 디스크 기반 파일 항목 생성
Factory.setRepository(new File(tempUploadDir)); // 저장소 구성(안전한 임시 위치를 확보하는 경우)
ServletFileUpload upload = new ServletFileUpload(factory); // 새 파일 업로드 핸들러 생성
upload.setSizeMax(1024 * 1024 * 100); // 필요한 전체 크기 제한을 설정합니다. (프런트엔드와 백엔드는 서로 다른 플러그인을 사용하므로 별도로 설정하는 것이 좋습니다.)
List<FileItem> items = upload.parseRequest(request) // 요청을 구문 분석합니다.
Iterator<FileItem> iter = items.iterator(); // 업로드된 항목을 처리합니다.
while (iter.hasNext()) { //여러 파일을 동시에 업로드할 경우 여기에 별도로 저장됩니다.
FileItem 항목 = iter.next();
if (!item.isFormField()) { // 양식에서 파일 유형이 아닌 필드를 필터링합니다.
if (!"".equals(item.getName())) { // 파일 유형이 아닌 입력을 필터링합니다.
String s_name = item.getName(); // 원본 파일 이름을 가져옵니다.
int position = s_name.lastIndexOf(".");
String s_fileType = s_name.substring(position, s_name.length()) // 파일 접미사 가져오기
문자열 날짜 = new SimpleDateFormat("yyyyMMdd").format(new Date());
String s = uploadDir.concat("/").concat(date).concat("/");
//여기서 날짜별로 디렉토리에 파일을 저장합니다.
파일 sf = 새 파일;
if (!sf.exists()) {
sf.mkdirs();
}
String s_filePath = s.concat(UUID.randomUUID().toString()).concat(s_fileType);
파일 경로 = 새 파일(s_filePath);
item.write(경로);
결과 += s_filePath.concat(",");
} 또 다른 {
결과 = "";
부서지다;
}
}
}
} 또 다른 {
결과 = "";
}
String s_resultJSON = this.jointJSON(result); // 스플라이싱은 프런트엔드 JSON을 반환합니다.
out.print(s_resultJSON);
} 잡기(예외 e) {
e.printStackTrace();
} 마지막으로 {
out.flush();
종료.닫기();
}
}
/**
* JSON을 연결하고 저장된 파일의 파일 이름과 날짜 디렉터리를 프런트 엔드에 반환합니다. 프런트 엔드에서는 파일 경로를 데이터베이스에 저장하는 등 다른 양식 작업을 완료하기 위해 이 경로가 필요할 수 있습니다.
* @param 결과 JSON 형식 문자열
* @반품
* @UnsupportedEncodingException 발생
*/
private StringjoinJSON(문자열 결과)에서 UnsupportedEncodingException이 발생합니다.
문자열 str = "";
if(!"".equals(결과)) {
String rs[] = result.split(",");
StringBuffer 버퍼 = new StringBuffer("{/"rows/":[");
for (int i = 0; i < rs.length; i++) {
문자열 s_tmpName = rs[i];
s_tmpName = s_tmpName.substring(uploadDir.length(), s_tmpName.length());
buffer.append("{/"name/":/"").append(s_tmpName).append("/"},");
}
str = buffer.toString();
str = str.substring(0, str.length() - 1).concat("]}");
} 또 다른 {
str = "{/"error/":/"-2/"" //업로드 실패
}
str을 반환;
}
/**
* 응답 유형 ContentType을 "application/x-json"으로 설정합니다.
* @param 응답
*/
개인 무효 setResponse(HttpServletResponse 응답) {
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json;charset=UTF-8");
response.setHeader("캐시 제어", "캐시 없음");
}
}
test_upload.html
다음과 같이 코드 코드를 복사합니다.
<!DOCTYPE HTML>
<html>
<머리>
<meta charset="UTF-8">
<title>jQuery Uploadify + Apache Fileupload 비동기 파일 업로드 예시(2014-5-3)</title>
<link rel="stylesheet" type="text/css" href="/js/uploadify/uploadify.css">
<script src="/js/jquery-1.9.0.js"></script>
<script src="/js/uploadify/jquery.uploadify.min.js"></script>
<스크립트 유형="텍스트/자바스크립트">
$(함수() {
$('#fileupload').uploadify({
'방법': '게시물',
'buttonText': '플래시 업로드 파일',
'fileSizeLimit': '1024KB',
'fileTypeExts': '*.gif *.png',
'swf': '/js/uploadify/uploadify.swf',
'uploader' : '/upload', //이미지를 업로드하는 경로이며, web.xml에 구성한 서블릿입니다.
'onUploadSuccess' : function(file, data, response) { //이미지 업로드 성공 후 반환된 데이터가 여기에서 처리됩니다.
var ary = eval("(" + 데이터 + ")").rows;
for(var i = 0; i < ary.length; i++) {
$("#J_div").append("<img alt='image' src='/upload/images" + ary[i].name + "' width='200px' height='200px'>");
}
}
});
});
</script>
</head>
<본문>
<h2>jQuery Uploadify + Apache Fileupload 비동기 파일 업로드 예시(2014-5-3)</h2>
<p>1. 업로드되는 파일의 크기와 유형을 제한할 수 있습니다. 이론적으로 모든 유형의 파일을 업로드할 수 있습니다(API에 따라 구성 가능).</p>
<p>2. Apache commons-fileupload-1.3.1.jar은 백그라운드에서 업로드 툴킷으로 사용됩니다. 이 예는 한 번에 여러 파일 업로드를 지원합니다.</p>
<p>3. 파일 업로드 디렉터리는 임의로 지정할 수 있습니다. web.xml에서 구성하세요.</p>
<p>4. 업로드한 사진은 이 페이지에서 찾을 수 없습니다. </p>
<p>Uploadify API에 대한 자세한 내용은 http://www.uploadify.com/documentation/을 참조하세요.</p>
<p style="color: red">*이 예에 관심이 있고 더 자세히 알고 싶다면 Java Private School 온라인 학습 커뮤니티(329232140)에 가입해 보세요. </p>
<input id="fileupload" type="file" name="img" multiple="multiple"/>
<div id="J_div"></div>
</body>
</html>
web.xml
다음과 같이 코드 코드를 복사합니다.
<?xml version="1.0" 인코딩="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http ://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 메타데이터-완전="true" 버전="3.0">
<환영 파일 목록>
<welcome-file>test_upload.html</welcome-file>
</welcome-파일-목록>
<서블릿>
<description>업로드 작업을 처리하도록 특별히 설계된 서블릿</description>
<servlet-name>FileUploadServlet</servlet-name>
<servlet-class>com.xiaoxing.upload.FileUploadServlet</servlet-class>
<초기화 매개변수>
<description>파일이 저장되는 공식 디렉토리로, 직접 구성할 수 있습니다.</description>
<param-name>uploadDir</param-name>
<param-값>/업로드/이미지/</param-값>
</init-param>
<초기화 매개변수>
<description>파일이 저장되는 임시 디렉터리는 아래에 구성한 리스너에 의해 자동으로 삭제됩니다. </설명>
<param-name>tempUploadDir</param-name>
<param-값>/업로드/임시</param-값>
</init-param>
</서블릿>
<서블릿 매핑>
<servlet-name>FileUploadServlet</servlet-name>
<url-패턴>/업로드</url-pattern>
</서블릿 매핑>
<청취자>
<description>임시 파일 리소스 정리, 툴킷이 함께 제공되므로 작성할 필요가 없습니다.</description>
<listener-class>org.apache.commons.fileupload.servlet.FileCleanerCleanup</listener-class>
</listener>
</웹-앱>