文件下载

 

文件下载

一、下载的两种方式

a)         超链接直接指向下载资源

b)        设置实现下砸需要的两个相应头:

                        i.              设置Coutent-Type的值为application/x-msdownload.

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

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

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

                      ii.              由于下载的文件可能是各种类型文件。所以要将文件传送给客户端,其相应内容应该被当做二进制来处理,所以应该调用                                方法返回 ServeltOutputStream 对象来向客户端写入文件内容。                       

ServletOutputStream sos=response.getOutputStream();

Byte[] data=new byte[2048];

Int len=0;

While((len-is.read(data))>0){

Sos.write(data,0,len);

}

二、实例代码:

a)         Jsp代码

<body>

    <h2>下载资源列表</h2>

    <c:forEach items="${map}" var="me">

    <!--(1)

    文件名:${me.value}&nbsp;<a href="${pageContext.request.contextPath}/servlet/DownloadServlet?filename=${me.key}">下载</a> <br/>

     -->

     <!-- (2) -->

     <c:url value="/servlet/DownloadServlet" var="fileAddr"><!-- 保存地址 -->

     <c:param name="filename" value="${me.key}"></c:param>

     </c:url>

         文件名:${me.value}&nbsp;<a href="${fileAddr}">下载</a> <br/>

    

     </c:forEach>

                        i.                </body>

b)        listFileServlet.java 代码

 

public void doGet(HttpServletRequest request, HttpServletResponse response)

           throws ServletException, IOException {

       //得到保存上传文件的文件夹

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

      

       Map map=new HashMap();

       listFiles(new File(savePath),map);

      

       request.setAttribute("map",map);

       request.getRequestDispatcher("/listFiles.jsp").forward(request, response);

    }

    //递归方法遍历该文件夹下的子文件及子文件夹下的文件

    private void listFiles(File file,Map map){

       if(file.isFile()){

           //如果是文件

           String uuidname=file.getName();

           String realname=uuidname.substring(uuidname.indexOf("_")+1);

           map.put(uuidname,realname);

       }else{

           //如果不是文件而是文件夹

           File[] files=file.listFiles();

           for(File f:files){//遍历每一个文件夹

              listFiles(f, map);

           }

       }

   

}

c)      DownloadServlet.java代码

public void doGet(HttpServletRequest request, HttpServletResponse response)

           throws ServletException, IOException {

       //找到用户选定的文件--确定文件的保存位置

       String uuidname=request.getParameter("filename");

       uuidname=new String(uuidname.getBytes("ISO8859-1"),"utf-8");

       String realname=uuidname.substring(uuidname.indexOf("_")+1);

       String savePath=getFileAddr(realname);

      

       File f=new File(savePath+"\\"+uuidname);

       if(f.exists()){

       System.out.println(savePath+"\\"+uuidname);

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

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

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

      

       //创建一个输入流对象和指定的文件相关联

       FileInputStream in=new FileInputStream(f);

       //respon对象获取输出流对象

       OutputStream out=response.getOutputStream();

       //将从输入流对象中度数据写入到输出流对象中

       byte[] buff=new byte[1024];

       int len=0;

       while((len=in.read(buff))>0){

           out.write(buff,0,len);

       }

       }else{

           request.setAttribute("message","下载资源不存在");

           request.getRequestDispatcher("/message.jsp").forward(request,response);

       }

      

    }

private String getFileAddr(String filename){

    int dir1=filename.hashCode() & 0x0f;

    int dir2=filename.hashCode()>>4 & 0x0f;

    String savePath=this.getServletContext().getRealPath("WEB-INF/upload")+"\\"+dir1+"\\"+dir2;

   

    return savePath;

1.         }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值