Struts2框架文件上传下载详解

0 下载量 167 浏览量 更新于2024-08-29 收藏 63KB PDF 举报
"这篇文档主要讨论了在Java框架Struts2中如何实现文件上传和下载功能。Struts2提供了一种内置机制来处理基于HTML表单的文件上传,上传后的文件通常会被暂时存储在服务器的一个特定目录中,等待Action类进行进一步处理或移动到安全的位置。同时,由于服务器的安全策略,可能不允许直接写入除临时目录和Web应用目录之外的其他地方。文件上传在Struts2中是通过预定义的拦截器`org.apache.struts2.interceptor.FileUploadInterceptor`来实现的,该拦截器是defaultStack的一部分,允许在`struts.xml`配置文件中设置不同的参数以定制上传行为。" 在Struts2中实现文件上传的步骤主要包括以下几点: 1. HTML表单设置:创建一个包含`enctype="multipart/form-data"`属性的HTML表单,以便支持文件上传。例如: ```html <form action="upload.action" method="post" enctype="multipart/form-data"> <input type="file" name="file" /> <input type="submit" value="Upload" /> </form> ``` 2. 配置拦截器:在`struts.xml`配置文件中,确保`FileUploadInterceptor`拦截器已经添加到了Action的配置中。默认情况下,`struts-default`包已经包含了这个拦截器,但如果你需要自定义设置,可以这样配置: ```xml <action name="upload" class="com.example.UploadAction"> <interceptor-ref name="defaultStack"/> <!-- 如果需要自定义配置,可以替换默认的FileUploadInterceptor --> <!--<interceptor-ref name="fileUpload"> <param name="maximumSize">1048576</param> <param name="allowedTypes">image/jpeg,image/png</param> </interceptor-ref>--> <result name="success">/success.jsp</result> <result name="error">/error.jsp</result> </action> ``` 这里的`<param>`标签可以用来设置最大文件大小、允许的文件类型等。 3. Action类处理:在Action类中,使用`ServletFileUpload`和`FileItem`接口来处理上传的文件。例如: ```java public class UploadAction extends ActionSupport { private File file; private String fileName; private String contentType; // getters and setters... public String execute() { DiskFileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); try { List<FileItem> items = upload.parseRequest(getServletActionContext().getRequest()); for (FileItem item : items) { if (!item.isFormField()) { file = item.getFile(); fileName = item.getName(); contentType = item.getContentType(); // 这里可以处理文件,如保存到服务器指定目录 } } } catch (Exception e) { // 处理异常 } return SUCCESS; } } ``` 对于文件下载,Struts2也提供了一种简单的方法。你可以创建一个Action,从服务器读取文件并将其作为响应流返回给客户端。以下是一个简单的下载Action示例: ```java public class DownloadAction extends ActionSupport { private File file; private String fileName; // getters and setters... public InputStream getInputStream() throws Exception { return new FileInputStream(file); } public String getFileName() { return fileName; } public String execute() { // 这里根据需要获取要下载的文件 file = new File("/path/to/download/file"); fileName = "downloadedFile.txt"; return SUCCESS; } } ``` 然后在`struts.xml`中配置Action,并设置结果类型为stream,例如: ```xml <action name="download" class="com.example.DownloadAction"> <result type="stream"> <param name="contentType">application/octet-stream</param> <param name="inputName">inputStream</param> <param name="contentDisposition">attachment;filename="${fileName}"</param> <param name="bufferSize">1024</param> </result> </action> ``` 这样,当用户访问`download.action`时,就会触发下载操作,浏览器将以附件的形式下载指定的文件。 Struts2框架为开发者提供了方便的文件上传和下载功能,通过预定义的拦截器和Action类的处理,能够有效地管理文件操作,提高了开发效率和安全性。在实际应用中,需要注意文件存储路径的安全性,防止恶意文件上传,以及对上传和下载文件的大小、类型进行有效控制,以确保系统的稳定性和安全性。