zoukankan      html  css  js  c++  java
  • java web文件下载功能实现 (转)

    http://blog.csdn.net/longshengguoji/article/details/39433307

    需求:实现一个具有文件下载功能的网页,主要下载压缩包和图片

    两种实现方法:

        一:通过超链接实现下载

    在HTML网页中,通过超链接链接到要下载的文件的地址
    1. <!DOCTYPE html>  
    2. <html>  
    3. <head>  
    4. <meta charset="UTF-8">  
    5. <title>Insert title here</title>  
    6. </head>  
    7. <body>  
    8. <h1>通过链接下载文件</h1>  
    9. <href="/day06/download/cors.zip">压缩包</a>  
    10. <href="/day06/download/1.png">图片</a>  
    11. </body>  
    12. </html>  
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    <h1>通过链接下载文件</h1>
    <a href="/day06/download/cors.zip">压缩包</a>
    <a href="/day06/download/1.png">图片</a>
    </body>
    </html>

    其中day06/download是文档路径,本实例的程序结构如下:
    程序运行后,可以通过单击需要下载文档实现下载
    但是这里会出现一个问题,就是单击下载压缩包的时候会弹出下载页面,但是下载图片的时候浏览器就直接打开了图片,没有下载。
        这是因为通过超链接下载文件时,如果浏览器可以识别该文件格式,浏览器就会直接打开。只有浏览器不能识别该文件格式的时候,才会实现下载。因此利用第二种方法实现下载功能。

        二:通过Servlet程序实现下载

        通过Servlet下载文件的原理是通过servlet读取目标程序,将资源返回客户端。
    1. <!DOCTYPE html>  
    2. <html>  
    3. <head>  
    4. <meta charset="UTF-8">  
    5. <title>Insert title here</title>  
    6. </head>  
    7. <body>  
    8. <h1>通过链接下载文件</h1>  
    9. <href="/day06/download/cors.zip">压缩包</a>  
    10. <href="/day06/download/1.png">图片</a>  
    11. <h1>通过servlet程序下载文件</h1>  
    12. <href="/day06/ServletDownload?filename=cors.zip">压缩包</a>  
    13. <href="/day06/ServletDownload?filename=1.png">图片</a>  
    14. </body>  
    15. </html>  
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    <h1>通过链接下载文件</h1>
    <a href="/day06/download/cors.zip">压缩包</a>
    <a href="/day06/download/1.png">图片</a>
    <h1>通过servlet程序下载文件</h1>
    <a href="/day06/ServletDownload?filename=cors.zip">压缩包</a>
    <a href="/day06/ServletDownload?filename=1.png">图片</a>
    </body>
    </html>

    其中,/day06/ServletDownload 是servlet程序的映射路径
    然后新建一个servlet,名称为ServletDownload,URL映射为/ServletDownload
    添加代码如下:
    1. package com.lsgjzhuwei.servlet.response;  
    2.   
    3. import java.io.FileInputStream;  
    4. import java.io.FileOutputStream;  
    5. import java.io.IOException;  
    6. import java.io.InputStream;  
    7. import java.io.OutputStream;  
    8.   
    9. import javax.servlet.ServletException;  
    10. import javax.servlet.annotation.WebServlet;  
    11. import javax.servlet.http.HttpServlet;  
    12. import javax.servlet.http.HttpServletRequest;  
    13. import javax.servlet.http.HttpServletResponse;  
    14.   
    15. /** 
    16.  * Servlet implementation class ServletDownload 
    17.  */  
    18. @WebServlet(asyncSupported = true, urlPatterns = { "/ServletDownload" })  
    19. public class ServletDownload extends HttpServlet {  
    20.     private static final long serialVersionUID = 1L;  
    21.          
    22.     /** 
    23.      * @see HttpServlet#HttpServlet() 
    24.      */  
    25.     public ServletDownload() {  
    26.         super();  
    27.         // TODO Auto-generated constructor stub  
    28.     }  
    29.   
    30.     /** 
    31.      * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 
    32.      */  
    33.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
    34.         // TODO Auto-generated method stub  
    35.           
    36.         //获得请求文件名  
    37.         String filename = request.getParameter("filename");  
    38.         System.out.println(filename);  
    39.           
    40.         //设置文件MIME类型  
    41.         response.setContentType(getServletContext().getMimeType(filename));  
    42.         //设置Content-Disposition  
    43.         response.setHeader("Content-Disposition", "attachment;filename="+filename);  
    44.         //读取目标文件,通过response将目标文件写到客户端  
    45.         //获取目标文件的绝对路径  
    46.         String fullFileName = getServletContext().getRealPath("/download/" + filename);  
    47.         //System.out.println(fullFileName);  
    48.         //读取文件  
    49.         InputStream in = new FileInputStream(fullFileName);  
    50.         OutputStream out = response.getOutputStream();  
    51.           
    52.         //写文件  
    53.         int b;  
    54.         while((b=in.read())!= -1)  
    55.         {  
    56.             out.write(b);  
    57.         }  
    58.           
    59.         in.close();  
    60.         out.close();  
    61.     }  
    62.   
    63.     /** 
    64.      * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 
    65.      */  
    66.     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
    67.         // TODO Auto-generated method stub  
    68.     }  
    69.   
    70. }  
    package com.lsgjzhuwei.servlet.response;
    
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /**
     * Servlet implementation class ServletDownload
     */
    @WebServlet(asyncSupported = true, urlPatterns = { "/ServletDownload" })
    public class ServletDownload extends HttpServlet {
    	private static final long serialVersionUID = 1L;
           
        /**
         * @see HttpServlet#HttpServlet()
         */
        public ServletDownload() {
            super();
            // TODO Auto-generated constructor stub
        }
    
    	/**
    	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
    	 */
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		// TODO Auto-generated method stub
    		
    		//获得请求文件名
    		String filename = request.getParameter("filename");
    		System.out.println(filename);
    		
    		//设置文件MIME类型
    		response.setContentType(getServletContext().getMimeType(filename));
    		//设置Content-Disposition
    		response.setHeader("Content-Disposition", "attachment;filename="+filename);
    		//读取目标文件,通过response将目标文件写到客户端
    		//获取目标文件的绝对路径
    		String fullFileName = getServletContext().getRealPath("/download/" + filename);
    		//System.out.println(fullFileName);
    		//读取文件
    		InputStream in = new FileInputStream(fullFileName);
    		OutputStream out = response.getOutputStream();
    		
    		//写文件
    		int b;
    		while((b=in.read())!= -1)
    		{
    			out.write(b);
    		}
    		
    		in.close();
    		out.close();
    	}
    
    	/**
    	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
    	 */
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		// TODO Auto-generated method stub
    	}
    
    }
    

    重启tomcat服务器,即可实现对压缩包和对图片的下载。
  • 相关阅读:
    【转载】10个Web3D可视化精彩案例
    基于react的audio组件
    如何开发一款堪比APP的微信小程序(腾讯内部团队分享)
    CSS3 用border写 空心三角箭头 (两种写法)
    浅谈微信小程序对于创业者,意味着什么?
    左手Cookie“小甜饼”,右手Web Storage
    css3中user-select的用法详解
    个人感觉一些比较有用的特效例子
    纯css模拟电子钟
    蓝桥杯 ALGO-2:最大最小公倍数
  • 原文地址:https://www.cnblogs.com/quietwalk/p/7682827.html
Copyright © 2011-2022 走看看