文件的上传和下载是Web应用中常用的功能。一般情况下可以通过使用二进制编码的方式来获得请求参数的值,从而通过二进制流来获得上传文件内容。这种手动编程方式比较麻烦,需要手动地控制二进制流,相当复杂。不过可以使用其他开源组织提供的上传项目来简单地完成文件上传。下面通过Struts2框架来完成文件的上传。
第一步:在WEB-INF/lib下加入commons-fileupload-1.2.1.jar、commons-io-1.3.2.jar(如果要用到FileUtils类)。这2个文件可以从http://commons.apache.org/下载
第二步:把form表单的enctype设置为:"mulipart/form-data",如下:
<form action="${pageContext.request.contextPath }/test/hello" enctype="multipart/form-data" method="post"> <input type="file" name="myFile"/> <input type="submit" value="上传"/> </form>
第三步:在action中添加如下属性:
public class HelloWorldAction { private File myFile; // 上传的文件,变量名要与表单中file类型的属性名相同 private String myFileFileName; // 上传的文件名,变量的名字为File的变量名myFile+FileName(这是固定写法) private String myFileContentType; // 上传的文件类型,变量的名字为File的变量名myFile+ContentType(这是固定写法) public File getMyFile() { return myFile; } public void setMyFile(File myFile) { this.myFile = myFile; } public String getMyFileFileName() { return myFileFileName; } public void setMyFileFileName(String myFileFileName) { this.myFileFileName = myFileFileName; } public String getMyFileContentType() { return myFileContentType; } public void setMyFileContentType(String myFileContentType) { this.myFileContentType = myFileContentType; } public String execute() throws Exception { String realPath = ServletActionContext.getServletContext().getRealPath( "/files"); System.out.println(realPath); File destFile = new File(new File(realPath), myFileFileName); if (myFile != null) { /* 如果保存文件目录的上一级目录不存在 */ if (!destFile.getParentFile().exists()) { destFile.getParentFile().mkdirs(); } /* 赋值文件到目标文件 */ FileUtils.copyFile(myFile, destFile); ActionContext ctx = ActionContext.getContext(); ctx.put("message", "上传成功"); ctx.put("file", this.getMyFile()); ctx.put("fileName", this.getMyFileFileName()); ctx.put("fileContentType", this.getMyFileContentType()); } return "success"; } }
action中的属性名称要和表单中的文件类型的属性名称一致
struts.xml的配置:
<struts> <constant name="struts.configuration.xml.reload" value="true" /> <package name="itcast" namespace="/test" extends="struts-default"> <action name="hello" class="cn.itcast.action.HelloWorldAction" method="execute" > <result name="success">/WEB-INF/page/hello.jsp</result> </action> </package> </struts>
hello.jsp:
<body> ${requestScope.message }<br/> ${requestScope.file }<br/> ${requestScope.fileName }<br/> ${requestScope.fileContentType }<br/> </body>
说明:如果是多文件上传,需要在action中把文件的类型定义为数组或者是集合类型
package com.struts.action; import java.io.File; public class FileUploadAction { private File[] myFile; private String[] myFileFileName; public File[] getMyFile() { return myFile; } public void setMyFile(File[] myFile) { this.myFile = myFile; } public String[] getMyFileFileName() { return myFileFileName; } public void setMyFileFileName(String[] myFileFileName) { this.myFileFileName = myFileFileName; } }
响应的页面为:
<form action="${pageContext.request.contextPath }/test/hello" enctype="multipart/form-data" method="post"> <input type="file" name="myFile"/> <input type="file" name="myFile"/> <input type="submit" value="上传"/> </form>
相关推荐
commons-fileupload-1.2.1.jar//文件上传时用的,为了以后用到,最好加入 commons-io-1.3.2.jar//同上 commons-logging-1.0.4.jar freemarker-2.3.16.jar javassist-3.7.ga.jar ognl-3.0.jar struts2-core-2.2.1.1....
除此之外,Struts2还依赖于其他一些库,如OGNL(Object-Graph Navigation Language)用于表达式语言,Freemarker或Velocity用于视图模板,以及各种插件来支持特定的功能,如文件上传、JSON处理等。 在标签中提到了...
该漏洞与Apache Struts2 (S2-045)远程代码执行漏洞原理基本相同,均是由于上传功能的异常处理函数没有正确处理用户输入的错误信息,导致远程攻击者可通过发送恶意的数据包,利用该漏洞在受影响服务器上执行任意...
- `struts2-convention-plugin.jar`: 提供了基于约定优于配置的功能,使得开发者无需手动编写大量的XML配置,而是根据文件命名规则自动绑定Action和结果。 3. **拦截器库** - `struts2-dojo-plugin.jar`: 提供了...
该漏洞是由于 Struts2 中的 MultiPartRequestWrapper 类中的一个错误导致的,该错误可能会导致攻击者可以上传恶意文件,进而导致服务器崩溃或数据泄露。 修补方法 为了修复 S2-045 漏洞,我们可以采取以下步骤: 1...
在压缩包子文件的文件名称列表"struts_jar"中,很可能包含的是与Struts2相关的所有依赖库,便于构建一个完整的Struts2应用环境。使用这样的集合可以快速搭建Struts2项目,并确保所有必要的库都已就绪。 总结来说,...
修复S2-045:Struts 2远程执行代码漏洞,时用到的jar,漏洞影响:基于Jakarta Multipart解析器执行文件上传时可能的RCE 影响版本:Struts 2.3.5 - Struts 2.3.31 Struts 2.5 - Struts 2.5.10
- `commons-fileupload`: 处理HTTP文件上传的库,Struts2使用它来支持用户上传文件。 - `commons-lang3`: Apache Commons提供的Java实用工具类库,增强Java的基本功能。 - `javassist`: 动态代码生成库,Struts2...
本版本支持elasticsearch java语言远程命令执行及文件上传elasticsearchgroov语言远程命令执行及文件上传struts2-005,struts2-009,struts2-013,struts2-016,struts2-019,struts2-020,struts2-devmode,struts2...
Struts2-upload-jar是Apache Struts框架的一个插件,主要功能是支持文件上传和下载。Struts2作为Java EE领域中的一个流行MVC(Model-View-Controller)框架,为开发者提供了处理用户请求、展示视图以及业务逻辑集成...
在Struts2中,它用于处理文件上传和下载等操作。 9. **commons-fileupload-1.3.3.jar**:Apache Commons FileUpload是处理HTTP多部分表单数据的库,常用于处理用户上传的文件。在Struts2中,结合commons-io库,实现...
2. Struts2中的文件上传:Struts2提供了更简洁的文件上传方式。在JSP页面中,可以使用`<s:file>`标签来创建文件选择控件。在Action类中,使用`@SkipValidation`注解标记文件上传方法,然后定义对应的`java.io.File`...
样例通常包含了一些基础的功能实现,如表单验证、文件上传下载、拦截器使用等,可以帮助开发者快速上手并理解Struts2的基本用法。通过研究这些样例,开发者可以学习到如何配置Struts2、如何编写Action类、如何使用...
首先,为了支持文件上传,我们需要在Struts2的核心配置文件`struts.xml`中添加相应的拦截器。Struts2内置了一个名为`params`的拦截器,可以处理表单数据,但不包括文件。因此,我们需要引入`fileUpload`拦截器,该...
"struts2-多文件上传2"这个项目显然是关于如何在Struts2中实现多文件上传功能的一个实例,特别是通过使用数组的方式来处理多个文件。 在Struts2中,多文件上传的核心在于使用`<s:file>`标签,它可以嵌套在表单中,...
在“struts2-多文件上传”这个主题中,我们将深入探讨如何使用Struts2实现用户界面中多个文件的同时上传功能。 在web应用中,允许用户上传文件是一项常见的需求。例如,用户可能需要上传照片、文档或者其他类型的...
优化部分EXP在部分情况下被WAF拦截的问题,提高检测成功率,优化自定义上传路径exp,文件所在目录不存在时自动创建目录,防止文件因为目录不存在,导致上传失败。 2018-08-24: 增加S2-057 Struts 2.3 to 2.3.34,...
struts2-core-2.x.x.jar : Struts2 框架的核心类库 b. xwork-core-2.x.x.jar: XWork类库,Struts2在其上构建 c. ognl-2.6.x.jar: 对象图导航语言(Object Graph Navigation Language),Struts2框架通过其读写对象的...
"struts2-apps.rar"这个压缩包文件包含了多个示例项目,可以帮助学习者深入理解Struts2框架的工作原理和实践应用。 1. **Struts2框架核心概念**: - **Action类**:在Struts2中,Action类是业务逻辑的主要载体,它...