走进Struts2(六)— 文件上传和下载

一、文件上传

实现文件上传的方式有很多种,比如Apache的Common-FileUpload,但是实现起来非常的繁琐,而Struts2来实现文件上传则简单的多,默认也是基于Common-FileUpload的方式。

1.使用Struts2来实现文件上传,需要使用Struts2预定义的fileUpload拦截器,defaultStack拦截器栈引用了fileUpload拦截器;最后,struts-default包又将defaultStack拦截器声明为自己的默认拦截器引用。使用defaultStack拦截器栈,也从而引用了fileUpload拦截器

JSP页面

<body>

	<s:fielderror></s:fielderror>

	<form action="upload.action" method="post" enctype="multipart/form-data">
		<input type="file" name="image"/><br>
		<input type="file" name="image"/><br>
		<input type="submit"><br>
	</form>
</body>

文件上传Action

public class FileUploadAction extends ActionSupport {

	private static final long serialVersionUID = 1L;

	private File[] image;
	private String[] imageFileName;
	private String[] imageContentType;

	// 注意必须是xxxFileName,xxxContentType,xxx就是File 对象的引用名

	@Override
	public String execute() throws Exception {

		String fileLocation = "D:\\mytemp";// 指定一个上传文件的存储位置
		for (int i = 0; i < image.length; i++) {
			// String fileName =
			// fileLocation+File.separatorChar+imageFileName[i];

			File destFile = new File(fileLocation, imageFileName[i]);
			FileUtils.copyFile(image[i], destFile);
			System.out.println("上传文件的名:" + imageFileName[i]);
			System.out.println("上传文件的类型:" + imageContentType[i]);
		}
		return SUCCESS;
	}

	public File[] getImage() {
		return image;
	}

	public void setImage(File[] image) {
		this.image = image;
	}

	public String[] getImageFileName() {
		return imageFileName;
	}

	public void setImageFileName(String[] imageFileName) {
		this.imageFileName = imageFileName;
	}

	public String[] getImageContentType() {
		return imageContentType;
	}

	public void setImageContentType(String[] imageContentType) {
		this.imageContentType = imageContentType;
	}

}

Struts.xml

<struts>

    <constant name="struts.enable.DynamicMethodInvocation" value="false" />
    <constant name="struts.devMode" value="true" />
	<constant name="struts.custom.i18n.resources" value="fileupload"></constant>
<!-- 限制上传文件的总大小 -->
	<constant name="struts.multipart.maxSize" value="10485760"></constant>
    <package name="default" namespace="/" extends="struts-default">

   		<action name="upload" class="cn.cil.action.FileUploadAction">

   			<interceptor-ref name="defaultStack">
   				<param name="fileUpload.allowedExtensions">
   					.jpeg,.gif,.bmp,.jpg,.png
   				</param>
   				<param name="fileUpload.maximumSize">2097152</param>
   			</interceptor-ref>
   			<result name="input">/failure.jsp</result>
   			<result>/success.jsp</result>
   			<result name="fail">/failure.jsp</result>
   		</action>

    </package>

注意:配置文件中类似于maximumSize、allowedExtensions的写法,需要根据 fileUpload 拦截器的setter/getter方法,而不是看属性名

在引用fileUpload拦截器的时候,可以指定三个参数(指定<param>子元素):

  • allowedTypes:指定允许上传的文件的类型,如果存在多种类型,以逗号隔开。注意:这里添的不是文件的扩展名,而是对应的ContentType,如果不知道某种文件的ContentType可以先上传一下试试,在后台输出ContentType来。
  • maximumSize:指定允许上传的文件的最大字节数。
  • allowedExtensions:指定允许上传的文件的扩展名。

错误消息配置

应用国际化,自定义错误提示消息

关于name的值可以在struts-core-2.3.15.3.jar中的struts-messages_xx.properties中找到

二、文件下载

使用Struts2来实现文件下载,会用到它的stream类型的Result,这种Result最终会返回一个InputStream,只需要让这个InputStream能读到用户想要下载的文件

struts.xml

    <package name="down" extends="struts-default">
    	<action name="download" class="cn.cil.action.FileDownAction" method="download" >
   			<result name="success" type="stream">
				<param name="inputName">inputStream</param>
				<param name="contentDisposition">attachment;filename=${fileName}</param>
				<param name="contentType">application/octet-stream</param>
			</result>
   		</action>
    </package>

</struts>

文件下载Action

public class FileDownAction extends ActionSupport {

	private InputStream inputStream;//定义一个输入流。名字不能为in

	private String fileName;

	public InputStream getInputStream() {
		return inputStream;
	}

	public void setInputStream(InputStream inputStream) {
		this.inputStream = inputStream;
	}

	public String getFileName() {
		return fileName;
	}

	public void setFileName(String fileName) {
		this.fileName = fileName;
	}

