文件的上传与下载---下载

来源:互联网 发布:画装修图软件 编辑:程序博客网 时间:2024/05/16 22:30
 Web应用中实现文件下载的两种方式
   1.超链接直接指向下载资源。
   2.程序实现下载需设置两个响应头。
      1--设置Content-Type 的值为:application/x-msdownload。Web 服务器需要告诉浏览器其所输出的内容的类型不是普通的文本文件或 HTML 文件,而是一个要保存到本
           地 的下载文件。

      2--Web 服务器希望浏览器不直接处理相应的实体内容,而是由用户选择将相应的实体内容保存到一个文件中,这需要设置 Content-Disposition 报头。该报头指定了接收程

           序处理数据内容的方式,在 HTTP 应用中只有 attachment 是标准方式,attachment 表示要求用户干预。在 attachment 后面还可以指定 filename 参数,该参数是服务

           器建议浏览器将实体内容保存到文件中的文件名称。在设置 Content-Dispostion 之前一定要指定 Content-Type

           response.setContentType("application/x-msdownload");

           String st="attachment;filename="+java.net.URLEncoder.encode(fileName,"UTF-8");

           response.setHeader("Content-Disposition",st);

将下载的文件传递给客户端,相应的内容应该当做二进制来处理。应该用方法调用返回ServletOutputStream对象想客户端写入文件。、

           ServletOutputStream os=reponse.getOutputStream();

           byte[ ] data=new byte[1024];

           int len=0;

                  while((len=is.read(data))>0){

                      os.write(data,0,len);

           }

要实现文件下载需要:ListFileServlet.java   DownloadServlet.java    listfile.jsp

         ListFileServlet.java 

             1.得到保存上传文件的文件夹

                String savepath = this.getServletContext().getRealPath("/WEB-INF/upload");

             2. 创建方法,迭归文件夹下面的所有文件   

                 listFiles(new File(savepath),map);

             3. 将Map对象写入request,传至listfiles.jsp

         listfile.jsp      

              取出map中的数据,构建URL作为下载链接的href的属性值

             <c:forEach var="current" items="${fileMap }">
                    <c:url var="fileAddr" value="/servlet/DownloadServlet">
                          <c:param name="uuidName">${current.key }</c:param>
                          <c:param name="realName">${current.value}</c:param>
                    </c:url> 
                    文件名:${current.value } 
                 <a href="${fileAddr }" >下载</a><br/><br/>

             </c:forEach>

         DownloadServlet.java

              1.  从request中读取文件名等信息。中文字符使用的URLEncoding,需要进行手动编码转换。

                   String uuidName=request.getParameter("uuidName");
                   String realName=request.getParameter("realName");
                   因为参数是通过url传过来的,所以需要手动进行编码转换
                   uuidName=new String(uuidName.getBytes("iso8859-1"),"utf-8");
                   realName=new String(realName.getBytes("iso8859-1"),"utf-8");
                   因为realName需要放到response的头contetn-dispposition中去,发送到客户的浏览器端,所以需要对它调用URLEncoder的encode方法进行url编码,才可以保证

                   客户取到正确的中文文件名。
                   realName=URLEncoder.encode(realName,"utf-8");

              2. 判断文件是否存在

                   if(!file.exists()){
                           request.setAttribute("message", "您要下载的文件不存在!");
                           request.getRequestDispatcher("/message.jsp").forward(request, response);
                   }else{
                           response.setHeader("content-disposition", "attachment;filename="+realName);

               3.   获取输入流,并写入输出流

                     FileInputStream fis = new FileInputStream(file);
                    OutputStream out = response.getOutputStream();
   
                    byte [ ] buffer = new byte[1024];
                    int len = 0;
                   while((len=fis.read(buffer))>0){
                         out.write(buffer, 0, len);
                    }
                    fis.close();

                4.设置一二级目录,获取文件地址

                    int dir1 = uuidName.hashCode() & 0xf;
                    int dir2 =(uuidName.hashCode()>>4) & 0xf;
  
                   String fileAddr = this.getServletContext().getRealPath("/WEB-INF/upload") +"\\" + dir1 + "\\" + dir2 + "\\" + uuidName;
  

原创粉丝点击