Struts1是一个经典的Java Web框架,它为开发者提供了一种结构化的方式来构建MVC(Model-View-Controller)应用程序。在Struts1中实现文件上传和下载是常见的需求,这通常涉及到用户通过Web界面交互地上传文件到服务器,或者从服务器下载文件到本地计算机。
一、文件上传
1. **配置ActionForm**:你需要创建一个继承自Struts的`ActionForm`类,添加一个`File`类型的属性来接收用户上传的文件。例如,你可以定义一个名为`fileUpload`的属性。
2. **JSP页面**:在JSP页面中,使用HTML的`<input type="file">`标签让用户选择要上传的文件。同时,需要设置`enctype="multipart/form-data"`,这是处理文件上传所必需的。
3. **配置struts-config.xml**:在Struts配置文件中,定义一个对应的Action,指定其关联的Form Bean和处理方法。
4. **处理Action**:在Action类的execute方法中,使用Apache Commons FileUpload库来解析请求中的多部分数据。这个库提供了`FileItem`接口,你可以通过这个接口获取到上传的文件内容,并将其保存到服务器的某个位置。
二、文件下载
1. **创建下载Action**:创建一个新的Action类,定义一个方法来处理文件下载请求。
2. **读取文件**:在该方法中,通过文件路径读取要下载的文件内容。可以使用`java.io.File`和`java.io.FileInputStream`等类。
3. **设置响应头**:为了正确触发浏览器的下载行为,需要设置HTTP响应头,包括Content-Type(文件类型)、Content-Disposition(指定附件名称)和Content-Length(文件大小)。
4. **流化输出**:将文件内容写入到HttpServletResponse的OutputStream中,这样浏览器就会开始下载文件。
5. **配置struts-config.xml**:同样地,在配置文件中定义这个Action,指明请求映射和Action类。
三、安全与优化
1. **验证文件大小和类型**:在接收文件上传时,需要检查文件大小以防止DoS攻击,并验证文件类型以确保安全性。
2. **处理异常**:对可能出现的IO异常和安全异常进行捕获和处理,避免程序中断。
3. **文件命名规则**:上传的文件名可能包含特殊字符或导致路径遍历攻击,应规范化文件名,如使用时间戳或随机字符串。
4. **资源管理**:在处理文件后,记得关闭打开的文件流和其他资源,避免资源泄漏。
5. **缓存控制**:对于下载,可以设置适当的缓存控制策略,比如设置Last-Modified和ETag头部,以便于客户端缓存。
以上是使用Struts1实现文件上传下载的基本流程和关键点。实际开发中,你可能还需要考虑其他因素,如用户界面的优化、错误处理、性能优化等,确保整个过程既安全又高效。在实际操作中,务必参照具体项目的配置和需求进行调整。