이 기사의 예에서는 Java의 struts2에서 파일 업로드 및 다운로드 기능을 구현하는 방법을 설명합니다. 참고할 수 있도록 모든 사람과 공유하세요. 구체적인 분석은 다음과 같습니다.
1.파일 업로드
첫 번째는 jsp 페이지의 코드입니다.
JSP 페이지에서 업로드 태그 정의
다음과 같이 코드를 복사하세요:<tr>
<td align="right" bgcolor="#F5F8F9"><b>첨부파일:</b></td>
<td bgcolor="#FFFFFF">
<입력 유형="파일" 이름="업로드" />
</td>
<td bgcolor="#FFFFFF"></td>
</tr>
그러면 BaseAction에 정의된 관련 속성이 생략됩니다(자신의 Action에서 정의할 수도 있습니다. 액세스 한정자를 변경하면 됩니다).
다음과 같이 코드 코드를 복사합니다:/**
*액션 베이스 클래스
**/
공개 클래스 BaseAction은 ActionSupport를 확장합니다.
보호된 목록<파일> 업로드;
protected List<String> uploadContentType; //파일 유형
protected List<String> uploadFileName //파일명;
protected String savePath; //경로 저장
}
그런 다음 Action에 업로드 방법이 있으며 코드는 다음과 같습니다.
다음과 같이 코드 코드를 복사합니다:/**
* 8. 첨부파일 업로드 * @param upload
*/
public void uploadAccess(List<파일> 업로드){
노력하다 {
if (null != 업로드) {
for (int i = 0; i < upload.size(); i++) {
문자열 경로 = getSavePath() + ""+ getUploadFileName().get(i);
System.out.println(경로);
item.setAccessory(getUploadFileName().get(i));
FileOutputStream fos = new FileOutputStream(경로);
FileInputStream fis = new FileInputStream(getUpload().get(i));
바이트[] 버퍼 = 새 바이트[1024];
int len = 0;
while ((len = fis.read(buffer)) > 0) {
fos.write(버퍼, 0, len);
}
fis.close();
fos.close();
}
}
} 잡기(예외 e) {
logger.error("첨부 파일 업로드 중 오류가 발생했습니다.", e);
}
}
그런 다음 내 struts2.xml 파일의 복사 코드는 다음과 같습니다. <action name="itemRDAction_*" method="{1}">
<param name="savePath">e:업로드</param>
<interceptor-ref name="defaultStack">
<param name="fileUpload.allowedTypes">
응용 프로그램/옥텟-스트림, 이미지/pjpeg, 이미지/bmp, 이미지/jpg, 이미지/png, 이미지/gif, 이미지/jpeg, 응용 프로그램/msword, 응용 프로그램/vnd.openxmlformats-officedocument.wordprocessingml.document, 응용 프로그램/vnd. ms-엑셀
</param>
<param name="fileUpload.maximumSize">8000000</param>
</인터셉터-ref>
<result name="show_item_rd_upd"> /WEB-INF/jsp/page_item/updItem_rd.jsp</result>
<result name="show_item_rd_list"> /WEB-INF/jsp/page_item/listItem_rd.jsp</result>
<result name="show_item_rd_push"> /WEB-INF/jsp/page_item/pushItem_rd.jsp</result>
</액션>
savePath는 저장 경로이고, fileUpload.allowedTypes는 업로드 파일 형식 fileUpload.maximumSize 파일 크기 제한을 제한하는 데 사용됩니다.
2.파일 다운로드
먼저 다음과 같이 페이지의 다운로드 링크 코드를 복사하세요. <tr>
<td align="right" bgcolor="#F5F8F9"><b>첨부파일:</b></td>
<td bgcolor="#FFFFFF">
<div>${item.accessory}</div>
<c:if test="${!empty item.accessory}">
<div style="float: left;"><a style="color: black; text-꾸밈: 없음;" href="download.action?filename=${item.accessory}">다운로드</a>< /div>
</c:if>
</td>
<td bgcolor="#FFFFFF"></td>
</tr>
다음은 DownloadAction의 코드입니다.
다음과 같이 코드 코드를 복사합니다:/**
* 다운로드액션
*
* @author zhaoxz
*
*/
@Controller("downloadAction")
@Scope("프로토타입")
공개 클래스 DownloadAction은 BaseAction을 확장합니다.
/**
*
*/
개인 정적 최종 긴 serialVersionUID = -4278687717124480968L;
개인 정적 로거 로거 logger = Logger.getLogger(DownloadAction.class);
개인 문자열 파일명;
개인 입력스트림 inputStream;
개인 문자열 savePath;
개인 문자열 mimeType;
공개 입력스트림 getInputStream() {
노력하다 {
문자열 경로 = getSavePath() + "//"+ new String(filename.getBytes("ISO8859-1"), "utf-8");
System.out.println(경로);
mimeType = ServletActionContext.getServletContext().getMimeType(path)+ ";charset=UTF-8";
inputStream = 새로운 FileInputStream(경로);
문자열 에이전트 = request.getHeader("USER-AGENT");
System.out.println(에이전트);
if (null != 에이전트) {
if (-1 != agent.indexOf("Firefox")) {// Firefox
mimeType = mimeType.replace("UTF-8", "ISO8859-1");
} else {// IE7+ 크롬
System.out.println("IE,크롬");
filename = new String(filename.getBytes("ISO8859-1"),"utf-8");
파일 이름 = java.net.URLEncoder.encode(파일 이름, "UTF-8");
}
}
} 잡기(예외 e) {
logger.error("파일 정보 다운로드 중 오류가 발생했습니다.", e);
}
if (null == inputStream) {
System.out.println("getResource 오류");
}
inputStream을 반환합니다.
}
공공 무효 setInputStream(InputStream inputStream) {
this.inputStream = inputStream;
}
@보수
공개 문자열 실행()이 예외를 발생시킵니다.
성공을 반환합니다.
}
/******************************** 설정 ***************** ******* **********/
공개 문자열 getSavePath() {
this.savePath를 반환합니다.
}
공공 무효 setSavePath(문자열 savePath) {
this.savePath = savePath;
}
공개 문자열 getFilename() {
파일 이름을 반환합니다.
}
공공 무효 setFilename(문자열 파일 이름) {
this.filename = 파일명;
}
}
그런 다음 struts2.xml 파일이 있습니다.
다음과 같이 코드를 복사합니다: <action name="download">
<param name="savePath">E:/upload</param>
<결과 유형="스트림">
<param name="contentType">${mimeType}</param>
<param name="contentDisposition">attachment;filename="${filename}"</param>
<param name="inputName">inputStream</param>
</결과>
</액션>
다운로드 시 인코딩 형식에 주의하시고, 문제가 없을 것입니다.
업로드 중 발생한 문제
1. 대용량 파일을 업로드할 때 오류가 발생합니다. 해결 방법 1.
발생하는 오류는 다음과 같습니다.
1. 2012-02-24 11:06:31,937 ERROR (org.apache.struts2.dispatcher.Dispatcher:512) - 액션이나 결과를 찾을 수 없습니다.
com.iman.portal.action.QuestionActionImpl 작업 및 결과 문제 페이지 - 작업 - 파일:/E:/myeclipse/workspaces/portal/WebRoot/WEB-INF/classes/struts2/struts-question.xml:51에 대해 정의된 결과가 없습니다. 55
2. 크기(2973652)가 구성된 최대값(2097152)을 초과하여 요청이 거부되었습니다.
중국어 의미: 크기(2973652)가 구성된 최대값(2097152)을 초과하여 요청이 거부되었습니다.
사용자 경험을 고려하여 첨부 파일을 업로드할 때 이러한 예외를 차단하는 것이 필요합니다. 해결 방법은 다음과 같습니다.
1. 업로드된 파일은 업로드 과정에서 먼저 캐시에 저장됩니다. 프로젝트에는 서버의 물리적 경로가 설정되어 있지만, 안전상의 이유로 프로젝트의 struts.properties 파일에 임시 저장 경로를 추가하세요.
다음과 같이 코드를 복사합니다: struts.multipart.saveDir=/temp
2. 기본 여부에 관계없이 추후 파일 업로드 크기가 수정될 수 있다는 점을 고려하여 프로젝트의 struts.properties 파일에 다음 구성을 추가합니다.
다음과 같이 코드를 복사하세요. <!-- 허용되는 업로드 파일 크기는 2M입니다 -->
<상수 이름="struts.multipart.maxSize" value="2097152"/>
3. struts.xml 구성
다음과 같이 코드를 복사하세요: <!-- 문제 수정 방법 -->
<작업 이름="updateProblem" 메서드="updateProblem">
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="defaultStack" />
<result name="input">/page/question/page/problemPage.jsp</result>
</액션>
4. 가장 중요하고 중요한 단계
fileUpload 인터셉터는 파일이 서버에 업로드된 후에만 파일 유형과 크기를 결정합니다. Action에서 아무것도 하지 않으면 사용자 앞에 예외가 표시되므로 예외 정보를 Action 수준의 오류 메시지로 설정하는 방법을 생각했습니다. 즉, addActionError 메소드를 대체하십시오.
다음과 같이 코드 코드를 복사합니다. @Override
공공 무효 addActionError(문자열 anErrorMessage) {
// 여기서는 처리하기 전에 교체하려는 오류인지 먼저 확인해야 합니다.
if (anErrorMessage.startsWith("크기 때문에 요청이 거부되었습니다.")) {
패턴 패턴 = Pattern.compile("d+");
일치자 m = 패턴.매처(anErrorMessage);
// 한 번 일치
m.find();
String s1 =m.group();//업로드된 파일 크기
// 다시 일치
m.find();
문자열 s2 =m.group();//제한된 크기
if(!s1.equals("") && !s2.equals("")){
fileUploadErrorMessage="업로드한 파일의 크기(" + Long.valueOf(s1)/1024 + "바이트)가 허용된 크기(" + Long.valueOf(s2)/1024/1024 + "M)"를 초과했습니다.
getRequest().setAttribute("fileUploadErrorMessage","파일이 너무 커서 허용된 크기("+Long.valueOf(s2)/1024/1024+"M)를 초과했습니다. 업로드에 실패했습니다!");
// 정보를 교체합니다.
super.addActionError(fileUploadErrorMessage);
}
} else {//그렇지 않은 경우 원래 방법에 따라 처리합니다.
super.addActionError(anErrorMessage);
}
}
예, addActionError의 오류 내용을 가져오려면 반환 페이지에서 <s:fielderror/> <s:fielderror/>를 사용하세요.
오류의 원인을 페이지에 표시하고 싶지 않고 프롬프트 상자를 팝업으로 표시하고 싶기 때문에 해당 정보를 요청 개체에 넣었습니다.
페이지가 로드되면 다음 js 확인이 추가됩니다.
다음과 같이 코드 코드를 복사합니다. // 파일이 성공적으로 업로드되었는지 확인합니다.
var message="${request.fileUploadErrorMessage}";
if(message!=null && ""!=trim(message) && message!="null"){
self.parent.diag.close();
경고(메시지);
반품;
}
동동을 이해하기 위한 참고자료는 다음과 같습니다.
struts.multipart.maxSize는 전체 프로젝트에서 업로드되는 파일의 최대 크기를 제어합니다.
struts.multipart.maxSize 및 fileUpload 인터셉터의 maximumSize 속성은 서로 다른 작업 부문을 가지며, 이는 다음과 같이 요약됩니다.
1.struts.multipart.maxSize는 전체 프로젝트에서 업로드되는 파일의 최대 크기를 제어합니다.
이 크기를 초과하면 백그라운드에서 오류가 보고되고 프로그램은 이러한 큰 파일을 처리할 수 없습니다. fielderror에 다음 프롬프트가 표시됩니다.
크기(16272982)가 구성된 최대값(9000000)을 초과하여 요청이 거부되었습니다.
2. fileUpload 인터셉터의 maximumSize 속성은 struts.multipart.maxSize 값보다 작아야 합니다.
기본 struts.multipart.maxSize는 2M입니다. maximumSize가 2M보다 큰 경우 struts.multipart.maxSize의 값은 maximumSize보다 크게 설정되어야 합니다.
3. 업로드된 파일이 struts.multipart.maxSize보다 크면 시스템은 오류를 보고합니다. 업로드된 파일이 struts.multipart.maxSize와 maximumSize 사이에 있으면 시스템은 다음 메시지를 표시합니다.
파일이 너무 큼: 파일 "MSF Concept.ppt" "upload__5133e516_129ce85285f__7ffa_00000005.tmp" 6007104
업로드된 파일이 maximumSize보다 작으면 업로드가 성공한 것입니다.
다음과 같이 코드를 복사합니다: <action name="UploadFile">
<result name="UploadFileResult">/pages/ShowOtherFiles.jsp</result>
<result name="JGBsuccess">/pages/JGBdetail.jsp</result>
<interceptor-ref name="fileUpload">
<param name="savePath">/data</param>
<param name="maximumSize">52428800</param>
</인터셉터-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</액션>
대용량 파일을 업로드할 때 오류가 발생합니다. 2:
문제: 대용량 파일을 업로드할 때 오류가 발생했습니다...
해결책: 다음과 같이 struts.xml 파일의 매개변수를 수정하십시오. <constant name="struts.multipart.maxSize" value="55000000"/>
<액션 이름="업로드파일">
<result name="UploadFileResult">/www.VeVB.COm/ ShowOtherFiles.jsp</result>
<result name="JGBsuccess">/pages/JGBdetail.jsp</result>
<interceptor-ref name="fileUpload">
<param name="savePath">/data</param>
<param name="maximumSize">52428800</param>
</인터셉터-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</액션>
struts.xml 파일의 크기와 실제 파일 크기 사이의 관계: 1048576(바이트) = 1024*1024 = 실제 파일 크기 1M.
struts.multipart.maxSize는 전체 프로젝트에서 업로드되는 파일의 최대 크기를 제어합니다.
struts.multipart.maxSize 및 fileUpload 인터셉터의 maximumSize 속성은 서로 다른 작업 부문을 가지며, 이는 다음과 같이 요약됩니다.
1.struts.multipart.maxSize는 전체 프로젝트에서 업로드되는 파일의 최대 크기를 제어합니다. 이 크기를 초과하면 백그라운드에서 오류가 보고되고 프로그램은 이러한 큰 파일을 처리할 수 없습니다. fielderror에 다음 프롬프트가 표시됩니다.
크기(16272982)가 구성된 최대값(9000000)을 초과하여 요청이 거부되었습니다.
2. fileUpload 인터셉터의 maximumSize 속성은 struts.multipart.maxSize 값보다 작아야 합니다.
기본 struts.multipart.maxSize는 2M입니다. maximumSize가 2M보다 큰 경우 struts.multipart.maxSize의 값은 maximumSize보다 크게 설정되어야 합니다.
3. 업로드된 파일이 struts.multipart.maxSize보다 크면 시스템은 오류를 보고합니다. 업로드된 파일이 struts.multipart.maxSize와 maximumSize 사이에 있으면 시스템은 다음 메시지를 표시합니다.
파일이 너무 큼: 파일 "MSF Concept.ppt" "upload__5133e516_129ce85285f__7ffa_00000005.tmp" 6007104
업로드된 파일이 maximumSize보다 작으면 업로드가 성공한 것입니다.
업로드 파일 형식 제한
파일 업로드 인터셉터 구성
struts2의 defaultStack에는 이미 fileupload 인터셉터가 포함되어 있습니다. allowedTypes 매개변수를 추가하려면 새 defaultStack을 작성하고 복사한 후 수정해야 합니다.
다음과 같이 코드를 복사합니다: <interceptors>
<인터셉터 스택 이름="myDefaultStack">
<interceptor-ref name="예외"/>
<interceptor-ref name="alias"/>
<interceptor-ref name="servletConfig"/>
<인터셉터-ref name="i18n"/>
<인터셉터 참조 이름=www.VeVB.COm/>
<인터셉터-ref 이름="체인"/>
<interceptor-ref name="디버깅"/>
<interceptor-ref name="프로파일링"/>
<interceptor-ref name="scopedModelDriven"/>
<interceptor-ref name="modelDriven"/>
<interceptor-ref name="fileUpload">
<param name="allowedTypes">
이미지/png, 이미지/gif, 이미지/jpeg
</param>
</인터셉터-ref>
<인터셉터-ref 이름="체크박스"/>
<interceptor-ref name="staticParams"/>
<interceptor-ref name="actionMappingParams"/>
<인터셉터-ref 이름="params">
<param name="excludeParams">도조..*,^struts..*</param>
</인터셉터-ref>
<interceptor-ref name="conversionError"/>
<interceptor-ref name="검증">
<param name="excludeMethods">입력,뒤로,취소,탐색</param>
</인터셉터-ref>
<interceptor-ref name="워크플로">
<param name="excludeMethods">입력,뒤로,취소,탐색</param>
</인터셉터-ref>
</인터셉터-스택>
</인터셉터>
<default-interceptor-ref name="myDefaultStack"></default-interceptor-ref>
코드에서 복사한 코드만 다음과 같이 수정하세요. <interceptor-ref name="fileUpload">
<param name="allowedTypes">
이미지/png, 이미지/gif, 이미지/jpeg
</param>
</인터셉터-ref>
인터셉터 스택은 위와 같이 <package> 태그 내부와 <action> 태그 외부에 구성됩니다.
<action> 태그에 삽입하세요. 그렇지 않은 경우 인터셉터를 삽입해야 합니다. 코드는 다음과 같습니다.
<result name="input">/error/dbError.jsp</result>
<interceptor-ref name="myDefaultStack"></interceptor-ref>
</액션>
파일 업로드 유형 오류 작업은 입력을 직접 반환하므로 작업에서 "입력"을 반환할 필요가 없습니다.
<package> 태그 외부에서 업로드 요청의 경로와 크기를 정의할 수도 있습니다.
다음과 같이 코드를 복사합니다: <constant name="struts.multipart.saveDir" value="/upload/detailed"></constant>
<constant name="struts.multipart.maxSize" value="1024"></constant>
가장 중요한 점: 파일 업로드 양식에 enctype="multipart/form-data"를 추가해야 합니다. 그렇지 않으면 입력 오류가 보고됩니다.
이 글이 모든 사람의 Java 프로그래밍에 도움이 되기를 바랍니다.