struts2 파일 업로드 및 다운로드에 대한 자세한 설명

파일 업로드
양식
파일 업로드 양식 요구 사항

  1. 양식 제출 방법은 POST 여야합니다.
  2. 다음과 같은 형식의 양식 요소가 있어야합니다. 또는 struts2 레이블 <s : file label =“xxx”name =“xxx”/>
  3. 양식의 enctype 속성은 multipart / form-data 여야합니다. 양식의 enctype 속성에 대한
    세 가지 값 표현 및 의미가 여기에 제공됩니다.
    (1) 기본값 인 application / x-www-form-urlencoded, 양식 필드 만 처리 할 수 ​​있습니다. 이 인코딩 방법을 사용하는 양식 인 value 속성은 양식 필드의 값을 URL 인코딩 방법으로 처리합니다.
    (2) Multipart / form-data,이 인코딩 방법을 사용하면 이진 스트림에서 양식 데이터를 처리합니다.이 인코딩 방법은 또한 파일 도메인에서 지정한 파일의 내용을 요청 매개 변수로 캡슐화합니다.
    (3) Text / plain이 인코딩 방법은 양식의 action 속성이 mailto : URL 일 때 더 편리하며 주로 양식을 통해 직접 메일을 보내는 데 적합합니다.

1. JSP 코드
렌더링 양식 예
여기에 사진 설명 삽입
:

<font color="red"><s:actionerror/></font>
<form action="${pageContext.request.contextPath}/UserAction_login"  "return check(this);" method="post" enctype="multipart/form-data">
	<table align="center" border="1">
		<tr>
			<td bgcolor="#bbbbbb">用户名:</td>
			<td><input type="text" name="id"/></td>
		</tr>
		<tr>
			<td bgcolor="#bbbbbb">密&nbsp;&nbsp;&nbsp;&nbsp;码:</td>
			<td><input type="password" name="pwd"/></td>
		</tr>
		<tr>
			<td bgcolor="#bbbbbb">照&nbsp;&nbsp;&nbsp;&nbsp;片:</td>
			<td><input type="file" name="photo"/></td>
		</tr>
		<tr>
			<td colspan="2" align="center"><input type="submit"  value="登录">&nbsp;&nbsp;<input type="reset" value="重置"></td>
		</tr>
		</table>
	</form>

struts2 태그를 사용하는 경우 struts2 태그 라이브러리를 도입해야합니다.

<%@ taglib prefix="s" uri="/struts-tags"%>

2. 액션 코드

package com.action;


import java.io.File;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.valueBean.User;

public class UserAction extends ActionSupport{
	//封装除了文件的其他信息
	private String id;
	private String pwd;
	
	//封装上传的文件对象
	private File photo;
	//上传的文件类型   固定格式xxxContentType
	private String photoContentType;
	//上传的文件名   固定格式xxxFileName
	private String photoFileName;

	//生成唯一的文件名(该方法在上传的文件名不重复时可以不需要)
	private String uniqueFileName(String FileName) {
	
		//通过时间获得唯一的字符串(不修改日期时间情况下唯一)
		DateFormat format = new SimpleDateFormat("yyMMddHHmmss");
		String formatDate = format.format(new Date());
		
		//获得.最后出现的位置,分割文件名和后缀名
		int position = photoFileName.lastIndexOf(".");
		String extension = photoFileName.substring(position);
		
		return formatDate + extension;
	}
	
	//处理请求的方法
	public String login() throws Exception {
		//判断登录信息(为了方便理解,这里使用固定的用户名密码判断)
		if(id.equals("admin") && pwd.equals("123456")) {	
			ActionContext.getContext().getSession().put("id","admin");
			/*
			 *获得存放的绝对路径(注意,如果存放在项目的文件夹下服务器重启会消失,
			 * 若要永久保存,可放至固定目录如:String realPath = "c:/images";)
			*/
			String realPath = ServletActionContext.getServletContext().getRealPath("/photo");
			//自动生成唯一的文件名(若文件名不重复时可使用一下注释的代码并不需要编写 uniqueFileName方法)
			String realFileName = uniqueFileName(photoFileName);
			File real = new File(realPath,realFileName);
			//不重复时代码
			/*
			File real = new File(realPath,photoFileName);
			*/
			
			//判断路径是否存在,不存在的话自动创建
			if(photo != null)
				if(!real.getParentFile().exists())
					real.getParentFile().mkdirs();
					
			//拷贝photo文件内容到real
			FileUtils.copyFile(photo, real);
			
			return "loginSuccess";
			}
		else {
			ActionContext.getContext().put("error", "用户名或密码错误!");
			return "loginLose";
		}	
	}
	
	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getPwd() {
		return pwd;
	}

