针对于文件的下载,我们有很多种实现方式。业务场景是这样子的,要实现Excel文件的导入和导出功能,问题对于java的POI操作没有问题,所以实现文件的下载就相对简单,只需要从数据库取出相关的数据,针对数据的结果集进行相关的转换,实现自己想要的输出结果,但对于导入的话实现起来就会遇到跟中各样的小问题,问题1:导入的格式不对。问题2:导入的数据类型不对,就像windows的文本编辑框一样,自带有系统默认的编码格式,excel也有自己单元格内数据类型的相应格式,,问题3:导入的数据长度问题。问题4:导入需要的数据模板。所以针对这样的问题,我们需要给用户提供相应的下载和导入模板。一共客户使用

一下是我个人实现的两种导入方式,直接上代码,我会针对代码的两种实现方式进行优缺点的对比,选择适合自己项目运行的代码:

代码1:针对云java包下的文件模板下载:

/**
* 下载导入模板
* @param request
* @param searchCondition
* @param response
* @author zhaieryuan
* @date 2017年12月25日 下午2:24:20
*/
@RequestMapping("/downloadTemplate")
public void downloadTemplate(HttpServletRequest request,HttpServletResponse response){
String fileDownName ="导入模板.xlsx";
logger.debug("下载模板文件名称:"+fileDownName);
try {
InputStream fis = StoreController.class.getResourceAsStream("/com/zhaiugo/dl/store/controller/importTemplate.xls");  
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
fis.close();
response.reset();
response.setContentType("bin");

String fileNames = fileDownName;
String agent = request.getHeader("USER-AGENT");

String codedfilename = "";
if (null != agent && -1 != agent.indexOf("MSIE") || null != agent && -1 != agent.indexOf("Trident")) {// ie

String name = java.net.URLEncoder.encode(fileNames, "UTF8");

codedfilename = name;
} else if (null != agent && -1 != agent.indexOf("Mozilla")) {// 火狐,chrome等

codedfilename = new String(fileNames.getBytes("UTF-8"), "iso-8859-1");
}

response.addHeader("Content-Disposition", "attachment; filename=\"" + codedfilename + "\"");
response.getOutputStream().write(buffer);
} catch (IOException e) {
e.printStackTrace();
logger.debug("下载导入模板"+e.getMessage(), e);
}
}

代码2:针对于web项目的根目录和静态文件目录的模板下载

/**
* 下载导入模板
* @param request
* @param searchCondition
* @param response
* @author zhaieryuan
* @date 2017年12月25日 下午2:24:20
*/
@RequestMapping("/downloadTemplate")
public void downloadTemplate(HttpServletRequest request,HttpServletResponse response) throws Exception{
request.setCharacterEncoding("UTF-8");
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
String importTemplate = "importTemplate.xls";
//获取项目根目录
String ctxPath = request.getSession().getServletContext()
.getRealPath("");

//获取下载文件露肩
String downLoadPath = ctxPath+"/upload/"+importTemplate;

//获取文件的长度
long fileLength = new File(downLoadPath).length();

//设置文件输出类型
response.setContentType("application/octet-stream");
response.setHeader("Content-disposition", "attachment; filename="
+ new String(importTemplate.getBytes("utf-8"), "ISO8859-1"));
//设置输出长度
response.setHeader("Content-Length", String.valueOf(fileLength));
//获取输入流
bis = new BufferedInputStream(new FileInputStream(downLoadPath));
//输出流
bos = new BufferedOutputStream(response.getOutputStream());
byte[] buff = new byte[2048];
int bytesRead;
while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
bos.write(buff, 0, bytesRead);
}
//关闭流
bis.close();
bos.close();
}

