博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java 从服务器下载文件到本地(页面、后台、配置都有)
阅读量:5081 次
发布时间:2019-06-13

本文共 7050 字,大约阅读时间需要 23 分钟。

 

 先来看实现效果:

 

有一个链接如下:

点击链接下载文件:

 

 

 第一种方法:Servlet实现

 

一、HTML页面部分:

1、HTML页面中的一个链接

 

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,里面如下:

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

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

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

 

 

 二、配置部分

配置前台页面和后台交互

 

1、web.xml配置

downloadServlet
com.zit.rfid.app.prms.business.service.servlet.DownloadTemplateServlet
3
downloadServlet
*.downloadexcel

 

我这个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 = "";                writer.write(data);                 writer.close();            } catch (IOException e1) {                e1.printStackTrace();            }        }            }        }

 

大致步骤:

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

2. 输入服务器文件

3. 输出文件到本地

 

 

 

第二种方法:SpringMVC实现

 

这种方法比较简单

 

一、JSP页面部分

和上面一样

 

 

//导出模板下载    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 = "";                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();                }            }        }            }

 

转载于:https://www.cnblogs.com/Donnnnnn/p/7902718.html

你可能感兴趣的文章
Mysql性能调优
查看>>
ES6内置方法find 和 filter的区别在哪
查看>>
Android实现 ScrollView + ListView无滚动条滚动
查看>>
硬件笔记之Thinkpad T470P更换2K屏幕
查看>>
getElement的几中属性介绍
查看>>
HTML列表,表格与媒体元素
查看>>
设计器 和后台代码的转换 快捷键
查看>>
STL容器之vector
查看>>
数据中心虚拟化技术
查看>>
复习文件操作
查看>>
SQL Server 使用作业设置定时任务之一(转载)
查看>>
第二阶段冲刺-01
查看>>
BZOJ1045 HAOI2008 糖果传递
查看>>
JavaScript 克隆数组
查看>>
eggs
查看>>
oracle 报错ORA-12514: TNS:listener does not currently know of service requested in connec
查看>>
python3 生成器与迭代器
查看>>
java编写提升性能的代码
查看>>
list 容器 排序函数.xml
查看>>
《Genesis-3D开源游戏引擎完整实例教程-跑酷游戏篇03:暂停游戏》
查看>>