Struts2 文件上传实战:从原理到代码实现

需积分: 9 7 下载量 12 浏览量 更新于2024-09-17 收藏 19KB DOCX 举报
"此资源提供了一个使用Struts2框架上传图片的简单示例,演示了如何在Java Web应用中处理文件上传功能。" Struts2是一个流行的开源MVC框架,用于构建Java Web应用程序。在该框架中,实现文件上传功能通常涉及使用Apache Commons FileUpload库。这个示例展示了如何在Struts2环境中集成FileUpload,以便用户可以通过网页上传图片文件。 首先,我们需要在JSP页面(FileUpload.jsp)中创建一个表单,让用户选择要上传的文件。表单需要设置`enctype="multipart/form-data"`,这是处理文件上传所必需的属性。此外,`ContentEditable="false"`属性可以防止用户直接在文件输入字段内输入内容,确保只能通过浏览按钮选择文件。 ```jsp <form action="fileUpload" method="POST" enctype="multipart/form-data"> <input type="file" name="file" ContentEditable="false"/> </form> ``` 表单提交后,请求会被Struts2的Action处理。在这个示例中,Action类可能是这样的: ```java package tutorial; import java.io.*; import org.apache.struts2.ServletActionContext; import org.apache.struts2.interceptor.FileUploadInterceptor; public class FileUploadAction { private File file; private String fileContentType; private String fileFileName; public String execute() throws Exception { // 获取上传文件的临时路径 String filePath = ServletActionContext.getServletContext().getRealPath("/") + "uploads/" + new Date().getTime() + "_" + fileFileName; // 创建目标文件 File targetFile = new File(filePath); // 将上传的文件移动到服务器指定目录 BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file)); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(targetFile)); byte[] buffer = new byte[1024]; int len; while ((len = bis.read(buffer)) != -1) { bos.write(buffer, 0, len); } bis.close(); bos.close(); return "success"; } // getter 和 setter 略... } ``` 在这个Action类中,`execute()`方法处理上传请求。它首先获取文件的临时路径,然后创建一个新的文件对象以保存上传的图片。接下来,使用`BufferedInputStream`和`BufferedOutputStream`读取并写入文件内容,从而完成文件的移动。最后,Action返回一个表示成功的字符串,这通常会触发Struts2配置中定义的视图来显示结果。 为了使Struts2能够处理文件上传,还需要确保在配置文件(如struts.xml)中添加了`FileUploadInterceptor`拦截器,并将其应用于相应的Action配置: ```xml <package name="default" namespace="/" extends="struts-default"> <interceptors> <interceptor name="fileUpload" class="org.apache.struts2.interceptor.FileUploadInterceptor"/> <interceptor-stack name="myStack"> <interceptor-ref name="fileUpload"/> <!-- 其他可能的拦截器 --> <interceptor-ref name="defaultStack"/> </interceptor-stack> </interceptors> <default-interceptor-ref name="myStack"/> <action name="fileUpload" class="tutorial.FileUploadAction"> <result name="success">/FileUploadSuccess.jsp</result> </action> </package> ``` 在这个配置中,`FileUploadInterceptor`被添加到自定义的拦截器栈中,`defaultStack`包含了Struts2的默认拦截器,确保了Action的正常执行。Action配置指定了文件上传成功后的结果页面。 这个示例提供了使用Struts2和Apache Commons FileUpload实现图片上传的基本步骤,包括前端表单的创建、后端Action的编写以及Struts2配置的设定。开发者可以根据实际需求扩展这个示例,例如添加错误处理、文件大小限制、文件类型检查等更复杂的功能。