spring 文件模板下载多种实现方式的更多相关文章

  1. [转载]ASP.NET Core文件上传与下载(多种上传方式)

    ASP.NET Core文件上传与下载(多种上传方式)   前言 前段时间项目上线,实在太忙,最近终于开始可以研究研究ASP.NET Core了. 打算写个系列,但是还没想好目录,今天先来一篇,后面在 ...

  2. XDown单文件版 下载工具 支持磁力等多种链接方式下载

    原来的程序不带剪辑板探测,不支持迅雷链接等 增加功能后优化制作单文件版本. 下载类型为下图 magnet:?xt=urn:btih:836A228D932EF1C7EA1DD99D5D80B7CB0C ...

  3. Spring学习总结(一)——Spring实现IoC的多种方式

    控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法,也有人认为DI只是IoC的另一种说法.没有IoC的程序中我们使用面向对象编程对象的创 ...

  4. SQL 横转竖 、竖专横 (转载) 使用Dapper.Contrib 开发.net core程序,兼容多种数据库 C# 读取PDF多级书签 Json.net日期格式化设置 ASPNET 下载共享文件 ASPNET 文件批量下载 递归,循环,尾递归 利用IDisposable接口构建包含非托管资源对象 《.NET 进阶指南》读书笔记2------定义不可改变类型

    SQL 横转竖 .竖专横 (转载)   普通行列转换 问题:假设有张学生成绩表(tb)如下: 姓名 课程 分数 张三 语文 74 张三 数学 83 张三 物理 93 李四 语文 74 李四 数学 84 ...

  5. Spring实现Ioc的多种方式--控制反转、依赖注入、xml配置的方式实现IoC、对象作用域

    Spring实现Ioc的多种方式 一.IoC基础 1.1.概念: 1.IoC 控制反转(Inversion of Control) IoC是一种设计思想. 2.DI 依赖注入 依赖注入是实现IoC的一 ...

  6. python全栈开发_day8_文件的多种读写方式及游标

    一:文件的多种读写方式 主方式:w    r    a 从方式:t     b    + 了解方式:x    u 1)按t(按照字符进行操作): with open("data_1.txt& ...

  7. 2019.06.05 ABAP EXCEL 操作类代码 OLE方式(模板下载,excel上传,内表下载)

    一般使用标准的excel导入方法9999行,修改了标准的excel导入FM 整合出类:excel的 模板下载,excel上传,ALV内表下载功能. 在项目一开始可以SE24创建一个类来供整体开发使用, ...

  8. .net上传文件,大文件及下载方式汇总(转)

    原文地址:http://www.360doc.com/content/19/1219/10/67993814_880731215.shtml Brettle.Web.NeatUpload.dll 文件 ...

  9. js 前端实现文件流下载的几种方式

    后端是用Java写的一个下载的接口,返回的是文件流,需求:点击,请求,下载 利用iframe实现文件流下载 //把上一次创建的iframe删掉,不然随着下载次数的增多页面上会一堆的iframe var ...

随机推荐

  1. MacOS App代码申请管理员权限

    原文: https://jacobpan3g.github.io/cn/2018/02/07/gain-root-permission-for-mac-app/,有问题欢迎在原文评论区一起讨论交流,我 ...

  2. C语言中的sizeof函数总结

    sizeof函数的结果: 变量:变量所占的字节数. ; printf( 数组:数组所占的字节数. ,,,,}; ] = {,,,,}; printf("size_arr1=%d\n" ...

  3. 【mysql】mysql密码设置和更改

    密码设置: 当用户没有设置密码时: 添加密码: mysqladmin -uroot -password ab12 注:因为开始时root没有密码,所以-p旧密码一项就可以省略了. 当用户存在密码时: ...

  4. Java之Iterator

    Java之Iterator 1.实例源码 /** * @Title:IteratorJava.java * @Package:com.you.model * @Description:Iterator ...

  5. Web.config中设置启用webservice远程调试访问

    在.NET 中已经默认将webservice的远程调试功能关闭,有的时候我们需要远程调试程序的时候,就需要打开此功能我们只需在webservice的项目的中添web.config的<system ...

  6. 新建.Net Core应用程序后引用项一直黄色感叹号怎么办?

    我们在vs中创建.Net Core应用程序后,引用项可能出现黄色感叹号,正常情况下,这种黄色感叹号时能在项目创建成功之后迅速消失的,可也有些时候一直不消失,怎么办? 我们可以选中异常的项目,然后右键菜 ...

  7. ThreadLocal原理

    ThreadLocal类可以看作是当前线程的一个局部变量,只有当前线程可以访问,因此是线程安全的. ThreadLocal内部维护了一个ThreadLocalMap类,ThreadLocalMap是一 ...

  8. 一个2D平面游戏,的碰撞引擎实现

    @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); i ...

  9. jquery实例权威指南

    jquery的$(function(){}) 效率高于window.onload,前者页面框架加载完就执行,后者全部加载完毕且图片下载完毕后方可执行.且前者可以写多个,每次执行结果不同,后者的话尽管可 ...

  10. [MyBatis]DAO层只写接口,不用写实现类

    团队开发一个项目,由老大架了一个框架,遇到了DAO层不用写接口了,我也是用了2次才记住这个事的,因为自己一直都是习惯于写DAO层的实现类,所以,习惯性的还是写了个实现类.于是遇到错误了. 找不到那个方 ...