struts2文件上传和下载

struts2文件上传

先在项目的WebContent下新建一个upload文件夹
单个文件上传
  • web.xml
<!-- struts2的前端控制器 -->
<filter>
	<filter-name>struts2</filter-name>
	<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
	<filter-name>struts2</filter-name>
	<url-pattern>*.action</url-pattern>
</filter-mapping>
  • 新建上传文件的jsp
说明
需要在表单中添加enctype="multipart/form-data"属性
<body>
	<form action="upload.action" method="post" enctype="multipart/form-data">
		文件:<input type="file" name="file"><br>
		<input type="submit" value="上传">
	</form>
</body>
  • 编写文件上传处理类
说明
File类型的属性名称命名规则:必须等于表单域名。
②上传文件名命名规则:表单域名+FileName(不可变)。
③上传文件类型命名规则:表单域名+ContentType
以上三个属性必须有get和set方法!!!
//默认上传文件大小不能大于2M
public class UploadAction {
	//该属性名要与表单名称一致
	private File file;
	//上传文件名,也是由struts2设置好
	//属性名=表单域名+FileName(不能改变)
	private String fileFileName;
	//文件类型,也是由struts2设置好
	//属性名=表单域名+ContentType
	private String fileContentType;
	
	//上传文件的业务方法
	public String upload() {
		//获取上传文件目录
		String path = ServletActionContext.getServletContext().getRealPath("/upload");
		//
		try {
			FileUtils.copyFile(file, new File(path, fileFileName));
			return Action.SUCCESS;
		} catch (IOException e) {
			e.printStackTrace();
		}
		return Action.ERROR;
	}
	public File getFile() {
		return file;
	}
	public void setFile(File file) {
		this.file = file;
	}
	public String getFileFileName() {
		return fileFileName;
	}
	public void setFileFileName(String fileFileName) {
		this.fileFileName = fileFileName;
	}
	public String getFileContentType() {
		return fileContentType;
	}
	public void setFileContentType(String fileContentType) {
		this.fileContentType = fileContentType;
	}
}
  • struts.xml
<struts>
	<package name="default" namespace="/" extends="struts-default">
		<action name="upload" class="com.x.action.UploadAction" method="upload">
			<result>/success.jsp</result>
			<result name="error">/error.jsp</result>
		</action>
	</package>
</struts>
说明
按照上面配置,文件上传的大小默认不能大于2M。如果文件上传的大小大于2M,则需要进行配置。配置方法如下:
①引入上传文件的拦截器:<interceptor-ref name="fileUpload"></interceptor-ref>
②设置其参数,对单个文件上传的大小进行修改:<param name="maximumSize">67388135</param>
③当自己引入拦截器后,默认拦截器不能自动生效,需要手动引用 :<interceptor-ref name="basicStack"></interceptor-ref>
④其次,可以设置上传文件总大小(必须大于等于单个文件大小): <constant name="struts.multipart.maxSize" value="67388135">
⑤还可以设置上传文件的临时目录,上传成功后会被删除合并:<constant name="struts.multipart.saveDir" value="E:\">
配置代码如下:
<struts>
	<!-- 设置上传文件的临时目录,上传成功后会被删除合并 -->
	<constant name="struts.multipart.saveDir" value="E:\"></constant>
	<!-- 设置上传文件总大小 -->
	<constant name="struts.multipart.maxSize" value="67388135"></constant>
	<package name="default" namespace="/" extends="struts-default">
		<action name="upload" class="com.x.action.UploadAction" method="upload">
			<result>/success.jsp</result>
			<result name="error">/error.jsp</result>
			<interceptor-ref name="fileUpload">
				<!-- 设置上传单个文件的大小 -->
				<param name="maximumSize">67388135</param>
			</interceptor-ref>
			<!-- 注意,当自己引入拦截器后,默认拦截器不能自动生效,需要手动引用 -->
			<interceptor-ref name="basicStack"></interceptor-ref>
		</action>
	</package>
</struts>
批量上传文件
  • jsp页面
<body>
	<form action="batchUpload.action" method="post" enctype="multipart/form-data">
		文件1:<input type="file" name="file"><br>
		文件2:<input type="file" name="file"><br>
		文件2:<input type="file" name="file"><br>
		<input type="submit" value="上传">
	</form>
</body>
  • 文件上传处理类
说明
只是把对应单个文件上传三个属性设置为数组形式,在保存文件时永for循环即可。
public class BatchUploadAction {
	//该属性名要与表单名称一致
	private File file[];
	//上传文件名,也是由struts2设置好
	//属性名=表单域名+FileName(不能改变)
	private String fileFileName[];
	//文件类型,也是由struts2设置好
	//属性名=表单域名+ContentType
	private String fileContentType[];
	