	public void setPwd(String pwd) {
		this.pwd = pwd;
	}

	public File getPhoto() {
		return photo;
	}
	public void setPhoto(File photo) {
		this.photo = photo;
	}
	public String getPhotoContentType() {
		return photoContentType;
	}
	public void setPhotoContentType(String photoContentType) {
		this.photoContentType = photoContentType;
	}
	public String getPhotoFileName() {
		return photoFileName;
	}
	public void setPhotoFileName(String photoFileName) {
		this.photoFileName = photoFileName;
	}
}

3. 구성 파일 struts.xml 정보

<struts>
	<package name="login" namespace="/" extends="struts-default">
			<action name="UserAction_*" class="com.action.UserAction" method="{1}">
				<result name="loginSuccess">/welcome.jsp</result>
				<result name="loginLose" >/login.jsp</result>
				<!-- 错误信息返回页面  -->
				<result name="input">/{1}.jsp</result>
			</action>
		</package>
	</struts>

4. 허용되는 파일 형식 (접미사 이름) 및 최대 파일 크기를 설정합니다.

<struts>
	<!-- 设置最大允许上传的文件大小(字节),默认2M
	<constant name="struts.multipart.maxSize" value="20480000"></constant>
	  -->
	<package name="login" namespace="/" extends="struts-default">
			<action name="UserAction_*" class="com.action.UserAction" method="{1}">
			<interceptor-ref name="defaultStack">
				<!-- 设置允许上传的文件类型(允许使用通配符) -->
				<param name="fileUpload.allowedTypes">image/*</param>
				
				<!-- 设置允许上传的文件后缀名
				<param name="fileUpload.allowedExtensions">.jpg,.png</param>
				 -->
			</interceptor-ref>
				<result name="loginSuccess">/welcome.jsp</result>
				<result name="loginLose" >/login.jsp</result>
				<!-- 错误信息返回页面  -->
				<result name="input">/{1}.jsp</result>
			</action>
		</package>
	</struts>

구성 후에 오류를 표시해야합니다. 이동하는 페이지에 표시하려면 <s : actionerror> </ s : actionerror>를 사용해야합니다.

5. 설정 오류 중국어 디스플레이
친숙한 분할 오류 프롬프트
여기에 사진 설명 삽입
, 오류 번호
0 : 필드 이름
1. 파일 이름
2. 임시 파일 이름
3. 파일 유형

기본 오류 메시지 프롬프트 위치는 struts2-core.jar \ org.apache.struts2 \ struts-message.properties입니다.
여기에 사진 설명 삽입
도면은 여러 국가의 기본 오류 메시지 입니다 (중국어 없음).

struts-messages_en.properties를 확장하는 예를 들어보십시오.
오류 메시지가 값 키로 구성되어 있음을 알 수 있습니다
여기에 사진 설명 삽입
. 그림의 세 줄의 코드가 더 일반적으로 사용되는 오류 표시입니다.
31. 파일이 최대 값 인
32를 초과합니다 . 파일 형식은 제출할 수 없습니다.
33. 파일 확장자는 그렇지 않습니다.
{0}, {1}, {2}, {3}이 이전 오류 메시지 다이어그램의 오류 시퀀스 번호에 해당하는 경우 제출할 수 있는 접미어

이해 후, 우리는 SRC에 (또는 SRC 패키지 아래)를 UserUpload.properties (xxx.properties) 파일을 만든 다음 우리는 사용자 지정 오류 메시지 (시스템 16 진수로 입력 중국어를 변환합니다)를 작성하는 기본 정보를 모방 할 수 있습니다
예를 함유량

struts.messages.error.content.type.not.allowed="{1}"\u4E0D\u662F\u56FE\u7247\u7C7B\u578B
struts.messages.error.file.extension.not.allowed="{1}"\u540E\u7F00\u540D\u4E0D\u6EE1\u8DB3\u683C\u5F0F

국제화를 적용하려면 struts.xml에서 구성해야합니다.
추가 후 struts.xml의 코드는 다음과 같습니다.

<struts>
	<!-- 配置国际化 -->
	<constant name="struts.custom.i18n.resources" value="UserUpload"></constant>
	<!-- 设置最大允许上传的文件大小(字节),默认2M
	<constant name="struts.multipart.maxSize" value="20480000"></constant>
	  -->
	<package name="login" namespace="/" extends="struts-default">
			<action name="UserAction_*" class="com.action.UserAction" method="{1}">
			<interceptor-ref name="defaultStack">
				<!-- 设置允许上传的文件类型(允许使用通配符) -->
				<param name="fileUpload.allowedTypes">image/*</param>
				
				<!-- 设置允许上传的文件后缀名
				<param name="fileUpload.allowedExtensions">.jpg,.png</param>
				 -->
			</interceptor-ref>
				<result name="loginSuccess">/welcome.jsp</result>
				<result name="loginLose" >/login.jsp</result>
				<!-- 错误信息返回页面  -->
				<result name="input">/{1}.jsp</result>
			</action>
		</package>
	</struts>

데모 사진
여기에 사진 설명 삽입

6. 다중 파일 업로드 (여기에 단계가 제공되며 자세한 소개는 없음)
1. 다중 파일 업로드는 JSP <s : file label = "xxx"name = "xxx"/에서 다중 파일 업로드 요소 또는 struts2 태그를 설정하기 만하면됩니다. >
2. 액션 코드에서 수신 된 파일의 3 개 필드가 모두 배열 유형으로 변경됨 (get 및 set 메소드 재 주입)
3. 로직의 일부가 처리됨

파일 다운로드 (여기에서는 동적 다운로드를 사용합니다. 정적을 사용하는 경우 fileName을 고정 값으로 바꿉니다.)
파일 업로드에 비해 파일 다운로드가 훨씬 간단합니다 (개인적으로 생각).
파일 다운로드는 실제로 결과 유형입니다. (스트림)
JSP 코드

	<s:form action="UserAction_download">
	<s:textfield label="输入下载的文件名(含后缀名)" name="fileName"/>
	<s:submit value="下载"></s:submit>
	</s:form>

액션 코드

package com.action;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport{
	//提供输入流,需要get方法,set文件下载时方法可有可无
	private InputStream inputStream;
	private String fileName;
	public String download() throws FileNotFoundException, UnsupportedEncodingException {
		//将文件转为输入流
		String path = "H:/JAVAEE/images/" + fileName;
		inputStream = new FileInputStream(path);
		
		//由于重新转到网页,所以文件名含中文时需要行url转码
		fileName = URLEncoder.encode(fileName,"UTF-8");
		return "download";
	}
	public String getFileName() {
		return fileName;
	}
	public void setFileName(String fileName) {
		this.fileName = fileName;
	}
	public InputStream getInputStream() {
		return inputStream;
	}
}

struts.xml 코드

<struts>
	<package name="login" namespace="/" extends="struts-default">
		<action name="UserAction_*" class="com.action.UserAction" method="{1}">
					<result name="download" type="stream">
						<!-- 配置输出流 -->
						<param name="inputName">inputStream</param>
						<!-- 设置响应头消息,使浏览器以下载方式打开 固定格式:attachment;filename=xxx  -->
						<param name="contentDisposition">attachment;filename=${fileName}</param>
						<!-- 设置响应头消息,告诉浏览器响应正文的MIME类型  固定格式:application/octet-stream -->
						<param name="contentType">application/octet-stream</param>
					</result>
		</action>
	</package>
</struts>

데모 사진
여기에 사진 설명 삽입

추천

출처blog.csdn.net/qq_42301302/article/details/88915822