静坐常思己过,闲谈莫论人非,能受苦乃为志士,肯吃亏不是痴人,敬君子方显有德,怕小人不算无能,退一步天高地阔,让三分心平气和,欲进步需思退步,若着手先虑放手,如得意不宜重往,凡做事应有余步。持黄金为珍贵,知安乐方值千金,事临头三思为妙,怒上心忍让最高。切勿贪意外之财,知足者人心常乐。若能以此去处事,一生安乐任逍遥。

一个文件下载的Servlet

作者:大鹏 发布于:2006-10-18 12:14 Wednesday 分类:Java与Jsp

把文件目录直接暴露给用户是很不安全的。所以要用Servlet来做,而且这样做,文件的存储方式就更丰富了,可以是从文件系统上取来的,也可以是数据库中经过计算生成的,或者从其它什么稀奇古怪的地方取来的。



[code]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();
           }
       }
   }[/code]

[code]
<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>
[/code]


标签: java jsp

et_highlighter
发表评论 »本文目前尚无任何评论

发表评论

干净网络从你做起,切勿黏贴小广告