	public String download() throws Exception{
		//实现下载:给inputStream赋值
		String realPath = ServletActionContext.getServletContext().getRealPath("/六6.jpg");
		//解决中文乱码
		fileName = URLEncoder.encode(FilenameUtils.getName(realPath),"UTF-8");
		//System.out.println(fileName);
		inputStream = new FileInputStream(realPath);

		return SUCCESS;
	}

	public String download1()throws Exception{
		String realPath = "D:\\mytemp\\456.jpg";
		fileName = URLEncoder.encode(FilenameUtils.getName(realPath), "UTF-8");
		inputStream = new FileInputStream(realPath);

		return SUCCESS;
	}
}

当然比较坑的是文件名的中文乱码问题

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-09 10:07:16

走进Struts2(六)— 文件上传和下载的相关文章

struts2(六) 文件上传和下载

前面对文件下载提过一点点,这里正好要讲文件上传,就放在一起在说一遍. --WH 一.单文件上传 在没学struts2之前,我们要写文件上传,非常麻烦,需要手动一步步去获取表单中的各种属性,然后在进行相应的处理,而在struts2中就不需要了,因为有一个fileUpload拦截器帮我们全做完了.我们只需要添加一点点信息,就可以完成上传的功能. 1.Action中需要提供三个属性 File fieldName: //文件表单项名称,也就是上传控件所填写的name属性名 String fileCont

struts2实现文件上传和下载

在做B/S系统时,通常会涉及到上传文件和下载文件,在没接struts2框架之前,我们都是使用apache下面的commons子项目的FileUpload组件来进行文件的上传,但是那样做的话,代码看起来比较繁琐,而且不灵活,在学习了struts2后,struts2为文件上传下载提供了更好的实现机制,在这里我分别就单文件上传和多文件上传的源代码进行一下讲解,这里需要导入文件下载上传的两个jar文件,一个是commons-fileupload-1.2.2.jar,另一个是commons-io-2.0.

7、Struts2实现文件上传和下载

一.实现单个文件上传 1.创建如下web项目结构 2.在src下的com.action包下创建UploadAction.java 1 package com.action; 2 import java.io.File; 3 4 import javax.servlet.ServletContext; 5 6 import org.apache.commons.io.FileUtils; 7 import org.apache.struts2.ServletActionContext; 8 9 i

Struts2入门(七)——Struts2的文件上传和下载

一.前言 在之前的随笔之中,我们已经了解Java通过上传组件来实现上传和下载,这次我们来了解Struts2的上传和下载. 注意:文件上传时,我们需要将表单提交方式设置为"POST"方式,并且将enctype属性设置为"multipart/form-data",该属性的默认值为"application/x-www-form-urlencoded",就是说,表单要写成以下这种形式: <form action="" metho

Struts2 实现文件上传和下载

实现上传功能 1.首先你应该有一个上传页面 <!-- file的name属性与action中的File类型属性保持一致,用于封装File控件对应的文件内容 --> <s:file name="upload" label="选择文件"></s:file> 2.然后创建一个文件上传的XXXaction public class UploadAction extends ActionSupport implements ModelDri

struts2中的文件上传和下载

天下大事,必做于细.天下难事,必作于易. 曾经见过某些人,基础的知识还不扎实就去学习更难的事,这样必然在学习新的知识会很迷惑结果 再回来重新学习一下没有搞懂的知识,这必然会导致学习效率的下降!我写的这篇上传和下载都很基础. 十分适合初学者! jsp:页面 <!--在进行文件上传时,表单提交方式一定要是post的方式,因为文件上传时二进制文件可能会很大,还有就是enctype属性,这个属性一定要写成multipart/form-data, 不然就会以二进制文本上传到服务器端--> <for

Struts2文件上传与下载

一,页面 index.html 在页面中最重要的就是这个文件上传用的 form 表单,注意这里一定要把 form 的encyType属性明确标定为“multipart/form-data”,只有这样.表单才可能以二进制的形式上传到服务器. <form action = "<%=contextPath%>/file/uploadImage.action" encytype="multipart/form-data"> <input typ

Struts2学习总结——文件上传与下载

Struts2文件上传与下载 1.1.1新建一个Maven项目(demo02) 在此添加Web构面以及 struts2 构面 1.2.1配置Maven依赖(pom.xml 文件) <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20

Struts2学习(八)—文件上传和下载

在做B/S系统时,通常会涉及到上传文件和下载文件,在没接struts2框架之前,我们都是使用apache下面的commons子项目的FileUpload组件来进行文件的上传,但是那样做的话,代码看起来比较繁琐,而且不灵活,在学习了struts2后,struts2为文件上传下载提供了更好的实现机制,在这里我分别就单文件上传和多文件上传的实现进行一下讲解,这里 我们使用的struts2 web项目所导入的jar包中的**commons-fileupload-1.3.1.jar commons-io-

struts2 实现文件上传下载 (下载支持中文文件名)代码

struts2 实现文件上传: Action 代码: package com.action; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import org.apache.struts2.ServletActionContext; import com.o