所提供的 downloadServlet.java 是 Efw 框架中的一个专用 Servlet,负责使客户端能够从服务器下载文件

此 Servlet 不仅提供单个文件的下载,还提供多功能下载处理,包括将多个文件打包成 ZIP 压缩文件,并可以设置密码保护。与 previewServlet 类似,其处理协作是通过服务器端 JavaScript (efw.server.js) 和 Session 完成的。


📦 对 downloadServlet.java 的分析:文件下载处理

1. 作用和机制


2. 处理流程 (doGet)

A. 获取下载选项并清除 Session

  1. 从 Session 获取: 从 Session 中获取下载所需的所有选项(文件路径、ZIP 列表、保存名称、密码、下载后删除标志等)。
  2. 立即删除: 获取后,为确保安全,立即删除所有相关的 Session 属性

B. ZIP 压缩处理 (有条件)

if(attr_zip!=null&&!"".equals(attr_zip)){
    // ... 创建临时 ZIP 文件
    // ... 调用 FileManager.zip() 生成 ZIP 文件
    // ... 将 attr_file 设置为临时 ZIP 文件名
}

C. 设置响应头

  1. 设置默认文件名:
    • ZIP 文件默认为 "attachment.zip"
    • 单个文件则从文件路径中获取文件名,并设置为下载文件名(attr_saveas)。
  2. MIME 类型: 设置 response.setContentType("application/octet-stream")。这是最常见的 MIME 类型,用于强制浏览器打开下载对话框,无论文件类型如何(与 previewServlet 的内嵌显示形成对比)。
  3. Content-Disposition:
    • 设置 Content-Disposition: attachment; filename="..." 响应头。
    • 文件名(attr_saveas)使用 java.net.URLEncoder.encode 进行编码,以支持日文等多字节字符。
  4. 设置 Cookie: 添加 efw_Downloaded=OK 这个 Cookie。

D. 读取和发送文件

E. 下载后的清理

下载完成后,根据选项删除资源。


3. previewServletdownloadServlet 的比较

项目 previewServlet.java downloadServlet.java
URL /previewServlet /downloadServlet
目的 在浏览器内内嵌显示文件内容。 强制客户端将文件保存到本地。
MIME 类型 设置文件固有的 MIME 类型。 设置 application/octet-stream(强制下载)。
安全性 文件大小限制 (10MB)。 提供带密码的 ZIP 压缩选项。
资源管理 没有特定的临时文件删除功能。 具有下载后删除源文件 (deleteafterdownload) 功能和临时 ZIP 文件的确保删除。

两个 Servlet 都采用了从 efw.server.js 通过 Session 接收文件路径的共同机制,但它们在响应头设置和资源管理方面的逻辑完全不同,以适应各自的目的。