zoukankan      html  css  js  c++  java
  • Java 从服务器下载文件到本地(页面、后台、配置都有)

     先来看实现效果:

    有一个链接如下:

    点击链接下载文件:

     第一种方法:Servlet实现

    一、HTML页面部分:

    1、HTML页面中的一个链接

    <a id="downloadTemplate" style="color:blue" onclick="download();">下载导入模板</a>

    2、引入JS

    function download(){
        downloadTemplate('downloadExel.downloadexcel', 'filename', 'project');
    }
    
    /**
     * 用于下载导入模板时的影藏form表单的提交,采用post方式提交
     * @param action action映射地址
     * @param type parameter的名称
     * @param value parameter的值,这里为file的filename
     */
    function downloadTemplate(action, type, value){
        var form = document.createElement('form');
        document.body.appendChild(form);
        form.style.display = "none";
        form.action = action;
        form.id = 'excel';
        form.method = 'post';
        
        var newElement = document.createElement("input");  
        newElement.setAttribute("type","hidden");  
        newElement.name = type;
        newElement.value = value;
        form.appendChild(newElement); 
        
        form.submit();
    }

    3、解释上面JS(不是正是代码)

    相当于提交一个form,里面如下:

    <input type=hidden name="filename" value = "project">

    后台可以通过下面代码获得文件名:project

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

    (这段是上面js的翻译,不是正式的哦)

     二、配置部分

    配置前台页面和后台交互

    1、web.xml配置

    <?xml version="1.0" encoding="UTF-8"?>
    
    <web-app id="WebApp_ID" version="2.4"
        xmlns="http://java.sun.com/xml/ns/j2ee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
        
    
        <servlet>
            <servlet-name>downloadServlet</servlet-name>
            <servlet-class>
                com.zit.rfid.app.prms.business.service.servlet.DownloadTemplateServlet
            </servlet-class>
            <load-on-startup>3</load-on-startup>
        </servlet>
    
        <servlet-mapping>
            <servlet-name>downloadServlet</servlet-name>
            <url-pattern>*.downloadexcel</url-pattern>
        </servlet-mapping>
    </web-app>

    我这个web.xml不是整个工程的web.xml,只是一个模块的,在你的web.xml加入上面servlet和servlet-mapping里的内容即可

    如上:

    (1)接受 *.downloadexcel 的Action

    (2)HTML的JS里的Action,交给com.test.DownloadTemplateServlet这个类去处理

    2、WebContent目录下新建file文件夹,存放project.xls文件   (Eclipse的Web工程有WebContent,MyEclipse好像是WebRoot)

     

    三、后台部分

    1、新建一个servlet:  

    DownloadTemplateServlet.java

    package com.test;
    
    import java.io.DataInputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.io.OutputStreamWriter;
    import java.net.URLEncoder;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    
    /**
     * @author 0223000218
     *    主要用于下载导入模板,页面上传入的request中parameter中,filename代表了要下载的模板的名称
     */
    public class DownloadTemplateServlet extends HttpServlet {
    
        /**
         * serialVersionUID
         */
        private static final long serialVersionUID = -4541729035831587727L;
    
        private final static String HOME_PATH = DownloadTemplateServlet.class.getResource("/").getPath();
        private final static String DOWNLOAD_TEMP_FILE = HOME_PATH.subSequence(0, HOME_PATH.indexOf("WEB-INF")) + "file/";
        
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
            doPost(req, resp);
        }
        
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
            String filename = req.getParameter("filename");
            try{
                resp.reset();// 清空输出流
                
                String resultFileName = filename + System.currentTimeMillis() + ".xls";
                resultFileName = URLEncoder.encode(resultFileName,"UTF-8");  
                resp.setCharacterEncoding("UTF-8");  
                resp.setHeader("Content-disposition", "attachment; filename=" + resultFileName);// 设定输出文件头
                resp.setContentType("application/msexcel");// 定义输出类型
                //输入流:本地文件路径
                DataInputStream in = new DataInputStream(
                        new FileInputStream(new File(DOWNLOAD_TEMP_FILE + filename + ".xls")));  
                //输出流
                OutputStream out = resp.getOutputStream();
                //输出文件
                int bytes = 0;
                byte[] bufferOut = new byte[1024];  
                while ((bytes = in.read(bufferOut)) != -1) {  
                    out.write(bufferOut, 0, bytes);  
                }
                out.close();
                in.close();
            } catch(Exception e){
                e.printStackTrace();
                resp.reset();
                try {
                    OutputStreamWriter writer = new OutputStreamWriter(resp.getOutputStream(), "UTF-8");  
                    String data = "<script language='javascript'>alert("\u64cd\u4f5c\u5f02\u5e38\uff01");</script>";
                    writer.write(data); 
                    writer.close();
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
            }
            
        }
        
        
    }

    大致步骤:

    1. 获取服务器文件所在路径

    2. 输入服务器文件

    3. 输出文件到本地

    第二种方法:SpringMVC实现

    这种方法比较简单

    一、JSP页面部分

    和上面一样

    <a id="downloadTemplate" style="color:blue" onclick="download();">下载导入模板</a>
    //导出模板下载
        function download(){
            //后台方法、文件类型、文件名
            downloadTemplate('${pageContext.request.contextPath}/cardIssueVehicleInfo/exportVehicleInfo', 'filename', 'test');
        }
    
        /**
         * 用于下载导入模板时的影藏form表单的提交,采用post方式提交
         * @param action 请求后台方法
         * @param type 文件类型
         * @param value 文件名
         */
        function downloadTemplate(action, type, value){
            var form = document.createElement('form');
            document.body.appendChild(form);
            form.style.display = "none";
            form.action = action;
            form.id = 'excel';
            form.method = 'post';
            
            var newElement = document.createElement("input");  
            newElement.setAttribute("type","hidden");  
            newElement.name = type;
            newElement.value = value;
            form.appendChild(newElement); 
            
            form.submit();
        }

    二、后台部分

    @RequestMapping("exportVehicleInfo")
        public void exportVehicleInfo(HttpServletRequest req, HttpServletResponse resp) {
            String filename = req.getParameter("filename");
            DataInputStream in = null;
            OutputStream out = null;
            try{
                resp.reset();// 清空输出流
                
                String resultFileName = filename + System.currentTimeMillis() + ".xls";
                resultFileName = URLEncoder.encode(resultFileName,"UTF-8");  
                resp.setCharacterEncoding("UTF-8");  
                resp.setHeader("Content-disposition", "attachment; filename=" + resultFileName);// 设定输出文件头
                resp.setContentType("application/msexcel");// 定义输出类型
                //输入流:本地文件路径
                in = new DataInputStream(
                        new FileInputStream(new File(downloadPath + "test.xls")));  
                //输出流
                out = resp.getOutputStream();
                //输出文件
                int bytes = 0;
                byte[] bufferOut = new byte[1024];  
                while ((bytes = in.read(bufferOut)) != -1) {  
                    out.write(bufferOut, 0, bytes);  
                }
            } catch(Exception e){
                e.printStackTrace();
                resp.reset();
                try {
                    OutputStreamWriter writer = new OutputStreamWriter(resp.getOutputStream(), "UTF-8");  
                    String data = "<script language='javascript'>alert("\u64cd\u4f5c\u5f02\u5e38\uff01");</script>";
                    writer.write(data); 
                    writer.close();
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
            }finally {
                if(null != in) {
                    try {
                        in.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if(null != out) {
                    try {
                        out.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            
        }
  • 相关阅读:
    VC 捕获Windows关机事件
    JAVA多态计算面积main函数调用方法
    Spring MVC 和 Spring 总结
    css知识总结
    数据库mysql大全(高级版)
    springboot+springcloud微服务项目全套资料(笔记+源码+代码)
    eclipse上的maven,添加依赖后无法自动下载相应的jar包
    使用angularJS接收json数据并进行数据的显示
    mybatis的基本语句的应用
    Idea集成maven插件
  • 原文地址:https://www.cnblogs.com/Donnnnnn/p/7902718.html
Copyright © 2011-2022 走看看