一、如何使用
如果此Servlet命名為download,請求的URL為:/download?path=xxx,請求后出現下載窗口:
二、源碼
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class FileDownload extends HttpServlet {
protected void service(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
// 服務器相對路徑
String path = req.getParameter("path");
// 服務器絕對路徑
path = getServletContext().getRealPath("/") + path;
// 檢查文件是否存在
File obj = new File(path);
if (!obj.exists()) {
res.setContentType("text/html;charset=GBK");
res.getWriter().print("指定文件不存在!");
return;
}
// 讀取文件名:用于設置客戶端保存時指定默認文件名
int index = path.lastIndexOf("\\"); // 前提:傳入的path字符串以“\”表示目錄分隔符
String fileName = path.substring(index + 1);
// 寫流文件到前端瀏覽器
ServletOutputStream out = res.getOutputStream();
res.setHeader("Content-disposition", "attachment;filename=" + fileName);
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
bis = new BufferedInputStream(new FileInputStream(path));
bos = new BufferedOutputStream(out);
byte[] buff = new byte[2048];
int bytesRead;
while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
bos.write(buff, 0, bytesRead);
}
} catch (IOException e) {
throw e;
} finally {
if (bis != null)
bis.close();
if (bos != null)
bos.close();
}
}
}
三、web.xml配置
<servlet>
<servlet-name>FileDownload</servlet-name>
<servlet-class>com.fastunit.test.FileDownload</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FileDownload</servlet-name>
<url-pattern>/download</url-pattern>
</servlet-mapping>
四、補充說明
本例只是一個簡單實現,應用時需要在實際環境中處理以下問題:
1. 權限問題:結合實際系統增加用戶權限控制
2. 中文文件名:中文問題與運行環境有關,不同環境下解決方式也有差異,一般可通過轉碼來解決。
3. 文件類型:文件類型統一時可直接指定,如res.setContentType("application/zip");文件類型不確定時可不設、設一個不存在的、或通過解析文件名后綴來設置,以實際測試通過為準。