Struts1.2实现单文件上传讲解
structs架构讲解
上传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; } }
web.xml
在原有文件中增加
<filter> <filter-name>struts-cleanup</filter-name> <filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filterclass> </filter> <filter-mapping> <filter-name>struts-cleanup</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
下载Common-FileUplaod框架地址: /commons/fileupload/ 下载commons-fileupload-1.2-bin.zip文件 解压后得到commons-fileupload-1.2.jar /commons/io/ 下载commons-io-1.3.2-bin.zip文件 解压后得到commons-io-1.3.2.jar
实验六 Struts2 的开发应用
实验六Struts2 的开发应用网络11-2班3110757214 陈宇鹏一、实验目的理解MVC设计模式的基本概念和Java Web开发的两种模式Model1和Model2,以及Struts开发工作流程和基本应用。
二、实验要求1.掌握Struts2.0的开发环境的建立。
2.理解Struts的框架原理。
3.掌握Struts的工作流程。
4.掌握Struts2.0的基本应用。
三、实验内容(一)Struts2的文件上传1.文件上传页面,其中包含两个表单域:文件标题和文件浏览域♦程序功能:上传页面,包含两个表单域。
♦程序源码:upload.html<html xmlns="/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=GBK" /><title>简单的文件上传</title></head><body><form action="upload.action" method="post" enctype="multipart/form-data">文件标题:<input type="text" name="title" /><br>选择文件:<input type="file" name="upload" /><br><input value="上传" type="submit" /></form></body></html>2.处理上传请求的Action类程序源码:UploadAction.javapublic class UploadAction extends ActionSupport{private String title;private File upload;private String uploadContentType;private String uploadFileName;//接受依赖注入的属性private String savePath;//接受依赖注入的方法public void setSavePath(String value){this.savePath = value;}private String getSavePath() throws Exception{return ServletActionContext.getRequest().getRealPath(savePath);}public void setTitle(String title) {this.title = title;}public void setUpload(File upload) {this.upload = upload;}public void setUploadContentType(String uploadContentType) { this.uploadContentType = uploadContentType;}public void setUploadFileName(String uploadFileName) {this.uploadFileName = uploadFileName;}public String getTitle() {return (this.title);}public File getUpload() {return (this.upload);}public String getUploadContentType() {return (this.uploadContentType);}public String getUploadFileName() {return (this.uploadFileName);}@Overridepublic String execute() throws Exception{System.out.println("开始上传单个文件-----------------------");System.out.println(getSavePath());System.out.println("==========" + getUploadFileName());System.out.println("==========" + getUploadContentType());System.out.println("==========" + getUpload());//以服务器的文件保存地址和原文件名建立上传文件输出流FileOutputStream fos = new FileOutputStream(getSavePath() + "\\" + getUploadFileName());FileInputStream fis = new FileInputStream(getUpload());byte[] buffer = new byte[1024];int len = 0;while ((len = fis.read(buffer)) > 0){fos.write(buffer , 0 , len);}return SUCCESS;}}1.配置文件上传的Action程序源码: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><constant name="struts.custom.i18n.resources" value="globalMessages"/><constant name="struts.i18n.encoding" value="GBK"/><package name="lee" extends="struts-default"><action name="upload" class="lee.UploadAction"><param name="savePath">/upload</param> <result>/succ.jsp</result></action></package></struts>.部署并浏览该页面。
基于Struts2的随书光盘管理系统文件上传模块设计
基于Struts2的随书光盘管理系统文件上传模块设计摘要:为有效解决随书光盘文件的上传,以struts2框架的common-fileupload组件为基础,讨论了使用struts2框架上传文件的开发配置,在满足随书光盘系统功能的情况下,优化系统功能,保证系统性能稳定,方便管理员和读者的使用。
关键词:大文件上传;随书光盘;struts2中图分类号:tp311 文献标识码:a 文章编号:1009-3044(2013)09-2149-02基于网络的随书光盘系统中,文件的传送是系统核心。
网络应用中的ftp曾经是文件传送的主要方式,但ftp难于和b/s结构的网络系统无缝集成,且ftp还存在安全性问题,故b/s结构的文件传送组件正逐渐成为文件传送的主流。
struts2[1]是一个优秀的开源框架,它集成了apache开源项目的common-fileupload组件,在上传组件原有文件的基础上,进行了进一步封装,更进一步的简化了文件上传。
通过struts2的文件上传,只需要通过三个属性封装表单里的文件域,即可非常轻松地完成文件上传。
struts2提供对文件下载支持的stream的结果类型,通过借助于struts2提供的文件下载支持,应用可以实现非西欧字符文件名的文件下载,并可以在文件下载前检查用户的权限,从而通过授权控制来控制文件下载。
鉴于随书光盘系统只针对读者提供服务,如果允许所有用户无限制的下载,那将极大的降低系统性能,通过对用户身份进行识别甄别,即可保证用户的使用,又可保证系统的性能。
1 基于b/s结构的上传组件rfc1867协议[2]在http协议的基础上定义了网页文件上传的基本方式,即为表单的input标签增加了file属性,同时限定了form 的method必须为post,enctype必须为multipart/form-data,当post方法的enctype设定为multipart/form-data时,提交表单数值以二进制流的方式来处理表单数据并把文件域指定文件也封装到请求当中,不再以字符串方式提交请求数据。
Java文件上传与文件下载实现方法详解
Java⽂件上传与⽂件下载实现⽅法详解本⽂实例讲述了Java⽂件上传与⽂件下载实现⽅法。
分享给⼤家供⼤家参考,具体如下:Java⽂件上传数据上传是客户端向服务器端上传数据,客户端向服务器发送的所有请求都属于数据上传。
⽂件上传是数据上传的⼀种特例,指客户端向服务器上传⽂件。
即将保存在客户端的⽂件上传⼀个副本到服务器,并保存在服务器中。
1、上传表单要求⽂件上传要求客户端提交特殊的请求——multipart请求,即包含多部分数据的请求。
必须将<form/>标签的enctype属性值设为“multipart/form-data”,enctype表⽰encodingType,及编码类型由于客户端上传⽂件的⼤⼩是不确定的,所以http协议规定,⽂件上传的数据要存放于请求正⽂中,不能出现在URL地址栏内。
也就是说,想要上传⽂件必须提交POST请求。
表单中要有<input type="file" />标签注意:multipart/form-data请求与普通请求不同2、下载⽂件上传jar包并查看官⽅⽂档选择Commons中的FileUpload项⽬,并下载jar包和源⽂件查看FileUpload的⼯作⽅式查看FileUpload项⽬的API3、使⽤第三⽅jar包上传⽂件public class RegisterServlet extends HttpServlet {private static final long serialVersionUID = 1L;public RegisterServlet() {super();}protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.getWriter().append("Served at: ").append(request.getContextPath());}protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//第⼀步、判断请求是否为multipart请求if(!ServletFileUpload.isMultipartContent(request)) {throw new RuntimeException("当前请求只⽀持⽂件上传");}try {//第⼆步、创建FileItem⼯⼚DiskFileItemFactory factory = new DiskFileItemFactory();//设置临时⽂件存储⽬录String path = this.getServletContext().getRealPath("/Temp");File temp = new File(path);factory.setRepository(temp);//单位:字节。
文件 上传 方法
文件上传方法文件上传是指将本地计算机中的文件上传到远程服务器存储的过程。
在实际应用中,文件上传的场景及要求多种多样,需要考虑安全性、速度、稳定性等因素。
本文将从文件上传的工作原理、常用的文件上传技术以及优化方法进行详细阐述。
一、文件上传的工作原理通常情况下,文件上传可以分为浏览器端和服务端两个环节。
具体操作如下:1.浏览器端用户在浏览器页面上选择一个文件上传,浏览器通过input标签构造包含文件内容的FormData对象。
FormData对象可以用来构造XMLHttpRequest对象进行AJAX传输。
2.服务端用户上传的文件最终会被存储在服务端。
服务端会从请求中获取到文件,在对文件进行处理后再保存到磁盘或其他网络存储设备上。
二、常用的文件上传技术1.表单上传表单上传是最基本的文件上传方式,通常使用form标签和input type="file"标签实现。
用户选择文件后,表单会将文件内容以二进制流的形式发送到服务端。
表单上传的优点是简单易用,缺点是不支持进度条展示,也无法进行二次开发。
2.iframe上传iframe上传是一种比较古老的文件上传方式,通常采用window.frames[name]方式进行访问。
用户选择文件后,表单会被嵌套在一个隐藏的iframe页面内,通过iframe与服务端进行交互。
iframe上传的优点是可以进行二次开发,缺点是无法显示进度条,且由于采用Iframe进行交互,存在各种兼容性问题。
3.XMLHttpRequest上传XMLHttpRequest上传是目前比较流行的一种文件上传方式,也可以称之为AJAX上传。
用户选择文件后,文件内容以二进制流的形式被发送到服务端。
由于JavaScript本身具有很强的动态性,因此XMLHttpRequest上传具有较好的兼容性和浏览器支持,也可以进行一些进度条处理、出错处理以及二次开发等。
4.WebSocket上传WebSocket上传是将WebSocket协议应用在文件上传上的一种方式。
stripes框架文档
白汉奇XML to PDF by RenderX XEP XSL-FO Formatter, visit us at /白汉奇版权 . 2009 白汉奇本作品在Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 Unported 协议下发布,些协议中已经明确规定你的权利和义务,如果你对此协议不是很了解,可以从 Creative Commons网站上取得一份拷贝。
XML to PDF by RenderX XEP XSL-FO Formatter, visit us at /目录1. Stripes 框架简介.............................................................................. .. (1)1.1. 初识Stripes ........................................................................ .. (1)1.2. Stripes vs Struts 1 .............................................................................. . (1)1.3. Stripes vs Struts2 .............................................................................. (3)2. Stripes 快速入门.............................................................................. .. (4)2.1. 安装Sun JDK ............................................................................ (4)2.2. 使用Maven 创建项目.............................................................................. (4)2.2.1. 安装Maven .......................................................................... . (4)2.2.2. 创建Stripes 项目.............................................................................. .. (5)2.3. 使用NetBeans 创建项目.............................................................................. .. (5)2.4. 开始创建Stripes项目.............................................................................. . (9)2.5. Stripes的运行原理.............................................................................. (10)3. 创建ActionBean ..................................................................... (12)3.1. ActionBean 接口.............................................................................. (12)3.2. 处理请求事件.............................................................................. .. (13)3.3. URL 映射.............................................................................. .. (13)4. 输入控制.............................................................................. . (15)4.1. 处理表单.............................................................................. (15)4.2. 用户注册程序.............................................................................. .. (15)4.3. 添加required 约束 ............................................................................. (17)4.4. 其它输入控制.............................................................................. .. (18)4.5. 数据类型转换.............................................................................. .. (18)4.6. 自定义验证方法.............................................................................. .. (19)4.7. 使用嵌套验证.............................................................................. .. (20)4.8. 显示错误信息.............................................................................. .. (21)5. Resolution接口.............................................................................. (23)6. 防止重复提交.............................................................................. . (24)6.1. 使用RedirectResolution ............................................................. (24)6.1.1.FlashScope ..................................................................... (24)6.2. 使用验证码.............................................................................. (25)7. 页面显示.............................................................................. . (28)7.1. 多记录分页显示.............................................................................. .. (28)7.1.1. 使用Display Tag 处理分页 (28)7.1.2. 使用JMesa 进行分页处理 (33)7.2. 分步提交.............................................................................. (36)8. 文件上传.............................................................................. . (40)8.1. 单个文件上传.............................................................................. .. (40)8.2. 多文件上传.............................................................................. (42)9. 文件下载.............................................................................. . (44)10. 页面布局.............................................................................. (46)10.1. 示例.............................................................................. .. (46)10.2. 向layout模板文件传递参数 ............................................................................. . (47)10.3. 嵌套使用.............................................................................. . (48)11. 国际化和本地化.............................................................................. .. (50)11.1. 取得当前Locale ......................................................................... . (50)11.2. 选择字符编码.............................................................................. . (50)11.3. 查找资源信息.............................................................................. . (51)11.4. 示例.............................................................................. .. (51)11.5. 与JSTL共处.............................................................................. . (53)12. Ajax 技术.............................................................................. (54)12.1. 示例:即时检测账号的合法性............................................................................54iiiXML to PDF by RenderX XEP XSL-FO Formatter, visit us at /12.2. 示例:重新获取验证码.............................................................................. .. (55)13. 单元测试.............................................................................. (57)13.1. 使用TestNG 进行测试.............................................................................. . (57)13.2. 使用Stripes 测试API ............................................................................ .. (57)ivStripes快速入门XML to PDF by RenderX XEP XSL-FO Formatter, visit us at /第 1 章 Stripes 框架简介简单的介绍 Stripes 框架本章会对 Stripes 框架作一个简短的介绍。
01、struts2(Struts2开发入门 、常用配置、参数传递) - 副本
1. Struts2简介1.1. 什么是Struts21.1.1. Struts2的概念Struts2是轻量级的MVC框架,它主要解决了请求分发的问题,重心在于控制层和表现层。
轻量级,指的是Struts2具有较低的侵入性,就是它对我们业务代码的依赖程度很低,简单来说,在使用Struts2框架时,我们的业务代码中基本上不需要import它的包。
Struts2实现了MVC,满足了MVC设计思想。
在我们使用Struts2做开发的时候,就相当于使用了MVC,这是Struts2自动帮助我们实现的,是默认的、隐含的,我们不需要再写特别的代码来实现MVC了。
作为一个框架,Struts2提供了一系列的API,我们可以使用它们来简化代码的编写,从而提升开发效率。
这些API复用程度很高,对业务代码的依赖性也很小,甚至很多是Struts2自动调用的,因此在很大程度上,我们的开发变得可以复用。
Struts2解决请求分发的问题,我们会在后面为什么使用Struts2中讲解。
重心在控制层和表现层,是纵观整个Struts2理论课程来看的,从中我们会体会到这一点,随着大家对Struts2的逐步了解,届时我们再回顾这一点。
1.1.2. 什么是MVCMVC是代码的分层思想,是软件设计领域经典的设计模式。
它根据代码功能的不同,将一个软件的代码分为3部分,即模型、视图、控制器,这3部分代码的含义和功能如下。
1、M-Model 模型模型(Model)的职责是负责业务逻辑。
包含两层:业务数据和业务处理逻辑。
比如实体类、DAO、Service都属于模型层。
2、V-View 视图视图(View)的职责是负责显示界面和用户交互(收集用户信息)。
属于视图的组件是不包含业务逻辑和控制逻辑的JSP。
3、C-Controller 控制器控制器是模型层M和视图层V之间的桥梁,用于控制流程。
比如:在Servlet项目中的单一控制器ActionServlet。
Struts2详细实例教程
Struts2(上)一、经典的MVC模式二、Struts1.x对MVC的实现三、Struts1.x的主要组件和作用组件作用ActionServlet 中央控制器Action 分控制器,调用JavaBean实现业务逻辑,Action可以分为Action、DispatchAction等不同类型ActionForm 封装参数,实现服务器验证,文件上传等Forward 转发到目的地,可以是JSP,也可以是另一个ActionStruts-config.xml 配置文件,配置有ActionForm,Action,Forward等,通过XML解析,然后使用反射技术使用该文件Struts标签库和JSTL类似,和Struts-config.xml、ActionForm、Action等对象可以紧密集成四、Struts1.x 开发实例-登录程序见案例。
五、Struts2(WebWork)的MVCStruts2的MVC架构六、Struts2的主要组件组件作用FilterDispatcher 起中央控制器作用的过滤器Action 处于Model层的Action,调用JavaBean实现业务逻辑struts.xml 核心配置文件,配置有Action、Result等result 和forward类似,转发的目的地,支持多种视图技术。
七、Struts2的实例-登录在MyEclipse环境中建立一个新的web工程,名称“Struts2Login”,存放路径“f:\Struts2Login”。
在Struts2.0.11版本中找到war包struts2-blank-2.0.11.war,解开该war包,在WEB-INF/lib 目录下复制出所有的jar包,这些jar包就是一个Struts2程序所需要的基础jar包,把它们复制到新建的web工程的WEB-INF/lib目录中。
在src目录下建立一个类,包名mypack,类名UserAction,其代码如下:package mypack;import com.opensymphony.xwork2.ActionSupport;public class UserAction extends ActionSupport {private String username;private String userpass;public String getUsername() {return username;}public void setUsername(String username) {ername = username;}public String getUserpass() {return userpass;}public void setUserpass(String userpass) {erpass = userpass;}@Overridepublic String execute() throws Exception {if ("Mike".equals(username) && "123".equals(userpass)|| "张三".equals(username) && "abc".equals(userpass))return "success";elsereturn "error";}}在src目录下建立Struts2的配置文件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><!-- 定义包管理配置的action 继承struts-default.xml中的配置 --><package name="actions" extends="struts-default"><!-- 定义Action(login.action) --><action name="login" class="erAction"><!-- 定义转发路径对应的字符串名 --><result name="success">/Success.jsp</result><result name="error">/Error.jsp</result></action></package></struts>修改web.xml,在其中加入一个过滤器,过滤/*路径。
struts2流程以及源码解析
1.1 Struts2请求处理1. 一个请求在Struts2框架中的处理步骤:a) 客户端初始化一个指向Servlet容器的请求;b) 根据Web.xml配置,请求首先经过ActionContextCleanUp过滤器,其为可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助(SiteMesh Plugin),主要清理当前线程的ActionContext和Dispatcher;c) 请求经过插件过滤器,如:SiteMesh、etc等过滤器;d) 请求经过核心过滤器FilterDispatcher,执行doFilter方法,在该方法中,询问ActionMapper来决定这个请求是否需要调用某个Action;e) 如果ActionMapper决定需要调用某个Action,则ActionMapper会返回一个ActionMapping实例(存储Action的配置信息),并创建ActionProxy (Action代理)对象,将请求交给代理对象继续处理;f) ActionProxy对象根据ActionMapping和Configuration Manager询问框架的配置文件,找到需要调用的Action类;g) ActionProxy对象创建时,会同时创建一个ActionInvocation的实例;h) ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用;i) 一旦Action执行完毕,ActionInvocation实例负责根据struts.xml中的配置创建并返回Result。
Result通常是一个需要被表示的JSP或者FreeMarker 的模版,也可能是另外的一个Action链;j) 如果要在返回Result之前做些什么,可以实现PreResultListener接口,PreResultListener可以在Interceptor中实现,也可以在Action中实现;k) 根据Result对象信息,生成用户响应信息response,在生成响应过程中可以使用Struts2 框架中继承的标签,在此过程中仍会再次涉及到ActionMapper;2. Struts2请求处理示意图:1.2 Struts2请求处理源码分析当用户向Struts2发送请求时,FilterDispatcher的doFilter()方法自动调用,doFilter()方法处理请求过程,如下:1. 创建值栈对象stack;2. 创建Action上下文对象;3. 对请求进行重新封装,此次封装根据请求内容的类型不同,返回不同的对象:如果为multipart/form-data类型,则返回MultiPartRequestWrapper类型的对象,该对象服务于文件上传,否则返回StrutsRequestWrapper类型的对象,MultiPartRequestWrapper是StrutsRequestWrapper的子类,而这两个类都是HttpServletRequest接口的实现。
Java通用文件上传功能实现
Java通用文件上传功能实现一、文件上传流程说明:Java文件上传功能是指在Java开发中,实现文件上传的功能,可以用于各种场景,如网站上传图片、文件管理系统等。
以下是一种常见的实现方式:1、创建一个包含文件上传功能的表单页面,用户可以选择要上传的文件并提交表单。
2、在后端Java代码中,接收表单提交的文件数据。
可以使用Apache Commons FileUpload库或Spring框架提供的MultipartFile类来处理文件上传。
3、对接收到的文件进行处理,可以将文件保存到服务器的指定位置,或者将文件存储到数据库中。
4、返回上传成功或失败的信息给用户。
二、代码实现,方案一:在Java中实现文件上传功能可以通过以下步骤来完成:1、创建一个HTML表单,用于选择要上传的文件:<form action="upload"method="post" enctype="multipart/form-data"> <input type="file" name="file" /><input type="submit" value="Upload" /></form>2、创建一个Servlet或者Controller来处理文件上传请求:@WebServlet("/upload")public class UploadServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) {// 获取上传的文件Part filePart = request.getPart("file");String fileName = filePart.getSubmittedFileName();// 指定上传文件的保存路径String savePath = "C:/uploads/" + fileName;// 将文件保存到指定路径filePart.write(savePath);// 返回上传成功的消息response.getWriter().println("File uploaded successfully!");}}3、配置web.xml(如果使用传统的Servlet方式)或者使用注解(如果使用Servlet 3.0+)来映射Servlet。
struts2上传文件异常:multipartrequest(jakarta)-[unknownlocation]
struts2上传文件异常:multipartrequest(jakarta)-[unknownlocation]Struts2上传文件异常:ng.RuntimeException: Unable to load beanorg.apache.struts2.dispatcher.multipart.MultiPartRequest (jakarta) - [unknown location]在测试Struts2权威指南介绍的struts2文件上传,发现如下异常:ng.RuntimeException: Unable to load beanorg.apache.struts2.dispatcher.multipart.MultiPartRequest (jakarta) - [unknown location]再回去仔细看该章节,发现是自己粗心了,忘记加所需要的两个除struts2外的jar文件.所加jar文件所图所示:Struts2默认使用的是Jakarta的Common-FileUpload的文件上传框架,而struts2的filter拦截了上传文件的动作,拦截器代码是这样写的://org.apache.struts2.dispatcher.Dispatcher.javapublic HttpServletRequest wrapRequest(HttpServletRequest request, ServletContext servletContext) throws IOException { // don't wrap more than onceif (request instanceof StrutsRequestWrapper) {return request;}String content_type = request.getContentType();if (content_type != null &&content_type.indexOf("multipart/form-data") != -1) {MultiPartRequest multi =getContainer().getInstance(MultiPartRequest.class);request = new MultiPartRequestWrapper(multi, request, getSaveDir(servletContext));} else {request = new StrutsRequestWrapper(request);}return request;}注意MultiPartRequest multi =getContainer().getInstance(MultiPartRequest.class);这句是上传文件时拦截器实现所需要的,出错的原因是所不到MultiPartRequest.class的实现类.这个类在上传框架jar文件中.这是文件上传fileupload解析器。
文件上传原理
文件上传原理
文件上传原理是指将本地的文件通过网络协议发送到服务器端的过程。
在文件上传前,客户端需要先将文件切分成小的数据包,每个数据包都会附带一些元数据信息,比如文件名、文件大小等。
然后,客户端通过网络协议(如HTTP)将这些数据
包逐个发送给服务器。
在发送数据包之前,客户端和服务器需要建立连接。
通常使用TCP协议来建立可靠的连接,并通过握手过程确认连接已建立。
一旦连接建立成功,客户端就可以开始发送数据包了。
客户端将数据包发送给服务器的过程可以分为多个步骤。
首先,客户端会发送一个包含文件信息的请求,告诉服务器将要上传的文件的大小、文件名等信息。
服务器收到这个请求后会进行一系列的检查,比如检查文件是否已经存在、用户是否有权限上传等。
如果通过了检查,服务器会返回一个上传凭证给客户端。
接下来,客户端会将文件切分成小的数据包,并逐个发送给服务器。
在发送每个数据包之前,客户端会计算数据包的校验和,以便服务器端可以验证数据的完整性。
服务器收到数据包后会进行校验和的检查,如果数据包完整则会存储数据包的内容,否则会要求客户端重新发送。
一旦所有的数据包都被发送到服务器,客户端会向服务器发送一个上传完成的请求。
服务器在接收到请求后会进行一些后续的处理,比如将文件存储到指定的位置、更新数据库记录等。
总结来说,文件上传原理包括建立连接、发送文件信息、切分数据包、发送数据包、校验数据完整性、存储文件等步骤。
通过这个过程,客户端可以将本地的文件上传到服务器上,实现了文件共享和传输的功能。
Struts2的文件上传和下载问题
Struts2的文件上传和下载问题2012-05-231、Strusts2文件的上传:1、要实现文件上传必须将表单的method属性设置成post,将enctype设置成multipart/form-data,即<s:form action=”…” method=”post” enctype=”multipart/form-data”><input type=”file” name=”…”/>…</s:form>enctyp=”multipart/form-data”表示数据将以二进制流处理。
而在引用struts2的标签的时,应该引入该标签<%@taglib prefix=”s” uri=”/struts-tags”/>2、如果表单中包含一个name属性为***的文件域,则对应的处理Action中应使用以下三个属性来封装***文件域的信息***:File 封装文件域对应的文件内容***FileName:String 封装文件域对应的文件名称***ContentType:String 封装文件域对应的文件类型实现文件上传的主要代码如下:public String execute() throws Exception{ FileOutputStream fos = newFileOutputStream(要将文件上传到那个文件夹的路径);FileInputStream fis = new FileInputStream(getUpload());byte[] buffer =newbyte[1024];int len = 0;while ((len =fis.read(buffer)) > 0){fos.write(buffer, 0,len);}return SUCCESS;}3、应用拦截器实现文件的过滤(Struts2文件上传的拦截器是fileUpload<action name=”uploadPro” class=”…”><interceptor-ref name=”fileUpload”><param name=”allowedTypes”>image/png,imgae/gif,application/ms word</param><!-- 指定允许上传的文件类型--><param name=”maximumSize”>2000</param><!—指定上传的最大文件的大小--></interceptor-ref><interceptor-ref name=”defaultStack”/>…</action>4、上传文件太大的提示信息的key:rge上传文件的文件类型不允许的提示信息的key:struts.messages.error.content.type.not.allowed上传文件失败的提示信息的key:struts.messages.error.uploading设置文件上传的临时路经:struts.multipart.saveDir=”…”2、Struts2文件的下载:Struts2提供stream结果类型来支持文件的下载功能,而配置stream类型的结果需要给出一下四个属性:contentType:被下载文件的类型inputName:为被下载文件创建的一个输入流,在相应的Action中必须为其提供一个返回类型为InputStream的getter方法。
struts2上传文件
1. struts2中的文件上传第一步:在WEB=INF/lib下加入commons-fileupload-1.2.1.jar ,commons-io-1.3.2.jar。
第二步:把form表单的enctype属性设置为"multipart/form-data",如Java代码1.<form action="${pageContext.request.contextPath}/control/employee/list_execute.action" enctype="multipart/form-data" method="p ost">2.文件:<input type="file" name="image">3. <input type="submit" value="上传"/>4. </form>5. //${pageContext.request.contextPath}:获取服务器根路径第三步:在action中添加一下属性,Java代码1.public class HelloWorldAction {2. private File image; //与jsp表单中的名称对应3. private String imageFileName; //FileName为固定格式4. private String imageContentType ;//ContentType为固定格式5.6. public String getImageContentType() {7. return imageContentType;8. }9. public void setImageContentType(String imageContentType) {10. this.imageContentType = imageContentType;11. }12. public String getImageFileName() {13. return imageFileName;14. }15. public void setImageFileName(String imageFileName) {16. this.imageFileName = imageFileName;17. }18. public File getImage() {19. return image;20. }21. public void setImage(File image) {22. this.image = image;23. }24. public String execute() throws Exception{25.System.out.println("imageFileName = "+imageFileName);26.System.out.println("imageContentType = "+imageContentType);27. //获取服务器的根路径realpath28. String realpath = ServletActionContext.getServletContext().getRealPath("/images");29.System.out.println(realpath);30. if(image!=null){31. File savefile = new File(new File(realpath), imageFileName);32. if(!savefile.getParentFile().exists()) savefile.getParentFile().mkdirs();33. FileUtils.copyFile(image, savefile);34. ActionContext.getContext().put("message", "上传成功");35. }else{36. ActionContext.getContext().put("message", "上传失败");37. }38. return "success";39. }40.}此外,可以在struts.xml中配置上传文件的大小<constant name="struts.multipart.maxSize" value="10701096"/> //最大上传配置成10M默认的上传大小为2M思维拓展:如果要上传的文件非常大,如上传的是电影,好几百M ,用web上传一般是不可能难上传成功的,这时候要安装一个插件,类似于应用程序socket ,通过网络通讯上传。
文件上传的原理
文件上传的原理文件上传是指将本地存储的文件通过网络传输到远程服务器的过程。
在互联网时代,文件上传已经成为人们日常生活中不可或缺的一部分,无论是上传照片、视频,还是上传文档、音频,都离不开文件上传的原理。
那么,文件上传是如何实现的呢?下面我们就来详细了解一下文件上传的原理。
首先,文件上传的原理基于客户端和服务器之间的通信。
当用户在客户端发起文件上传请求时,客户端会将文件数据进行封装,并通过网络传输到服务器端。
在这个过程中,涉及到了一系列的技术和协议,包括HTTP协议、TCP/IP协议、以及一些前端和后端的技术。
在文件上传的过程中,首先是客户端将文件数据进行封装。
这个过程通常由前端技术来实现,比如HTML、JavaScript等。
通过HTML的input标签,用户可以选择本地文件进行上传,然后通过JavaScript来获取文件数据,并将文件数据进行封装,最终形成一个HTTP请求。
接着,客户端通过网络将封装好的文件数据传输到服务器端。
这个过程依赖于TCP/IP协议,TCP协议负责将数据可靠地传输到服务器端。
在传输过程中,还会涉及到HTTP协议,HTTP协议规定了客户端和服务器之间的通信规范,包括请求和响应的格式、状态码的含义等。
一旦服务器端接收到文件数据,就需要进行相应的处理。
服务器端通常由后端技术来实现,比如Java、Python、PHP等。
后端会接收到客户端发送过来的HTTP 请求,然后解析请求中的文件数据,并将文件数据存储到服务器的文件系统中。
在存储文件的过程中,还需要考虑文件的安全性、存储路径、文件名等问题。
除了文件数据的存储,服务器端还需要对文件数据进行一些处理。
比如对文件进行格式转换、压缩、加密等操作。
这些操作通常由后端技术来实现,通过编写相应的程序来对文件数据进行处理,然后将处理后的结果返回给客户端。
综上所述,文件上传的原理涉及到了客户端和服务器端之间的通信,以及一系列的技术和协议。
通过前端技术将文件数据进行封装,然后通过网络传输到服务器端,最终由后端技术对文件数据进行处理和存储。
前端开发中的文件上传和下载实现方法
前端开发中的文件上传和下载实现方法在现代互联网时代,文件的上传和下载是我们经常要面对的需求。
特别是在前端开发中,如何实现文件上传和下载功能是一个相当重要的课题。
本文将介绍一些前端开发中常用的文件上传和下载的实现方法。
一、文件上传的实现方法1. 表单提交方式最传统的文件上传方法就是利用表单提交。
我们可以通过创建一个包含文件输入框的表单,然后用户选择文件后,点击提交按钮将文件上传到服务器。
在HTML中,可以使用input元素的type属性为file来创建文件输入框,然后将表单的enctype属性设置为multipart/form-data,这样可以保证文件能够正确上传到服务器。
在服务端,可以使用各种后端技术来处理上传文件,如Java的Servlet、PHP、Node.js等。
2. AJAX方式使用AJAX方式实现文件上传可以实现无刷新上传,提升用户体验。
传统的表单提交会导致页面的刷新,而使用AJAX可以在不刷新页面的情况下异步上传文件。
在实现上,可以使用FormData对象来传输文件数据,并通过XMLHttpRequest 对象发送请求。
同时,通过监听上传进度事件,可以实时显示文件上传的进度。
3. 第三方库除了自己实现文件上传逻辑外,也可以使用第三方库来简化文件上传的过程。
一些流行的前端框架和库,如jQuery、React等都提供了丰富的插件或组件来方便实现文件上传功能。
这些插件和组件一般都有了良好的兼容性和一套完整的API,可以大大简化文件上传的开发流程。
二、文件下载的实现方法1. 普通链接下载最简单的文件下载方式就是提供一个普通链接,让用户点击链接后即可下载文件。
在HTML中,可以使用a标签的href属性指向文件的URL,然后点击该链接即可完成文件下载。
不过需要注意的是,在特定情况下,如需要下载大文件时,直接使用普通链接下载可能会导致浏览器崩溃或内存耗尽的问题。
2. Blob对象下载为了解决上述问题,可以使用Blob对象来进行文件下载。
Struts2架构中的Commons-fileupload组件应用技术
Struts2架构中的Commons-fileupload组件应用技术李静梅;王超宇【摘要】基于HTTP传输协议的Web网页中,采用嵌人Commons-fileupload组件的Struts2框架,实现了文件的上传与下载.利用OGNL表达式提取Session持久层中的文件名,并利用此文件名实现下载文件的动态更名.灵活利用struts2.0自身提供的字段类型,提高下载的鲁棒性.并列举实例体现整合技术和动态文件下载的实用性,最后通过与以往2种常用开发框架的对比数据加以验证说明.【期刊名称】《应用科技》【年(卷),期】2011(038)004【总页数】5页(P39-43)【关键词】上传下载;Struts2架构;Commons-fileupload组件;OGNL表达式【作者】李静梅;王超宇【作者单位】哈尔滨工程大学,计算机科学与技术学院,黑龙江,哈尔滨,150001;哈尔滨工程大学,计算机科学与技术学院,黑龙江,哈尔滨,150001【正文语种】中文【中图分类】TP311.1随着Internet的飞速发展,越来越多的人参与到网络活动中.博客、Email等网络应用如雨后春笋般大量涌现,它们充分利用了现有的网络资源,不仅给人们的生活带来了巨大的方便,同时也正在逐渐影响、改变着人们的日常生活方式.网络应用的大量涌现,使得在Web页面上完成基于HTTP超文本传输协议的上传下载功能显得越来越重要.针对这一问题,近几年科研院所和一部分公司提出了一些行之有效的可行性框架和解决方案.Struts2就是众多框架中的佼佼者.Struts2凭借其良好的扩展性,使其在Web应用中展现出了特有的优势.Common-fileupload是由阿帕奇基金会旗下的java开源社区Jakarta社区开发的一款组件,主要作OGNL expression用是提供文件管理功能.Jakarta社区是一个非常成熟的社区,不仅有着稳定的开发团队,而且参与过Tomcat的研发,因此在利用Tomcat为服务器的网络应用程序中,Common-fileupload组件在速度和稳定性上都具有一定的优势.1 Struts2框架Struts2是Struts系列框架的第2代产品.是在Struts1和WebWork的技术基础上进行了合并,形成的全新的框架.全新的Struts 2框架与Struts1存在着巨大的差别.Struts2大量地借鉴WebWork相关技术,采用拦截器来处理用户的请求,这样的设计降低了框架的耦合性,提高了框架的性能.1.1 Struts2的体系结构Struts2与传统的Struts框架在整个体系结构上有了很大的变化.下面对Struts2的体系机构作下简要的介绍.图1为Struts2的体系结构图.图1 Struts2体系结构利用struts2体系结构展开的工作严格遵循下述开发流程:1)浏览器发送一个请求;2)核心控制器FilterDispatcher根据请求决定调用合适的Action;3)WebWork的拦截器自动对请求应用调用功能,如验证等;4)回调Action的execute方法,该execute方法根据请求的参数来执行一定的操作;5)Action的execute方法处理的结果信息将被输出到浏览器中,支持多种形式的视图.1.2 Struts2中的拦截器Struts2框架以拦截器为所有功能的基础.根据WebWork的中文文档,其解释为——拦截器是动态拦截Action调用的对象.拦截器提供了一种机制,不仅使开发者可以定义一个在action执行前、后执行的代码,而且可以在一个action执行前阻止其执行,同时还能提供一种可以提取action中可重用部分的方法.当请求到达Struts2的拦截器时,Struts2会查找配置文件,并根据其配置文件实例化拦截器的对象,然后串成一个列表(list),最后按照FIFO算法调用列表中的拦截器实例化改对象.2 文件上传2.1 常用上传方式基于HTTP传输协议的文件上传主要有手工上传和框架上传2种方式.采用手工文件上传方式时是由表单元素中的enctype属性决定提交表单的方式,并最终由该属性决定最终是以字符串方式还是以二进制编码方式提交请求.当enctype的值为multipart/formdata时,无法直接通过HttpServletRequest的getParameter方法获取请求参数的值,需要通过二进制流来获取请求内容,从而实现文件的上传.这种传统手工编码方式相当繁琐,因此很少被采用.框架上传方式是将手工上传中的一些可以由计算机自动执行的部分,由框架替程序员完成,这样大大简化了编程,使程序更易于维护和管理.框架中的解释器通过分析HTTP请求中的二进制流,解析出二进制流中所包含的全部表单域,并分析出每个表单域的类型.基于框架的文件上传,允许开发者以简单的方式来取得文件域的内容字节、文件名以及文件内容等信息.目前主流上传下载组件主要有3种,分别是COS、JspSmartUpload和Commons-fileupload.这 3 种组件的最大作用是提供自己的请求解释器,并通过自身提供的解释器解析HTTP请求.Struts2由于其自身优秀的模块化设计,使程序员可以在其上添加任何一种组件,实现自己的不同要求.经过标准测试发现,当采用JspSmartUpload组件进行文件上传时,若上传文件大于200 M,JspSmartUpload自身会因为堆栈溢出而崩溃,给程序带来不可预知的隐患,因此本组件并不适合负载较重、稳定性要求比较高的应用.而COS组件单就性能上来说,要略高于Commons-fileupload,但由于 Struts2与 Commons-fileupload 有更高的契合度,整合较为方便,因此选择后者成为实际上传时所采用的组件. 2.2 基于Commons-fileupload组件的上传Commons-fileupload组件最重要的组成部分是自己提出的请求解释器.Struts2采用拦截器列表实现具体功能,因此并未提出自己的请求解释器.通过上面的分析知道,要利用框架实现文件上传,在程序提出一个上传请求后,Struts2框架本身无法解析这样处理请求,因此文中在实现上传这个功能时的主要贡献就是将Commons-fileupload组件中的请求解释器集成到Struts2.0框架中,通过traditional-API实现整合的方案[1-3].在测试了上述整合方案后,发现利用traditionalAPI实现文件上传占用的内存较多,上传速度较慢.通过阅读官方资料发现common-fileupload组件提供了2种请求解释器,分别是TraditionalAPI 和StreamingAPI这2种方式.经具体测试发现,利用StreamingAPI方式实现上传,能有效降低内存占用量,并能提高上传速度.因此这里采用StreamingAPI解释器实现文件上传.当有multipart/formdata请求时,Struts2.0中的拦截器会将请求拦截下来,并通过配置文件中关于解释器的配置信息,调用Commons-fileupload组件中相应的请求解释器对请求作出分析,通过isFormfiled()方法判断表单是一个普通的表单还是一个文件域,最后将解析出来的信息按照数据流方式传给Struts2框架的拦截器,Struts2将对数据进行进一步的操作.图2 文件上传的过程流程实现文件上传的功能逻辑关系如图2所示.在上述理论指导下,在此按照文件上传功能逻辑关系图进行了实际开发,通过实际程序验证了上述理论.Struts2中的Action并不负责处理HttpServletRequest请求,只是通过拦截器获得文件内容、文件名称和文件类型3个属性值.文件提交到后台时,拦截器通过3个属性值来过滤文件,同时将获得的属性值传递给Commons-fileupLoad组件的解释器,如果程序在完成上述关系图上任何一步出错时,拦截器都会返回错误信息.3 文件下载3.1 利用Stream类型字段解决字符库不匹配问题下载文件时,一般将传输数据的数据类型定义为数据库中的数据类型[4-5],这样的优势是数据不需进行转换就可在前台页面与数据库之间来回传递并显示,降低了编程的难度.但其也存在一个致命的缺陷,就是如果数据库与前台页面字符集不匹配,将造成前台页面显示乱码现象.经过分析与研究发现,在Struts2框架中有一种Stream结果类型,它的本意是处理流类型的数据,例如图片和音乐.通过试验发现只要对数据进行适当的更改,Stream这个字段类型除了可以处理图片、声音等数据外,还可以很好地解决字符库不匹配问题.在提取数据库中数据时,利用 StringBufferInput-Stream函数将数据转换成二进制流信息,然后通过Stream字段将二进制流信息传到程序的前台,在前台利用解析程序将二进制流信息还原成原始信息进行展示.由于采用ASCII码形式传送数据,字符库不匹配问题消弭于无形,大大提高了系统的鲁棒性.3.2 利用OGNL表达式提取session内的文件名OGNL(object-graph navigation language)是一种功能强大的表达式语言,通过表达式语法,可以实现存取对象的任意属性、调用对象的方法、遍历整个对象的结构图、字段类型转化等功能.通过OGNL强大的存取功能,实现了文件下载时的动态更名.当用户点击下载时,后台程序中的OGNL表达式会在整个程序的Session持久层中按照ID号提取文件名,并在调用Windows下载API之前将文件名以动态赋值的方式传给下载API,这样在下载对话框中显示出来的就已经是要下载的文件名,而并非像传统的处理方式那样,在下载完毕后更新文件名.用户可以在下载的过程中直观地了解自己所下载文件的名字.动态文件下载的基本流程如图3所示.图3 实现的下载功能过程流程4 Struts2与2类常用开发框架比较Struts2框架是在Struts1和WebWork的技术基础上进行了合并,形成的全新的框架.在大量吸收原有框架的优点后,Struts 2已经是一个非常具有实用价值的MVC框架.与传统Struts框架相比,Struts2在Action类的实现上更为方便,在线程安全和可测试方面做得都要更好.Struts2相比WebWork来说,不再提供内在的IoC容器支持,转而将Spring作为缺省实现,扬长避短,提高了用户体验,同时Struts2还全面引入了Dojo.5 应用实例测试文件上传下载在工作流引擎中的应用相当广泛,选择一种高效的文件上传下载在工作流引擎中有其重要的实用价值.jBPM(java业务流程管理)是一种基于J2EE的轻量级工作流管理系统,其后成为JBoss企业中间件平台的一个组成部分,改名为JBoss jBPM.以Struts2框架为jBPM开发的工作流引擎,便捷地增加一个文件上传下载模块.整合思想是利用Struts2作为工作流引擎的MVC框架,将Commons-Fileuplod 作为容器,把Struts2的控制与业务逻辑组件相分离.下面是嵌入了Commons-fileUpload组件的Struts2框架关于上传下载应用的配置文件和核心代码:1)Struts.xml配置文件核心代码:上述代码为实现将Commons-fileupload组件中的解释器嵌入到Struts2中的配置文件代码和通过Stream字段类型以二进制流的形式传输数据库内数据的核心代码.下面为了凸显文中提出整合方式的优势,通过标准测试上传了4次大小不同的文件,上传不同大小文件耗时对比结果见表1.表1 不同组件在上传文件时的耗时对比 ms组件名称2 M 20 M 45 M 200 M COS 245 2 391 5 000 53 520 Commons-fileupload 297 3 293 6 700 76 210 JspSmartUpload 536 4 371 8 745堆栈溢出为使对比更直观、明显,这里参照上述数据绘制了具体如图4所示,嵌入不同组件的Struts2框架上传速度对比图.图4 嵌入不同组件的Struts2框架上传速度对比一般系统所要上传下载的文件大小主要集中在2~45 M区间内,但难免有可能会出现上传下载大文件的时候,因此选择上述几个文件大小作为测试上传的测试集[6].根据图4可以看出,上传20 M左右的文件时,采用了Commons-fileupload和COS组件的速度性能相差无几,但是JspSmartUpload与其他2种的差距就已经很明显了,当文件大于200 M时,JspSmartUpload已经因为堆栈溢出而崩溃了.通过表格和对比图可以发现,采用Commons-fileupload组件的系统无论从速度还是稳定性上都比JspSmartUpload组件有很大提高.Commons-fileupload与COS在上传速度与稳定性上差别不大,但是Commons-fileupload比COS更易于整合到Struts2框架中;因此从系统整体的开发效率和性能上来说,Commons-fileupload组件无疑是最佳选择,同时也更适合以业务为主的web环境.6 结束语提出了一种将Commons-fileupload组件嵌入到Struts2中形成的新框架,该框架已成功地应用于多种文件上传下载系统中.通过实际使用证明:带有新元素的Struts2框架,提高了文件上传下载的速度,通过文件动态更名,增加了文件上传下载的实用性.通过实验证明了新框架在文件上传速度和准确率上的优越性.基于Struts2形成的新框架不拘泥于一种文件形式,符合文件上传下载的通用性,有利于文件上传下载功能的推广,具有良好的应用前景.参考文献:[1]WU M.Analytical method for the lateral buckling of the struts in beam string structures[J].Engineering Structures,2008,30(9):2301-2310. [2]SAHOO D K,GAUTERM R K.Strength and deformation characteristics of bottle-shaped struts[J].Magazine of Concrete Research,2008,8(9):137-144.[3]于银山,胡正华.基于Struts2框架的Web应用开发[J].电脑知识与技术,2009,5(16):59-62.[4]段旭光,李岚,董立岩,等.基于HTTP文件上传进度显示组件的设计及实现[J].吉林大学学报:信息科学版,2006,24(1):89-93.[5]李林珊,郑丽娅.基于JXL的数据导入导出处理[J].计算机软件与应用,2008,27(9):95-96.[6]刘锦锦.基于Struts框架的Web网站开发及数据分析[D].北京:北京化工大学,2005.。
文件 上传 方法
文件上传方法
文件上传方法可以通过以下几种方式实现:
1. 表单提交:在HTML中设置一个文件类型的input标签,用户可以点击该标签选择待上传的文件。
当用户提交表单时,表单数据会包含所选文件的二进制数据,后台服务器可以接收并保存该文件。
2. HTTP请求:使用HTTP POST请求上传文件。
可以使用HTTP工具库(如axios、jQuery.ajax等)在前端发送POST请求,将文件以二进制数据的形式发送给后台服务器。
3. AJAX上传:通过AJAX技术实现文件上传。
可以使用FormData对象将文件数据封装为表单数据,然后使用XMLHttpRequest(XHR)对象发送POST请求,将FormData对象发送到后台服务器。
4. FTP上传:使用FTP协议实现文件上传。
FTP是一种文件传输协议,可以使用FTP客户端软件(如FileZilla等)将本地文件上传到远程服务器。
5. 第三方库/插件:使用第三方库或插件来简化文件上传操作。
一些流行的文件上传库/插件有Dropzone.js、Plupload、Fine Uploader等,它们提供了丰富的上传功能和用户友好的界面。
无论使用哪种方式,都需要注意安全性和性能问题。
例如,限制上传文件的大小、类型和数量,对上传文件进行验证和过滤,以及进行合理的上传速度控制,避免对服务器造成过大负载。
jspstruts1struts2上传文件
一.在JSP环境中利用Commons-fileupload组件实现文件上传1.页面upload.jsp清单如下:Java代码1.<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>2.3.<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML4.01 Transitional//EN">4.<html>5. <head>6. <title>The FileUpload Demo</title>7. </head>8.9. <body>10. <form action="UploadFile" method="post" enctype="multipart/form-data">11. <p><input type="text" name="fileinfo" value="">文件介绍</p>12. <p><input type="file" name="myfile" value="阅读文件"></p>13. <p><input type="submit" value="上传"></p>14. </form>15. </body>16.</html>注意:在上传表单中,既有一般文本域也有文件上传域2.FileUplaodServlet.java清单如下:Java代码1.package org.chris.fileupload;2.3.import java.io.File;4.import java.io.IOException;5.import java.util.Iterator;6.import java.util.List;7.8.import javax.servlet.ServletException;9.import javax.servlet.http.*;10.11.import org.apachemons.fileupload.FileItem;12.import org.apachemons.fileupload.FileItemFactory;13.import org.apachemons.fileupload.disk.DiskFileItemFactory;14.import org.apachemons.fileupload.servlet.ServletFileUpload;15.16.public class FileUplaodServlet extends HttpServlet {17.18. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {19. doPost(request, response);20. }21.22. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {23.24. request.setCharacterEncoding("UTF-8");25.26. //文件的上传部份27. boolean isMultipart = ServletFileUpload.isMultipartContent(request);28.29. if(isMultipart)30. {31. try {32. FileItemFactory factory = new DiskFileItemFactory();33. ServletFileUpload fileload = new ServletFileUpload(factory);34.35.// 设置最大文件尺寸,那个地址是4MB36. fileload.setSizeMax(4194304);37. List<FileItem> files = fileload.parseRequest(request);38. Iterator<FileItem> iterator = files.iterator();39. while(iterator.hasNext())40. {41. FileItem item = iterator.next();42. if(item.isFormField())43. {44. String name = item.getFieldName();45. String value = item.getString();46. System.out.println("表单域名为: " + name + "值为: " + value);47. }else48. {49. //取得取得文件名,此文件名包括途径50. String filename = item.getName();51. if(filename != null)52. {53. File file = new File(filename);54. //若是此文件存在55. if(file.exists()){56. File filetoserver = new File("d:\\upload\\",file.getName());57. item.write(filetoserver);58. System.out.println("文件 " + filetoserver.getName() + " 上传成功!!");59. }60. }61. }62. }63. } catch (Exception e) {64. System.out.println(e.getStackTrace());65. }66. }67. }68.}3.web.xml清单如下:Java代码1.<?xml version="1.0" encoding="UTF-8"?>2.<web-app version="2.4"3. xmlns="java.sun/xml/ns/j2ee"4. xmlns:xsi="/2001/XMLSchema-instance"5. xsi:schemaLocation="java.sun/xml/ns/j2ee6. java.sun/xml/ns/j2ee/web-app_2_4.xsd">7.8. <servlet>9. <servlet-name>UploadFileServlet</servlet-name>10. <servlet-class>11. org.chris.fileupload.FileUplaodServlet12. </servlet-class>13. </servlet>14.15. <servlet-mapping>16. <servlet-name>UploadFileServlet</servlet-name>17. <url-pattern>/UploadFile</url-pattern>18. </servlet-mapping>19.20. <welcome-file-list>21. <welcome-file>/Index.jsp</welcome-file>22. </welcome-file-list>23.24.</web-app>二.在strut1.2中实现1.上传页面file.jsp 清单如下:Java代码1.<%@ page language="java" pageEncoding="ISO-8859-1"%>2.<%@ taglib uri="/struts/tags-bean" prefix="bean"%>3.<%@ taglib uri="/struts/tags-html" prefix="html"%>4.5.<html>6. <head>7. <title>JSP for FileForm form</title>8. </head>9. <body>10. <html:form action="/file" enctype="multipart/form-data">11. <html:file property="file1"></html:file>12. <html:submit/><html:cancel/>13. </html:form>14. </body>15.</html>2.FileAtion.java的清单如下:Java代码1./*2. * Generated by MyEclipse Struts3. * Template path: templates/java/JavaClass.vtl4. */5.package action;6.7.import java.io.*;8.9.import javax.servlet.http.HttpServletRequest;10.import javax.servlet.http.HttpServletResponse;11.import org.apache.struts.action.Action;12.import org.apache.struts.action.ActionForm;13.import org.apache.struts.action.ActionForward;14.import org.apache.struts.action.ActionMapping;15.import org.apache.struts.upload.FormFile;16.17.import form.FileForm;18.19./**20. * @author Chris21. * Creation date: 6-27-202022. *23. * XDoclet definition:24. * @struts.action path="/file" name="fileForm" input="/file.jsp"25. */26.public class FileAction extends Action {27. /*28. * Generated Methods29. */30.31. /**32. * Method execute33. * @param mapping34. * @param form35. * @param request36. * @param response37. * @return ActionForward38. */39. public ActionForward execute(ActionMapping mapping, ActionForm form,40. HttpServletRequest request, HttpServletResponse response) {41. FileForm fileForm = (FileForm) form;42. FormFile file1=fileForm.getFile1();43. if(file1!=null){44. //上传途径45. String dir=request.getSession(true).getServletContext().getRealPath("/upload");46. OutputStream fos=null;47. try {48. fos=new FileOutputStream(dir+"/"+file1.getFileName());49. fos.write(file1.getFileData(),0,file1.getFileSize());50. fos.flush();51. } catch (Exception e) {52. // TODO Auto-generated catch block53. e.printStackTrace();54. }finally{55. try{56. fos.close();57. }catch(Exception e){}58. }59. }60. //页面跳转61. return mapping.findForward("success");62. }63.}3.FileForm.java的清单如下:Java代码1.package form;2.3.import javax.servlet.http.HttpServletRequest;4.import org.apache.struts.action.ActionErrors;5.import org.apache.struts.action.ActionForm;6.import org.apache.struts.action.ActionMapping;7.import org.apache.struts.upload.FormFile;8.9./**10. * @author Chris11. * Creation date: 6-27-202012. *13. * XDoclet definition:14. * @struts.form name="fileForm"15. */16.public class FileForm extends ActionForm {17. /*18. * Generated Methods19. */20. private FormFile file1;21. /**22. * Method validate23. * @param mapping24. * @param request25. * @return ActionErrors26. */27. public ActionErrors validate(ActionMapping mapping,28. HttpServletRequest request) {29. // TODO Auto-generated method stub30. return null;31. }32.33. /**34. * Method reset35. * @param mapping36. * @param request37. */38. public void reset(ActionMapping mapping, HttpServletRequest request) {39. // TODO Auto-generated method stub40. }41.42. public FormFile getFile1() {43. return file1;44. }45.46. public void setFile1(FormFile file1) {47. this.file1 = file1;48. }49.}4.struts-config.xml的清单如下:Java代码1.<?xml version="1.0" encoding="UTF-8"?>2.<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "/d tds/struts-config_1_2.dtd">3.4.<struts-config>5. <data-sources />6. <form-beans >7. <form-bean name="fileForm" type="form.FileForm" />8.9. </form-beans>10.11. <global-exceptions />12. <global-forwards />13. <action-mappings >14. <action15. attribute="fileForm"16. input="/file.jsp"17. name="fileForm"18. path="/file"19. type="action.FileAction"20. validate="false">21. <forward name="success" path="/file.jsp"></forward>22. </action>23.24. </action-mappings>25.26. <message-resources parameter="ApplicationResources" />27.</struts-config>5.web.xml代码清单如下:Java代码1.<?xml version="1.0" encoding="UTF-8"?>2.<web-app xmlns="java.sun/xml/ns/j2ee" xmlns:xsi="w/2001/XMLSchema-instance" version="2.4" xsi:schemaLocatio n="java.sun/xml/ns/j2ee java.sun/xml/ns/j2ee/web-app_2_4.xsd">3. <servlet>4. <servlet-name>action</servlet-name>5. <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>6. <init-param>7. <param-name>config</param-name>8. <param-value>/WEB-INF/struts-config.xml</param-value>9. </init-param>10. <init-param>11. <param-name>debug</param-name>12. <param-value>3</param-value>13. </init-param>14. <init-param>15. <param-name>detail</param-name>16. <param-value>3</param-value>17. </init-param>18. <load-on-startup>0</load-on-startup>19. </servlet>20. <servlet-mapping>21. <servlet-name>action</servlet-name>22. <url-pattern>*.do</url-pattern>23. </servlet-mapping>24.</web-app>三.在struts2中实现(以图片上传为例)1.FileUpload.jsp代码清单如下:Java代码1.<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>2.<%@ taglib prefix="s" uri="/struts-tags" %>3.<html>4. <head>5. <title>The FileUplaodDemo In Struts2</title>6. </head>7.8. <body>9. <s:form action="fileUpload.action" method="POST" enctype="multipart/form-data">10. <s:file name="myFile" label="MyFile" ></s:file>11. <s:textfield name="caption" label="Caption"></s:textfield>12. <s:submit label="提交"></s:submit>13. </s:form>14. </body>15.</html>2.ShowUpload.jsp的功能清单如下:Java代码1.<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>2.<%@ taglib prefix="s" uri="/struts-tags" %>3.<html>4. <head>5. <title>ShowUpload</title>6. </head>7.8. <body>9. <div style ="padding: 3px; border: solid 1px #cccccc; text-align: center" >10. <img src ='UploadImages/<s:property value ="imageFileName"/> '/>11. <br />12. <s:property value ="caption"/>13. </div >14. </body>15.</html>3.FileUploadAction.java的代码清单如下:Java代码1.package com.chris;2.3.import java.io.*;4.import java.util.Date;5.6.import org.apache.struts2.ServletActionContext;7.8.9.import com.opensymphony.xwork2.ActionSupport;10.11.public class FileUploadAction extends ActionSupport{12.13. private static final long serialVersionUID = 572146812454l;14. private static final int BUFFER_SIZE = 16 * 1024 ;15.16. //注意,文件上传时<s:file/>同时与myFile,myFileContentType,myFileFileName绑定17. //因此同时要提供myFileContentType,myFileFileName的set方式18.19. private File myFile; //上传文件20. private String contentType;//上传文件类型21. private String fileName; //上传文件名22. private String imageFileName;23. private String caption;//文件说明,与页面属性绑定24.25. public void setMyFileContentType(String contentType) {26. System.out.println("contentType : " + contentType);27. this .contentType = contentType;28. }29.30. public void setMyFileFileName(String fileName) {31. System.out.println("FileName : " + fileName);32. this .fileName = fileName;33. }34.35. public void setMyFile(File myFile) {36. this .myFile = myFile;37. }38.39. public String getImageFileName() {40. return imageFileName;41. }42.43. public String getCaption() {44. return caption;45. }46.47. public void setCaption(String caption) {48. this .caption = caption;49. }50.51. private static void copy(File src, File dst) {52. try {53. InputStream in = null ;54. OutputStream out = null ;55. try {56. in = new BufferedInputStream( new FileInputStream(src), BUFFER_SIZE);57. out = new BufferedOutputStream( new FileOutputStream(dst), BUFFER_SIZE);58. byte [] buffer = new byte [BUFFER_SIZE];59. while (in.read(buffer) > 0 ) {60. out.write(buffer);61. }62. } finally {63. if ( null != in) {64. in.close();65. }66. if ( null != out) {67. out.close();68. }69. }70. } catch (Exception e) {71. e.printStackTrace();72. }73. }74.75. private static String getExtention(String fileName) {76. int pos = stIndexOf(".");77. return fileName.substring(pos);78. }79.80.@Override81. public String execute() {82. imageFileName = new Date().getTime() + getExtention(fileName);83. File imageFile = new File(ServletActionContext.getServletContext().getRealPath("/UploadImages" ) + "/" + imageFileN ame);84. copy(myFile, imageFile);85. return SUCCESS;86. }87.}注:现在仅为方便实现Action因此继承ActionSupport,并Overrider execute()方式在struts2中任何一个POJO都能够作为Action4.struts.xml清单如下:Java代码1.<?xml version="1.0" encoding="UTF-8" ?>2.<!DOCTYPE struts PUBLIC3. "-//Apache Software Foundation//DTD Struts Configuration2.0//EN"4. "/dtds/struts-2.0.dtd">5.<struts>6. <package name="example" namespace="/" extends="struts-default">7. <action name="fileUpload" class="com.chris.FileUploadAction">8. <interceptor-ref name="fileUploadStack"/>9. <result>/ShowUpload.jsp</result>10. </action>11. </package>12.</struts>5.web.xml清单如下:Java代码1.<?xml version="1.0" encoding="UTF-8"?>2.<web-app version="2.4"3. xmlns="java.sun/xml/ns/j2ee"4. xmlns:xsi="/2001/XMLSchema-instance"5. xsi:schemaLocation="java.sun/xml/ns/j2ee6. java.sun/xml/ns/j2ee/web-app_2_4.xsd">7. <filter >8. <filter-name > struts-cleanup </filter-name >9. <filter-class >10. org.apache.struts2.dispatcher.ActionContextCleanUp11. </filter-class >12. </filter >13. <filter-mapping >14. <filter-name > struts-cleanup </filter-name >15. <url-pattern > /* </url-pattern >16. </filter-mapping >17.18. <filter>19. <filter-name>struts2</filter-name>20. <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>21. </filter>22. <filter-mapping>23. <filter-name>struts2</filter-name>24. <url-pattern>/*</url-pattern>25. </filter-mapping>26. <welcome-file-list>27. <welcome-file>Index.jsp</welcome-file>28. </welcome-file-list>29.30.</web-app>。
struts2 工作原理
struts2 工作原理
Struts2是一个用于构建Java web应用程序的开源框架。
它的
工作原理可以简单概括为以下几个步骤:
1. 客户端发送请求:当用户在浏览器中访问一个Struts2应用
程序的URL时,客户端会发送一个HTTP请求到服务器。
2. DispatcherServlet接收请求:服务器上运行的Servlet容器
(如Tomcat)接收到HTTP请求后,会通过web.xml配置文
件将请求发送给Struts2的核心组件DispatcherServlet。
3. 动作(Action)处理:DispatcherServlet根据配置文件中的信息,确定请求对应的Action类,并创建该类的实例。
Action是一
个POJO(Plain Old Java Object)类,用于处理具体的业务逻辑。
4. 结果视图(View)解析:Action类中的方法执行完业务逻辑后,会返回一个结果视图。
Struts2的结果视图可以是JSP页面、HTML、JSON等格式。
DispatcherServlet根据配置文件中指定
的结果视图解析器,将结果视图转化为最终的响应内容。
5. 结果响应:DispatcherServlet将最终的响应内容发送给客户端,客户端浏览器会将响应内容渲染并呈现给用户。
在这个过程中,Struts2框架提供了一系列的核心组件来协助
处理请求和响应,包括拦截器(Interceptor)、值栈(ValueStack)、类型转换器(Type Converter)等。
这些组件
能够帮助开发者处理表单提交、数据验证、数据转换等常见的web开发任务,从而简化开发过程。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Struts1 文件上传在Web程序中的上传文件的功能一般会使用<input type=file.../>标签在客户端显示输入要上传的文件名的用户接口。
如果读者使用过JSP/Servlet来处理客户端上传的文件就会知道,实现这个功能并不是很容易。
而在Struts中为我们提供了一种机制,可以非常方便地将客户端上传的文件保存在服务端。
在Struts Html标签库中提供了一个<html:file>标签,可以和FormFile类型的属性一起使用。
通过这个属性返回的FormFile对象,就可以很方便地获得上传文件的InputStream对象,并做进一步地处理。
在Struts中,一个FormFile对象代表一个上传的文件。
FormFile实际上是一个接口,我们可以在org.apache.struts.upload包中找到这个接口。
FormFile接口有如下五个常用的方法:1. getInputStream()方法这个方法用于获得上传文件的java.io.InputStream对象,我们可以从这个InputStream对象中读取上传文件的数据,并将其写到服务端指定的路径下。
2. getFileData()方法这个方法用于将上传文件的整个内容放到一个byte类型的数组中,如果上传文件的尺寸比较小的话,使用这个方法可以很方便地将上传文件保存到在服务端的指定路径中。
3. getFileName()方法这个方法用于获得上传文件的文件名(不包括文件在客户机的路径部分)。
4. getFileSize()方法这个方法用于获得上传文件的字节数。
5. destroy()方法用于销毁所有和当前上传文件相关的资源。
下面的例子演示了如何使用<html:file>标签和FormFile对象来上传单个文件。
实现这个例子需要如下六步:【第1步】建立上传文件的JSP页面在<samples工程目录>目录中建立一个uploadFile.jsp文件,代码如下:<%@ page pageEncoding="GBK"%><%@ taglib uri="/tags-..." prefix="html"%><html><head><title>上传单个文件(文件大小不能超过2M) </title></head><body><%-- 在<html:form>标签中必须加enctype="multipart/form-data" --%><html:form enctype="multipart/form-data" action="uploadFile"><html:file property="myFile"/><p> <%-- 使用<html:file>标签让用户输入上传文件名--%><html:submit value="上传"/></html:form></body></html>【第2步】建立ActionForm的子类在<samples工程目录>"src"actionform目录中建立一个UploadForm.java文件,代码如下:package actionform;import org.apache.struts.action.*;import org.apache.struts.upload.FormFile;public class UploadForm extends ActionForm{private FormFile myFile; // 这个myFile代表要上传的文件public FormFile getMyFile(){return myFile;}public void setMyFile(FormFile myFile){this.myFile = myFile;}}【第3步】建立Struts动作类(Action的子类)在Struts中,一般在Struts的动作类中处理上传的文件。
在<samples工程目录>"src"action 目录中建立一个UploadAction.java文件,代码如下:package action;import javax.servlet.http.*;import org.apache.struts.action.*;import org.apache.struts.upload.FormFile;import java.io.*;import actionform.*;public class UploadAction extends Action{protected void saveFile(FormFile formFile) throws Exception{// 从web.xml文件中获得指定的上传路径String path = this.getServlet().getServletConfig().getInitParameter("uploadPath");InputStream in = formFile.getInputStream(); // 获得上传文件的InputStream// 在服务端指定的上传路径中建立一个空的文件(文件名为getFileName()方法返回的值)FileOutputStream fout = new FileOutputStream(path + formFile.getFileName());byte buffer[] = new byte[8192];int count = 0;// 开始向上传路径中刚建立的文件写入数据,每次写8k字节while ((count = in.read(buffer)) > 0){fout.write(buffer, 0, count);}fout.close();formFile.destroy(); // 上传成功后,销毁当前上传文件的资源}public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response){UploadForm uForm = (UploadForm) form;PrintWriter out = null;try{response.setCharacterEncoding("GBK");out = response.getWriter();saveFile(uForm.getMyFile()); // 将上传文件保存到指写的路径(在web.xml中配置)out.println("上传文件成功.");}catch (Exception e){out.println(e.getMessage());}return null;}}在saveFile方法中,首先从web.xml的Servlet初始化参数中获得一个用于保存上传文件的路径。
然后从FormFile对象中获得上传文件的InputStream对象,并对这个InputStream对象中的字节进行循环读取,并写到新的文件中。
最后,在上传成功后,将FormFile 对象销毁。
【第4步】配置struts-config.xml在这一步来配置一下在第2步和第3步分别建立的ActionForm和Action的子类。
打开struts-config.xml文件,在<form-beans>中加入如下的子标签:<form-bean name="uploadForm" type="actionform.UploadForm" />在<action-mappings>中加入如下的子标签:<action name="uploadForm" path="/uploadFile" scope="request" type="action.UploadAction" /> 【第5步】设置用于保存上传文件的路径打开web.xml文件,找到一个叫action的Servlet(也就是用于处理Struts动作的Servlet),并在<servlet>中加入如下的子标签(假设保存上传文件的路径为D:"upload",路径的最后一个字符必须是“"”):<init-param><param-name>uploadPath</param-name><param-value>D:\upload\</param-value></init-param>【第6步】限制上传文件的大小这一步是可选的,如果不限制上传文件的大小,就意味着可以上传任意大小的文件。
而一般的应用程序,如电子相册,网络硬盘都会限制上传文件的最大尺寸。
打开struts-config.xml文件,在<struts-config>中加入如下的子标签:<controller maxFileSize="2M" />上面的<controller>标签将上传文件的最大尺寸设为2M,maxFileSize属性值的单位可以是M,也可以是K或G,如2K,5G等。