把文件目錄直接暴露給用戶是很不安全的。所以要用Servlet來做,而且這樣做,文件的存儲方式就更豐富了,可以是從文件系統上取來的,也可以是數據庫中經過計算生成的,或者從其它什么稀奇古怪的地方取來的。
public?class?DownloadServlet?extends?HttpServlet?{
????private?String?contentType?=?"application/x-msdownload";
????private?String?enc?=?"utf-8";
????private?String?fileRoot?=?"";
????/**
?????*?初始化contentType,enc,fileRoot
?????*/
????public?void?init(ServletConfig?config)?throws?ServletException?{
????????String?tempStr?=?config.getInitParameter("contentType");
????????if?(tempStr?!=?null?&&?!tempStr.equals(""))?{
????????????contentType?=?tempStr;
????????}
????????tempStr?=?config.getInitParameter("enc");
????????if?(tempStr?!=?null?&&?!tempStr.equals(""))?{
????????????enc?=?tempStr;
????????}
????????tempStr?=?config.getInitParameter("fileRoot");
????????if?(tempStr?!=?null?&&?!tempStr.equals(""))?{
????????????fileRoot?=?tempStr;
????????}
????}
????protected?void?doGet(HttpServletRequest?request,?HttpServletResponse?response)?throws?ServletException,?IOException?{
????????String?filepath?=?request.getParameter("filepath");
????????String?fullFilePath?=?fileRoot?+?filepath;
????????/*讀取文件*/
????????File?file?=?new?File(fullFilePath);
????????/*如果文件存在*/
????????if?(file.exists())?{
????????????String?filename?=?URLEncoder.encode(file.getName(),?enc);
????????????response.reset();
????????????response.setContentType(contentType);
????????????response.addHeader("Content-Disposition",?"attachment;?filename=\""?+?filename?+?"\"");
????????????int?fileLength?=?(int)?file.length();
????????????response.setContentLength(fileLength);
????????????/*如果文件長度大于0*/
????????????if?(fileLength?!=?0)?{
????????????????/*創建輸入流*/
????????????????InputStream?inStream?=?new?FileInputStream(file);
????????????????byte[]?buf?=?new?byte[4096];
????????????????/*創建輸出流*/
????????????????ServletOutputStream?servletOS?=?response.getOutputStream();
????????????????int?readLength;
????????????????while?(((readLength?=?inStream.read(buf))?!=?-1))?{
????????????????????servletOS.write(buf,?0,?readLength);
????????????????}
????????????????inStream.close();
????????????????servletOS.flush();
????????????????servletOS.close();
????????????}
????????}
????}
web.xml
????<servlet>
????????<servlet-name>downloadservlet-name>
????????<servlet-class>org.mstar.servlet.DownloadServletservlet-class>
????????<init-param>
????????????<param-name>fileRootparam-name>
????????????<param-value>d:/tempparam-value>
????????init-param>
????????<init-param>
????????????<param-name>contentTypeparam-name>
????????????<param-value>application/x-msdownloadparam-value>
????????init-param>
????????<init-param>
????????????<param-name>encparam-name>
????????????<param-value>utf-8param-value>
????????init-param>
????servlet>
????<servlet-mapping>
????????<servlet-name>downloadservlet-name>
????????<url-pattern>/downurl-pattern>
????servlet-mapping>