第八章:struts2文件上传下载
struts文件上传

然后在struts.xml文件中加一句话
<constant name="struts.custom.i18n.resources" value="fileuploadmessages"/>
该属源文件,则多个资源文件的文件名以英文逗号(,)隔开。
配置文件代码
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "/dtds/struts-2.3.dtd"> <struts> <constant name="struts.i18n.encoding" value="gbk"/> <package name="fileupload" extends="struts-default" namespace="/"> <action name="fileupload" class="org.myfileupload.action.FileUpLoadAction" > <param name="savePath">/upload</param> <result name="success">/success.jsp</result> </action> </package> </struts> 配置上传文件的保存路
Struts2上传下载

Struts2上传下载
1
struts2并没有定义自己的文件解析器,而是采用 了其他的开源组件 支持三种文件上传组件
如果要使用其他两种,必须将对应的库文件导入工 程,并修改Struts2的default.properties文件 丌管使用哪一种方式上传,代码没有区别 通过FileUploadInterceptor截拦器完成
文件
public class FileuploadAction extends ActionSupport { private String desc; private File file1; private String file1FileName; private String savePath = "G:" +
文件过滤
9
文件大小先后经过两重验证
◦ struts.properties(默认2M左右)
struts.multipart.maxSize=91344570
◦ <param name="maximumSize">5485760</param>
注意
10
在classpath下创建testmessages_zh_CN.properties文 件,输入下面内容
文件下载
13
下载代码
14
Struts2的文件下载Action不普通的Action并没 有太大的丌同,仅仅是该Action需要提供一个返 回InputStream流的方法,该输入流代表了被下 载的文件的入口。
Struts2 结合HttpClient 实现远程服务器文件下载

Struts2 结合HttpClient 实现远程服务器文件下载1、只实现远程文件下载未处理远程服务器连接失败的状态1.1、页面配置部分<button id="download" class="button" onclick="window.location.href = 'downlo adExample.action';return false;">下载模板</button><s:submit id="importButton" value="上传文件" theme="simple" cssClass="butto n"></s:submit><s:reset value="重置路径" theme="simple" cssClass="button" ></s:reset> 1.2、Struts2配置文件部分<!--下载模板--><action name="downloadExample" class="com.web.action.file.ImportAction "><param name="downFileName">文件下载.xls</param><result name="success" type="stream"><param name="contentType">application/vnd.ms-excel</param><param name="contentDisposition">attachment;filename="${downl oadName}"</param><param name="inputName">downloadFile</param><param name="bufferSize">4096</param></result></action>1.3、Action层中获取远程服务器文件流程序部分public class ImportAction{private String downFileName;private String downloadName;IFileServicefileService;/*** @paramfileService the fileService to set*/public void setEztFileService(IFileServicefileService) {this.fileService = fileService;}/*** @return the downFileName*/public String getDownFileName() {return downFileName;}/*** @paramdownFileName the downFileName to set*/public void setDownFileName(String downFileName) {this.downFileName = downFileName;}/*** @return the downloadName*/public String getDownloadName() {return downloadName;}/*** @paramdownloadName the downloadName to set*/public void setDownloadName(String downloadName) {this.downloadName = downloadName;}public InputStreamgetDownloadFile(){downloadName = fileService.getDownloadFileName(downFileName); //下载文件显示名称转编码Properties properties = ResourceUtil.getProperties("file.properties");//取得远程服务器信息配置属性文件file.properties文件为自定义文件放置在web项目src/conf文件夹下String strRemoteFileUrl = properties.getProperty("serverPath")+ propertie s.getProperty("templateName"); //取得远程文件路径InputStream in = fileService.getDownloadFile(strRemoteFileUrl); //调用S ervice层方法取得远程服务器文件流return in;}}1.4、Service层接口实现public class FileService implements IFileService {public String getDownloadFileName(String downFileName) { //解决下载文件名称中文乱码问题try {downFileName = new String(downFileName.getBytes(), "ISO-8859-1 ");} catch (UnsupportedEncodingException e) {e.printStackTrace();}return downFileName;}publicInputStreamgetDownloadFile(String strRemoteFileUrl) {// TODO Auto-generated method stubHttpClient client = new HttpClient();GetMethodhttpGet = new GetMethod(strRemoteFileUrl);InputStream in = null;try {intintResponseCode = client.executeMethod(httpGet);in = httpGet.getResponseBodyAsStream();} catch (HttpException e) {// TODO Auto-generated catch block//记录日志} catch (IOException e) {// TODO Auto-generated catch block//记录日志}return in;}}1.5、读取properties文件工具类部分public class ResourceUtil {public static Properties getProperties(String fileName) {try {Properties properties = new Properties();ClassLoader cl = Thread.currentThread().getContextClassLoader();properties.load(cl.getResourceAsStream(fileName));return properties;} catch (Exception ex) {ex.printStackTrace();}return null;}}1.6、总结:此项实现,在文件服务器运行正常的情况下文件下载正常,如果文件服务器运行异常或已停止运行则在jsp页面部分将会抛出异常。
第八章struts2文件上传下载精品PPT课件

IBM Software Group
两个上传框架
CommoInBM-的Sof开twar源e G项roup目,由jakarta项目组开发 。
功能强大,简单易用,可以实现一次上传一个或 多个文件,并可限制文件大小。
COS:O‘Reilly公司开发的开源框架
会不定期的增加一些新功能。
IBM Software Group
</form>
或者
<%@ taglib uri="/struts-tags" prefix="s" %>
IBM Software Group
上传Action类UploadAction
IBM Software Group
IBM Software Group
上传Action类UploadAction
IBM Software Group
Struts2对文件下载的支持
Struts2通IBM过Software Group org.apache.struts2.dispatcher.StreamResult 结果类型来支持文件下载,使得原本编写就简 单的下载程序变得更加简单了。
使用数组同时上传多个文件
IBM Software Group
IBM Software Group
使用list同时上传多个文件
IBM Software Group
IBM Software Group
使用list同时上传多个文件
IBM Software Group
IBM Software Group
IBM Software Group
使用数组同时上传多个文件
IBM Software Group
struts上传和下载

struts上传和下载<?xml version="1.0" encoding="UTF-8"?><web-app version="2.4"xmlns=""xmlns:xsi=""xsi:schemaLocation="/web-app_2_4.xsd"><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list><filter><filter-name > struts2 </filter-name ><filter-class >org.apache.struts2.dispatcher.FilterDispatcher</filter-class ></filter ><filter-mapping><filter-name >struts2 </filter-name ><url-pattern > /* </url-pattern ></filter-mapping ></web-app>2》。
struts.xml文件:<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"""><struts><constant name="struts.il8n.encoding" value="GBK" /><constant name="struts.multipart.maxSize" value="102400000000" /><!-- 文件上传 --><constant name="struts.custom.i18n.resources" value="ApplicationResources" /><!-- 利用struts.multipart.saveDirg属性来改变临时文件存放的目录--><constant name="struts.multipart.saveDirg" value="e:\\temp" /><package name="default" extends="struts-default"><!-- 自定义下载时用拦截器 --><interceptors><interceptor name="download"class="org.sunxin.struts2.action.FileDownloadInterceptor" /> </interceptors><action name="upload" class="org.sunxin.struts2.action.FileUploadAction"><interceptor-ref name="defaultStack"><!-- 设置上传文件的大小及类型 --><!-- <param name="fileUpload.maximumSize">10240000</param>--> <param name="fileUpload.allowedTypes"> image/gif,image/jpg,image/bmp</param></interceptor-ref><result name="input">/upload.jsp</result><result name="success">/success.jsp</result><param name="uploadDir">/WEB-INF/UploadFiles</param> </action><!-- 文件下载 1--><action name="download" class="org.sunxin.struts2.action.FileDownloadAction"> <!-- 指定下载文件的路径,该路径相对于web应用程序所在的目录 --><param name="inputPath1">/WEB-INF/UploadFiles/65_Fetch_2.avi</param><param name="inputPath2">/WEB-INF/UploadFiles/AJAX.bmp</param><result name="success" type="stream"><!-- 指定下载文件内容类型 application/zip --><param name="contentType">imag/bmp,*./avi</param> <!--inputName默认值是InputStream,如果action中用于读取下载文件内容的属性名是inputStream,那麽可以省略这个参数--><param name="inputName">InputStream</param><paramname="contentDisposition">filename="${filename}"</param> <param name="bufferSize">2048</param></result></action></package></struts>3》。
struts2上传下载---学习笔记(下)

Struts2上传下载续上传续在昨天的笔记中,我们学习了struts2的基本上传方法,并完成了一个上传的实例,下面我们在学习上传的一些相关知识。
1.在上传中,我们写的小程序是可以上传任何类型文件的,可是在我们的真实开发中,一定会对上传文件的类型进行严格的控制,那我们该如何对上传文件的类型进行控制呢,我们前面已经学习了struts2的核心部分——拦截器,拦截器的功能十分的强大,那么下面我们就用拦截器来实现对上传文件的类型控制。
Struts2已经对上传有了默认的拦截器,我们就用struts2的默认拦截器进行类型控制,首先我们来看下我们所需要的拦截器:①.打开struts-default.xml文件,找到<interceptors>标签,我们找到了我们需要的拦截器,名为fileUpload,该拦截器的定义如下:<interceptor name="fileUpload" class="org.apache.struts2.interceptor.FileUploadInterceptor"/>②.根据上面的定义,我们找到了org.apache.struts2.interceptor.FileUploadInterceptor类③.我们关联源码,打开FileUploadInterceptor类,我们找到了如下信息:④.下面我们就要在struts.xml文件中进行拦截器的配置⑤.我们将fileUpload拦截器配置到我们的action中,可是类型该怎么写呢,没关系,我们可以在tomcat的conf目录下的web.xml文件中查找,例如,我们只允许上传以ppt为扩展名的文件,按Ctrl+F查找,输入PPT,出现下面结果:⑥.我们将<mime-type>标签中的内容复制到struts.xml中我们配置的拦截器中的<param>标签下,如④中的图。
java实现文件上传、下载

tomcat上传文件下载文件首先介绍一下我们需要的环境:我用的是myeclipse8.5的java开发环境,tomcat是用的apache-tomcat-6.0.26这个版本。
首先先需要准备一下使用到的jar包这些jar包是struts2的jar包。
这些jar包是都是用于上传文件的。
注意:这里的jar包版本必须是对应的,如不是可能会tomcat下报错。
所以大家最好注意一下啊。
最好是用这套jar包。
我将会在csdn上将项目jar包发上去。
Jar下载地址(0分):/detail/woaixinxin123/4193113 源代码下载(10分):/detail/woaixinxin123/4193134开始搭建我们的项目。
创建web项目名字为File。
第一步:搭建struts2框架。
1、到jar包。
2、编辑web.xml<?xml version="1.0"encoding="UTF-8"?><web-app version="2.5"xmlns="/xml/ns/javaee"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/xml/ns/javaee/xml/ns/javaee/web-app_2_5.xsd"><!-- 增加struts2的支持 --><filter><filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepa reAndExecuteFilter</filter-class></filter><filter-mapping><filter-name>struts2</filter-name><url-pattern>/*</url-pattern></filter-mapping><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list></web-app>3、添加struts.xml<?xml version="1.0"encoding="UTF-8"?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN""/dtds/struts-2.0.dtd"><struts></struts>4、启动tomcat测试。
Struts2实现文件上传

Struts2实现文件上传文件上传,说白了就是个文件复制的过程,文件复制需要什么呢,只需要有源文件和目标地址即可,·用main方法实现的文件复制代码如下:package cn.oracle.upload;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.InputStream;import java.io.OutputStream;public class FileUploadDemo {public static void main(String[] args) throws Exception{File input=new File(args[0]); 参数args[0]是你运行Java程序的时候输入的参数,下面有详细解释:if(!input.exists()){System.out.println("源文件不存在!");System.exit(0);}File output=new File(args[1]);if(!output.getParentFile().exists()){output.mkdirs();}OutputStream outputFile=new FileOutputStream(output);InputStream inputFile=new FileInputStream(input);byte data[]=new byte[1024];int temp=0;while((temp=inputFile.read(data))!=-1){outputFile.write(data, 0, temp);}outputFile.close();inputFile.close();}}例如上图中的Java 运行的程序类名称后面就是参数第一个是d:\1.txt 是一个参数args[0],d:\2.txt是第二个参数args[1]C:\Users\congz_000>java FileUploadDemo d:\1.txt d:\2.txt上面的代码就实现了文件的复制,其实在struts2之中的实现原理是一样的,也就是两个File对象,两个字节流对象,然后调用相应的方法执行的复制而已;在struts2之中实现的复制需要一个表单,将此表单的内容提交到一个action之中,然后struts负责参数的接受处理,赋给相应的变量,编写一个文件复制的方法即可完成文件上传;·给项目添加struts2开发支持,我们用自动配置的方式,用myeclipse帮我们完成,不需要做过多的配置,一路next即可;·新建一个upload.jsp页面<%@page language="java"import="java.util.*"pageEncoding="UTF-8"%><%String path = request.getContextPath();String basePath =request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort( )+path+"/";%><!DOCTYPE HTML PUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><title>文件上传</title></head><body><form action="FileUpload!upload.action"method="post"enctype="multipart/form-data"><input type="file"name="photo"id="photo"> 这个name属性一定要和action之中的File 类对象的名称一致;<input type="submit"value="上传"></form></body></html>·一个用来表示上传成功的页面<%@page language="java"import="java.util.*"pageEncoding="UTF-8"%><%String path = request.getContextPath();String basePath =request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort( )+path+"/";%><!DOCTYPE HTML PUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><title>文件上传</title></head><body><h1>上传成功</h1></body></html>·一个用来表示上传失败的页面<%@page language="java"import="java.util.*"pageEncoding="UTF-8"%><%String path = request.getContextPath();String basePath =request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort( )+path+"/";%><!DOCTYPE HTML PUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><title>文件上传</title></head><body><h2>上传失败!</h2></body></html>·编写相应的上传需要的action FileUploadActionpackage cn.oracle.action;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.InputStream;import java.io.OutputStream;import java.util.UUID;import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.ActionSupport;@SuppressWarnings("serial")public class FileUploadAction extends ActionSupport { private File photo;private String photoFileName;public void setPhotoFileName(String photoFileName) { this.photoFileName = photoFileName;}public void setPhoto(File photo) {this.photo = photo;}public String upload(){System.out.println("************");String filePath =ServletActionContext.getServletContext().getRealPath("/upload")+ File.separator+ UUID.randomUUID()+ "."+ this.photoFileName.substring(this.photoFileName.lastIndexOf(".") + 1);if(this.saveFile(this.photo, filePath)){return"success";}return"failure";}public boolean saveFile(File input, String outputFilePath) { File output = new File(outputFilePath);if (!output.getParentFile().exists()) {output.mkdirs();}InputStream inputFile = null;try {inputFile = new FileInputStream(input);} catch (FileNotFoundException e) {e.printStackTrace();}OutputStream outputFile = null;try {outputFile = new FileOutputStream(output);} catch (FileNotFoundException e) {e.printStackTrace();}byte[] data = new byte[1024];int temp = 0;try {while ((temp = inputFile.read(data)) != -1) {outputFile.write(data, 0, temp);}if (inputFile != null) {inputFile.close();}if (outputFile != null) {outputFile.close();}return true;} catch (Exception e) {e.printStackTrace();}return false;}}·配置Struts.xml文件<?xml version="1.0"encoding="UTF-8"?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN""/dtds/struts-2.1.dtd"><struts><package name="main"namespace="/"extends="struts-default"><action name="FileUpload"class="cn.oracle.action.FileUploadAction"> <result name="success">/success.jsp</result><result name="failure">/failure.jsp</result></action></package></struts>·我们还需要配置一个Struts.properties的资源文件,在src之中,设置上传的限制和编码;struts.i18n.encoding=UTF-8struts.multipart.saveDir=/tempstruts.multipart.maxSize=2097152000·我们把项目部署到tomcat或者weblogic之中,按照你的连接访问,整个上传到此就完成了,这是个最简单的上传,没有做任何的修饰,有些上传做的很华丽的,那些都是div+css的功劳,如果你想要那种特效的话,需要研究下css 这个很不错的;。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
上传Action类UploadAction
package com.action; import java.io.*; import java.util.Date; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; public class UploadAction extends ActionSupport { private static final int BUFFER_SIZE = 16 * 1024000 ; private File myFile; private String contentType; private String fileName; private String imageFileName; private String caption; 省略setter and getter…… }
错误处理பைடு நூலகம்
上面的出错提示是Struts 2默认的,大多数情况下,我们都需要自定义和国 际化这些信息。通过在全局的国际资源文件中加入 “struts.messages.error.content.type.not.allowed=上传文件类型不允许” ,可以实现以上提及的需求 还应该在UploadAction的return SUCCESS前加入: if(hasErrors()) return INPUT;
上传Action类UploadAction
private static String getExtention(String fileName) { int pos = stIndexOf("."); return fileName.substring(pos); } public String execute() { imageFileName = new Date().getTime() + getExtention(fileName); File imageFile = new File(ServletActionContext.getServletContext().getRealPath("/upload") + "/" + imageFileName); copy(myFile, imageFile); return SUCCESS; } }
基于表单的文件上传
注意:上面是基于表单的上传,在form标签中有一个必须的属性值设置:enctype. 如果要做文件上传功能必须将enctype值设为multipart/form-data.
此外,文件上传还需要二个JAR文件支持:
文件上传页面upload.jsp
<%@ page contentType="text/html;charset=gb2312" %> <%@ taglib prefix="s" uri="/struts-tags" %> <body> <s:actionerror /> <s:form action="fileUpload" method="POST" enctype="multipart/formdata"> <s:file name="myFile" label="上传图片" /> <s:textfield name="caption" label="图片标题" /> <s:submit value="提交" /> </s:form> </body>
struts.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "/dtds/struts-2.0.dtd"> <struts> <package name ="file" extends ="struts-default"> <action name ="fileUpload" class ="com.action.UploadAction"> <result name="success" >/success.jsp</result> <result name="input">/upload.jsp</result> </action> </package> </struts>
两个上传框架
Common-FileUplaod:apache的开源项目,由jakarta项目组开发。 功能强大,简单易用,可以实现一次上传一个或多个文件,并可限制文件大小。 COS:O„Reilly公司开发的开源框架 会不定期的增加一些新功能。
下载Common-FileUplaod框架
使用数组同时上传多个文件
使用数组同时上传多个文件
使用数组同时上传多个文件
使用数组同时上传多个文件
使用数组同时上传多个文件
使用list同时上传多个文件
使用list同时上传多个文件
使用list同时上传多个文件
使用list同时上传多个文件
使用list同时上传多个文件
文件下载
有的同学可能会想,我只要设置一个超链接,不就可以下载文件了吗?确实如此,但是通过 超链接下载文件,暴露了下载文件的真实地址,不利于对资源进行安全保护;而且利用超链 接下载文件,服务器端的文件只能存放在Web应用程序所在的目录下。 利用程序编码实现下载,可以增加安全访问控制,对经过授权认证的用户提供下载,还可以 任意提供下载的数据,我们可以将文件放到Web应用程序以外的目录中,也可以将文件保存 到数据库中。 利用程序下载也非常简单,只需要按照如下的方式设置三个报头域就可以了: Content-Type:application/x-msdownload Content-Disposition:attachment;filename=downloadfile Content-Length:filesize 浏览器在接收到上述的报头信息后, 就会弹出文件下载对话框,让你将文件保存到本地硬盘 。
第八章:Struts 2文件上传下载
房栋
本章内容
Struts2单文件上传 Struts2多文件上传 Struts2文件下载
表单enctype属性
application/x-www-form-urlencoded: 默认值,只要是能输出网页的服务器端环境都可以 multipart/form-data: 上传二进制数据,只有使用multipart/form-data ,才能完整的传递文件数 据,进行上传操作
上传Action类UploadAction
private static void copy(File src, File dst) { try { InputStream in = null ; OutputStream out = null ; try { in = new BufferedInputStream( new FileInputStream(src), BUFFER_SIZE); out = new BufferedOutputStream( new FileOutputStream(dst), BUFFER_SIZE); byte [] buffer = new byte [BUFFER_SIZE]; while (in.read(buffer) > 0 ) { out.write(buffer); } } finally { if ( null != in) { in.close(); } if ( null != out) { out.close(); } } } catch (Exception e) { e.printStackTrace(); } }
在运行上述例子,如果您留心一点的话,应该会发现服务器控制台有如下 输出: Mar 20 , 2007 4 : 08 : 43 PM org.apache.struts2.dispatcher.Dispatcher getSaveDir INFO: Unable to find 'struts.multipart.saveDir' property setting. Defaulting to javax.servlet.context.tempdir Mar 20 , 2007 4 : 08 : 43 PM org.apache.struts2.interceptor.FileUploadInterceptor intercept INFO: Removing file myFile C:\Program Files\Tomcat 5.5 \work\Catalina\localhost\Struts2_Fileupload\upload_251447c2_1116e355 841__7ff7_00000006.tmp 服务器控制台输出 上述信息告诉我们,struts.multipart.saveDir没有配置。 struts.multipart.saveDir用于指定存放临时文件的文件夹,该配置写在 struts.properties文件中。例如,如果在struts.properties文件加入如下代码 : struts.multipart.saveDir = tmp 如果此文件夹不存在,Struts 2会自动创建一个。