file-type

Struts2实现文件上传与下载的详细教程

下载需积分: 9 | 7.12MB | 更新于2025-05-01 | 188 浏览量 | 0 下载量 举报 收藏
download 立即下载
Struts2作为Apache基金会下的一个开源Web应用框架,是Struts的更新版,广泛用于Java EE的MVC模型。在Web开发中,文件上传与下载是常见的功能需求,Struts2框架提供了简单且有效的方式来实现这些功能。本篇将详细解读Struts2框架下的文件上传和下载实例的知识点。 ### Struts2文件上传 #### 文件上传流程 在Struts2框架中实现文件上传,需要遵循以下步骤: 1. 引入Struts2提供的文件上传支持库。通常在项目的`WEB-INF/lib`目录中添加`struts2-spring-plugin-x.x.x.jar`和`struts2-convention-plugin-x.x.x.jar`(版本号根据实际情况填写)。 2. 配置`struts.xml`文件。为了启用文件上传支持,需要在struts.xml文件中配置`<constant name="struts.multipart.enabled" value="true" />`,这个配置会告诉Struts2框架允许上传文件。 3. 创建上传表单。上传表单需要包含`enctype="multipart/form-data"`属性,确保表单数据以正确的格式传输。 4. 实现文件上传的Action类。创建一个Action类,该类中定义好文件接收的属性,并通过`@ multipart`注解修饰这些属性。 5. 在`struts.xml`中配置上传Action的映射。 #### 示例代码 下面是一个简单的文件上传示例: **上传表单** ```html <form action="" method="post" enctype="multipart/form-data"> 选择文件: <input type="file" name="file" /> <input type="submit" value="上传" /> </form> ``` **Action类** ```java import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.FileManager; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.apache.commons.io.IOUtils; import javax.servlet.http.HttpServletRequest; import java.io.*; public class UploadAction extends ActionSupport { private File file; private String fileContentType; private String fileFileName; public boolean execute() { boolean isMultipart = ServletFileUpload.isMultipartContent(request); if (!isMultipart) { return false; } try { DiskFileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); List<FileItem> formItems = upload.parseRequest(request); if (formItems != null && formItems.size() > 0) { for (FileItem item : formItems) { if (!item.isFormField()) { String fileName = new File(item.getName()).getName(); String filePath = "/uploadDir/"; File storeFile = new File(filePath + fileName); file = storeFile; fileContentType = item.getContentType(); fileFileName = item.getName(); IOUtils.copy(item.getInputStream(), new FileOutputStream(storeFile)); break; } } } } catch (Exception ex) { ex.printStackTrace(); } return true; } // Getter and setter methods } ``` **struts.xml** ```xml <action name="upload" class="com.example.UploadAction"> <result name="success">/success.jsp</result> </action> ``` ### Struts2文件下载 #### 文件下载流程 文件下载功能在Struts2框架中的实现步骤: 1. 创建下载文件的Action类,并在其中提供文件的字节数据。 2. 在`struts.xml`文件中配置下载Action的映射。 3. 处理请求的Action中,将文件以字节流的形式输出,并设置响应头(如Content-Type和Content-Disposition)来指示浏览器这是一个文件下载响应。 #### 示例代码 以下是一个简单的文件下载示例: **Action类** ```java import com.opensymphony.xwork2.ActionSupport; import javax.servlet.http.HttpServletResponse; import java.io.*; public class DownloadAction extends ActionSupport { private File file; public String execute() throws IOException { String fileName = request.getParameter("filename"); file = new File("/downloadDir/", fileName); if (file.exists()) { response.setHeader("Content-Disposition", "attachment;filename=" + fileName); response.setContentType("application/octet-stream"); OutputStream output = response.getOutputStream(); FileInputStream fileInputStream = new FileInputStream(file); IOUtils.copy(fileInputStream, output); output.flush(); output.close(); fileInputStream.close(); } else { return ERROR; } return SUCCESS; } } ``` **struts.xml** ```xml <action name="download" class="com.example.DownloadAction"> <result name="success" type="stream"> <param name="inputName">fileInputStream</param> <param name="contentType">application/octet-stream</param> <param name="contentDisposition">attachment;filename=${filename}</param> </result> </action> ``` ### 知识点总结 1. **Struts2的文件上传**,关键在于正确配置`struts.xml`文件中的`struts.multipart.enabled`属性,以及在上传表单中设置`enctype`属性为`multipart/form-data`。 2. **文件上传的Action类**,需要使用commons-fileupload包中的类来处理上传文件,并通过`@multipart`注解定义文件属性。 3. **文件下载的实现**,是在一个Action类中读取文件内容,并使用`response.getOutputStream()`输出文件流。 4. **配置文件下载**,则通过`struts.xml`中的`<result>`标签并指定`type="stream"`来完成,需设置正确的`inputName`、`contentType`和`contentDisposition`参数。 5. **异常处理**,在处理文件上传和下载的过程中,应仔细处理可能出现的异常,如文件不存在、读写错误等,并给出合适的错误提示。 6. **安全性考虑**,在实际开发中,文件上传与下载功能还需要考虑安全性问题,比如验证上传文件的类型、大小,以及防止文件名被注入等安全风险。 通过以上知识点,可以构建一个基于Struts2框架的文件上传和下载功能。这些功能不仅适用于简单的示例,同样适用于生产环境中复杂的应用场景。开发者在实际应用中需要结合具体业务需求进行相应的调整和优化。

相关推荐