Struts2 文件上传与下载实战指南

需积分: 3 12 下载量 150 浏览量 更新于2024-08-02 收藏 127KB DOCX 举报
“Struts2文件的上传和下载教程” 在Java Web开发中,Struts2是一个非常流行的MVC框架,它提供了处理文件上传和下载的功能。本文将详细介绍如何使用Struts2实现这两个功能。 实现原理 Struts2文件上传功能的核心是Apache Commons FileUpload库。当用户通过浏览器上传文件时,HTTP请求的数据会被Commons FileUpload组件暂存到服务器的一个临时目录中。Struts2的`fileUpload`拦截器负责将这些上传的文件绑定到Action类的属性上,使得我们可以在Action中像操作普通文件一样操作上传的文件。 具体实现步骤 1. 配置依赖 在进行Struts2文件上传之前,确保项目中已经添加了以下依赖: - Struts2核心库 - Commons FileUpload库 - Commons IO库 2. 创建上传页面 创建一个名为`FileUpload.jsp`的JSP页面,设置表单以POST方式提交,并且`enctype`属性设为`multipart/form-data`,这是上传文件必须的设置。在页面中使用Struts2的`s:form`标签创建一个文件上传输入框,如清单2所示: ```jsp <%@taglibprefix="s"uri="/struts-tags"%> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Struts2 文件上传</title> </head> <body> <s:form action="fileUpload" method="POST" enctype="multipart/form-data"> <s:file name="myFile" label="图片文件"/> <s:textfield name="caption" label="描述"/> <s:submit/> </s:form> </body> </html> ``` 这里的`s:file`标签将文件选择器与Action中的`myFile`属性关联,`s:textfield`用于输入文件的描述。 3. 编写Action类 创建一个名为`FileUploadAction`的Java类,继承自`ActionSupport`,并实现文件上传的相关方法。例如,可以添加一个`saveUpload()`方法来处理文件上传,如下所示: ```java public class FileUploadAction extends ActionSupport { private File myFile; private String myFileContentType; private String myFileFileName; private String caption; // getters and setters... public String saveUpload() { try { // 检查文件是否为空 if (myFile != null && myFile.getSize() > 0) { // 获取文件名 String fileName = myFileFileName; // 文件保存路径 String savePath = "/path/to/save/uploaded/files/"; File saveDir = new File(savePath); if (!saveDir.exists()) { saveDir.mkdirs(); } // 新文件名,防止同名覆盖 fileName = new Date().getTime() + "_" + fileName; File serverFile = new File(savePath + fileName); // 将上传文件保存到服务器 FileUtils.copyFile(myFile, serverFile); // 保存其他相关信息,如文件描述等 // ... return SUCCESS; } else { addFieldError("myFile", "请选择要上传的文件"); return INPUT; } } catch (Exception e) { e.printStackTrace(); return ERROR; } } } ``` 在这个例子中,`myFile`是上传文件的实例,`myFileContentType`和`myFileFileName`分别表示文件的MIME类型和原始文件名。`saveUpload()`方法中,我们首先检查文件是否为空,然后将文件保存到服务器指定的目录,并可能对文件名进行处理以避免覆盖已存在的文件。 4. 配置Struts2 在`struts.xml`配置文件中,定义Action及其结果: ```xml <package name="default" namespace="/" extends="struts-default"> <action name="fileUpload" class="com.example.FileUploadAction" method="saveUpload"> <result name="success">/uploadSuccess.jsp</result> <result name="input">/FileUpload.jsp</result> <result name="error">/error.jsp</result> </action> </package> ``` 这样,当用户点击提交后,Struts2会调用`saveUpload()`方法处理文件上传,并根据返回的结果重定向到相应的JSP页面。 5. 文件下载 对于文件下载,你可以创建一个Action来提供文件的URL,然后在页面上创建一个链接指向这个URL。在Action中,你可以使用`StreamingResult`或者直接输出文件内容到响应流中。 总结 通过上述步骤,我们可以实现Struts2框架下的文件上传和下载功能。在实际应用中,还需要考虑错误处理、文件大小限制、安全问题(如防止路径遍历攻击)等细节。理解这些基本概念和实践,可以帮助开发者更好地在Struts2项目中处理文件操作。