使用Struts2实现文件的上传和下载
2017-09-24 17:32
686 查看
在当今的互联网上,文件的上传和下载已经非常普遍的,今天我就学习了如何使用Struts2实现文件的上传和下载。
首先我们来做一些准备工作,我用到了下面这几个包
然后配置好核心控制器
web.xml主要代码
application/x-www-form-urlencoded:默认的编码方式,它只处理表单域里的value属性,采用这种编码方式的表单会将表单域的值处理成URL编码方式。这种方式按IOS-8859-1的编码方式将表单上传到服务器,但是这种方式是上传不了文件的。
multipart/form-data:这种编码会以二进制流的方式来处理表单数据,这种编码方式会把文件域指定文件的内容也封装到请求参数里,进行文件上上传时采用这种方式。
text/plain:这种编码方式当表单的action属性为mailto:URL的形式时比较方便,这种方式主要用于直接通过表单发送邮件的方式(这种方式已经不再采用)。
注意:如果采用了第二种编码方式,就无法通过HttpServletRequest对象的getParameter()方法获取请求参数值。
新建一个JSP页面fileUpload.jsp进行文件上传,主要代码如下:
新建FileUploadAction类,代码如下:
新建上传成功JSP页面uploadResult.jsp以及失败的页面failure.jsp。
uploadResult.jsp
failure.jsp
struts.xml
注意:这个用到了上传拦截器,限制了上传文件的大小和类型, < result name=”input” > /failure.jsp < /result > 这一句话表示上传文件不符合条件的时候会返回input视图,也就是跳转到失败页面,如果上传失败但是没有成功跳转到失败页面,则是因为struts2和tomcat的兼容性问题,只需要修改tomcat下的conf文件里的server.xml文件,修改内容如下:
最后一句就是我自己加上去的,这样上传文件不符条件被拦截后就会成功跳转到失败页面。还有就是必须要事先在本项目的发布目录中新建一个“upload”文件夹,作为上传目录,像我就是在tomcat里面的这个项目下新建了“upload”文件夹。
下面是结果显示:
访问http://localhost:8080/MyWeb/fileUpload.jsp
先上传一个符合条件的:
结果:
失败的结果:
配置stream类型的结果,需要指定如下属性:
contentType:指定下载文件的文件类型,这里的文件类型与因特网MIME中的规定类型要一致。例如text/plain代表纯文本。
inputName:指定下载文件的输入流入口,在Action中需要指定该输入流的入口。
contentDisposition:指定文件下载的处理方式,有内联(Inline,直接显示文件)和附件(Attachment,弹出文件保存对话框)两种方式,默认为内联。
新建一个文件下载的JSP页面download.jsp,主要代码如下:
新建一个DownloadAction类用来处理文件下载,代码如下:
配置struts.xml
还有就是要事先在upload的文件夹里添加需要下载的文件,这样下载功能就做好了。
首先我们来做一些准备工作,我用到了下面这几个包
然后配置好核心控制器
web.xml主要代码
<filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
文件上传
使用struts2进行文件上传时,要将form表单的enctype属性进行重新设置,该属性决定了表单数据的编码方式,一般有三个属性值:application/x-www-form-urlencoded:默认的编码方式,它只处理表单域里的value属性,采用这种编码方式的表单会将表单域的值处理成URL编码方式。这种方式按IOS-8859-1的编码方式将表单上传到服务器,但是这种方式是上传不了文件的。
multipart/form-data:这种编码会以二进制流的方式来处理表单数据,这种编码方式会把文件域指定文件的内容也封装到请求参数里,进行文件上上传时采用这种方式。
text/plain:这种编码方式当表单的action属性为mailto:URL的形式时比较方便,这种方式主要用于直接通过表单发送邮件的方式(这种方式已经不再采用)。
注意:如果采用了第二种编码方式,就无法通过HttpServletRequest对象的getParameter()方法获取请求参数值。
新建一个JSP页面fileUpload.jsp进行文件上传,主要代码如下:
<body> <h2>文件上传</h2> <form action="fileUpload" enctype="multipart/form-data" method="post"> <input type="file" name="uploadFile"> <input type="submit" value="上传"> </form> </body>
新建FileUploadAction类,代码如下:
package 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.opensymphony.xwork2.ActionSupport; public class FileUploadAction extends ActionSupport { private File uploadFile; // 上传的文件 private String uploadFileContentType; // 文件类型 private String uploadFileFileName; // 文件名字 public File getUploadFile() { return uploadFile; } public void setUploadFile(File uploadFile) { this.uploadFile = uploadFile; } public String getUploadFileContentType() { return uploadFileContentType; } public void setUploadFileContentType(String uploadFileContentType) { this.uploadFileContentType = uploadFileContentType; } public String getUploadFileFileName() { return uploadFileFileName; } public void setUploadFileFileName(String uploadFileFileName) { this.uploadFileFileName = uploadFileFileName; } @Override public String execute() throws Exception { // TODO Auto-generated method stub InputStream is = new FileInputStream(uploadFile); // 输入流 String uploadPath = ServletActionContext.getServletContext() .getRealPath("/upload"); // 上传文件目录 OutputStream os = new FileOutputStream(new File(uploadPath, uploadFileFileName)); // 输出流 byte[] buffer = new byte[1024];// 设置缓存 int length = 0; // 读取uploadFile文件输出到toFile文件中 while ((length = is.read(buffer)) > 0) { os.write(buffer, 0, length); } is.close(); // 关闭输入流 os.close(); // 关闭输出流 return SUCCESS; } }
新建上传成功JSP页面uploadResult.jsp以及失败的页面failure.jsp。
uploadResult.jsp
<body> 上传文件名:${uploadFileFileName }<br/> 上传文件类型:${uploadFileContentType }<br/> </body>
failure.jsp
<body> 上传失败 </body>
struts.xml
<constant name="struts.i18n.encoding" value="UTF-8"></constant> <package name="upload" extends="struts-default" namespace="/"> <action name="fileUpload" class="action.FileUploadAction"> <!-- 配置文件上传拦截器,用于限定上传文件的大小和类型 --> <interceptor-ref name="fileUpload"> <!-- 允许上传的文件的类型 --> <param name="allowedType"> image/bmp,image/pjpeg,image/png </param> <!-- 允许上传的文件的大小 --> <param name="maximumSize">8192000</param> </interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> <result name="success">/uploadResult.jsp</result> <result name="input">/failure.jsp</result> </action> </package>
注意:这个用到了上传拦截器,限制了上传文件的大小和类型, < result name=”input” > /failure.jsp < /result > 这一句话表示上传文件不符合条件的时候会返回input视图,也就是跳转到失败页面,如果上传失败但是没有成功跳转到失败页面,则是因为struts2和tomcat的兼容性问题,只需要修改tomcat下的conf文件里的server.xml文件,修改内容如下:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" maxSwallowSize="-1" />
最后一句就是我自己加上去的,这样上传文件不符条件被拦截后就会成功跳转到失败页面。还有就是必须要事先在本项目的发布目录中新建一个“upload”文件夹,作为上传目录,像我就是在tomcat里面的这个项目下新建了“upload”文件夹。
下面是结果显示:
访问http://localhost:8080/MyWeb/fileUpload.jsp
先上传一个符合条件的:
结果:
失败的结果:
文件下载
使用struts2框架来控制文件的下载,挂件要为Action的返回值stream类型配置结果配置,当指定stream结果类型时,要指定一个inputName参数,该参数指定了被下载文件的入口,即一个输入流。配置stream类型的结果,需要指定如下属性:
contentType:指定下载文件的文件类型,这里的文件类型与因特网MIME中的规定类型要一致。例如text/plain代表纯文本。
inputName:指定下载文件的输入流入口,在Action中需要指定该输入流的入口。
contentDisposition:指定文件下载的处理方式,有内联(Inline,直接显示文件)和附件(Attachment,弹出文件保存对话框)两种方式,默认为内联。
新建一个文件下载的JSP页面download.jsp,主要代码如下:
<body> <h2>下载文件</h2> <a href="download">例子</a> </body>
新建一个DownloadAction类用来处理文件下载,代码如下:
package action; import java.io.InputStream; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; public class DownloadAction extends ActionSupport { public InputStream getDownloadFile() throws Exception { return ServletActionContext.getServletContext().getResourceAsStream( "/upload/1.txt"); } @Override public String execute() throws Exception { // TODO Auto-generated method stub return super.execute(); } }
配置struts.xml
<package name="Down" extends="struts-default" namespace="/"> <action name="download" class="action.DownloadAction"> <result name="success" type="stream"> <param name="contentType">text/plain</param> <param name="contentDisposition"> attachment:filename=""1.text; </param> <param name="inputName">downloadFile</param> </result> </action> </package>
还有就是要事先在upload的文件夹里添加需要下载的文件,这样下载功能就做好了。
相关文章推荐
- Struts2使用注解实现文件的上传与下载(二)
- 使用Struts2简单的基本文件上传下载实现
- 使用Struts2实现文件的上传与动态下载(1)
- 使用Struts2实现文件的上传与动态下载
- 使用Struts2实现简单的文件上传和下载
- Struts2(三)使用Struts2实现文件的上传和下载
- Struts2使用注解实现文件的上传与下载(一)
- Struts2(三)使用Struts2实现文件的上传和下载
- 使用Struts2实现文件的上传和下载
- Struts2使用注解实现文件的上传与下载(二)
- 使用Struts2实现文件的上传与动态下载(2)
- Struts2(多)文件上传和下载使用示例
- Openssh服务器的搭建,并使用PSFTP实现文件自动上传,下载的script命令
- 使用PuTTy实现本地文件上传下载
- Struts2下使用Common-FileUpload实现文件上传
- 用Struts2更好的实现文件的上传、下载功能以及解决中文名称问题
- ASP.NET上传下载文件示例,使用webClient实现
- Struts2中使用Common-FileUpload实现文件上传
- Flex与.NET互操作(五):使用FileReference+HttpHandler实现文件上传/下载
- flex使用filereference+httphandler实现文件上传/下载(转)