	//上传文件的业务方法
	public String upload() {
		//获取上传文件目录
		String path = ServletActionContext.getServletContext().getRealPath("/upload");
		try {
			for(int i = 0; i < file.length; i++) {
				FileUtils.copyFile(file[i], new File(path, fileFileName[i]));
			}
			return Action.SUCCESS;
		} catch (IOException e) {
			e.printStackTrace();
		}
		return Action.ERROR;
	}

	public File[] getFile() {
		return file;
	}

	public void setFile(File[] file) {
		this.file = file;
	}

	public String[] getFileFileName() {
		return fileFileName;
	}

	public void setFileFileName(String[] fileFileName) {
		this.fileFileName = fileFileName;
	}

	public String[] getFileContentType() {
		return fileContentType;
	}

	public void setFileContentType(String[] fileContentType) {
		this.fileContentType = fileContentType;
	}
}
  • struts.xml
<struts>
	<!-- 设置上传文件的临时目录,上传成功后会被删除合并 -->
	<constant name="struts.multipart.saveDir" value="E:\"></constant>
	<!-- 设置上传文件总大小 -->
	<constant name="struts.multipart.maxSize" value="67388135"></constant>
	<package name="default" namespace="/" extends="struts-default">
		<action name="batchUpload" class="com.x.action.BatchUploadAction" method="upload">
			<result>/success.jsp</result>
			<result name="error">/error.jsp</result>
			<interceptor-ref name="fileUpload">
				<!-- 设置上传单个文件的大小 -->
				<param name="maximumSize">67388135</param>
			</interceptor-ref>
			<!-- 注意,当自己引入拦截器后,默认拦截器不能自动生效,需要手动引用 -->
			<interceptor-ref name="basicStack"></interceptor-ref>
		</action>
	</package>
</struts>
  • web.xml
<!-- struts2的前端控制器 -->
<filter>
	<filter-name>struts2</filter-name>
	<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
	<filter-name>struts2</filter-name>
	<url-pattern>*.action</url-pattern>
</filter-mapping>


struts2文件下载

先在WebContent目录下新建download文件夹,放入将要下载的文件
文件下载

首先注意,对于文件下载,可以使用<a></a>标签,直接给出文件路径进行下载。但是,对于浏览器来说,默认使用inline方式下载文件,即如果可以解析,则将内容显示出来,如txt类型文件,而且任何用户得到链接都可以下载,没法进行权限的控制,导致不安全;如果不能解析,才进行下载。因此,需要使用流的方式进行文件下载。

  • 例如
<!-- 显示 -->
<a href="download/a.txt">下载文件</a>
<!-- 下载 -->
<a href="download/a.rar">下载文件</a>
struts2文件下载步骤
  • web.xml
<!-- struts2的前端控制器 -->
<filter>
	<filter-name>struts2</filter-name>
	<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
	<filter-name>struts2</filter-name>
	<url-pattern>*.action</url-pattern>
</filter-mapping>
  • jsp页面
<body>
	<a href="download.action?fileName=a.txt">下载文件</a>
</body>
  • 文件下载处理类
public class DownloadAction {
	//下载文件名
	private String fileName;
	public String download() {
		//可以进行权限设置
		return Action.SUCCESS;
	}
	//要注意这个方法名,可以关联源码看一下,InputName默认为inputstream
	public InputStream getInputStream() throws FileNotFoundException {
		String path = ServletActionContext.getServletContext().getRealPath("/download");
		return new FileInputStream(new File(path, fileName));
	}

	public String getFileName() {
		return fileName;
	}

	public void setFileName(String fileName) {
		this.fileName = fileName;
	}
	
}
  • struts.xml
说明
<result type="stream">代表返回值为流类行,关系到处理类中的public InputStream getInputStream()方法。
对于①可以关联<result-type name="stream" class="org.apache.struts2.result.StreamResult"/>该类的源码进行查看。
②需要配置文件下载时的名称及下载方式:<param name="contentDisposition">attachment;filename=${fileName}</param>。此外还可以设置文件下载类型等
<struts>
	<package name="default" namespace="/" extends="struts-default">
		<action name="download" class="com.x.action.DownloadAction" method="download">
			<!-- 文件下载结果集 -->
			<result type="stream">
				<!-- 默认为inline,需要修改为attachment -->
				<param name="contentDisposition">attachment;filename=${fileName}</param>
			</result>
		</action>
	</package>
</struts>
重点:关于文件下载类型的响应头,如果使用tomcat,可以在web.xml中查看!!!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值