代码

参数:

1.filePath:文件的绝对路径(d:\download\a.xlsx)

2.fileName(a.xlsx)

3.编码格式(GBK)

4.response、request不介绍了,从控制器传入的http对象

代码片.

//控制器

@RequestMapping(UrlConstants.BLACKLIST_TESTDOWNLOAD)

public void downLoad(String filePath, HttpServletResponse response, HttpServletRequest request) throws Exception {

boolean is = myDownLoad("D:\\a.xlsx","a.xlsx","GBK",response,request);

if(is)

System.out.println("成功");

else

System.out.println("失败");

}

//下载方法

public boolean myDownLoad(String filePath,String fileName, String encoding, HttpServletResponse response, HttpServletRequest request){

File f = new File(filePath);

if (!f.exists()) {

try {

response.sendError(404, "File not found!");

} catch (IOException e) {

e.printStackTrace();

}

return false;

}

String type = fileName.substring(fileName.lastIndexOf(".") + 1);

//判断下载类型 xlsx 或 xls 现在只实现了xlsx、xls两个类型的文件下载

if (type.equalsIgnoreCase("xlsx") || type.equalsIgnoreCase("xls")){

response.setContentType("application/force-download;charset=UTF-8");

final String userAgent = request.getHeader("USER-AGENT");

try {

if (StringUtils.contains(userAgent, "MSIE") || StringUtils.contains(userAgent, "Edge")) {// IE浏览器

fileName = URLEncoder.encode(fileName, "UTF8");

} else if (StringUtils.contains(userAgent, "Mozilla")) {// google,火狐浏览器

fileName = new String(fileName.getBytes(), "ISO8859-1");

} else {

fileName = URLEncoder.encode(fileName, "UTF8");// 其他浏览器

}

response.setHeader("Content-disposition", "attachment; filename=" + fileName);

} catch (UnsupportedEncodingException e) {

logger.error(e.getMessage(), e);

return false;

}

InputStream in = null;

OutputStream out = null;

try {

//获取要下载的文件输入流

in = new FileInputStream(filePath);

int len = 0;

//创建数据缓冲区

byte[] buffer = new byte[1024];

//通过response对象获取outputStream流

out = response.getOutputStream();

//将FileInputStream流写入到buffer缓冲区

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

//使用OutputStream将缓冲区的数据输出到浏览器

out.write(buffer,0,len);

}

//这一步走完,将文件传入OutputStream中后,页面就会弹出下载框

} catch (Exception e) {

logger.error(e.getMessage(), e);

return false;

} finally {

try {

if (out != null)

out.close();

if(in!=null)

in.close();

} catch (IOException e) {

logger.error(e.getMessage(), e);

}

}

return true;

}else {

logger.error("不支持的下载类型!");

return false;

}

}

实现效果

1.火狐浏览器效果

2.chrome效果,自动下载

补充知识:文件上传/下载的几种写法(java后端)

文件上传

1、框架已经帮你获取到文件对象File了

public boolean uploadFileToLocale(File uploadFile,String filePath) {

boolean ret_bl = false;

try {

InputStream in = new FileInputStream(uploadFile);

ret_bl=copyFile(in,filePath);

} catch (Exception e) {

e.printStackTrace();

}

return ret_bl;

}

public boolean copyFile(InputStream in,String filePath) {

boolean ret_bl = false;

FileOutputStream os=null;

try {

os = new FileOutputStream(filePath,false);

byte[] b = new byte[8 * 1024];

int length = 0;

while ((length = in.read(b)) > 0) {

os.write(b, 0, length);

}

os.close();

in.close();

ret_bl = true;

} catch (Exception e) {

e.printStackTrace();

}finally{

try {

if(os!=null){

os.close();

}

if(in!=null){

in.close();

}

} catch (IOException e) {

e.printStackTrace();

}

}

return ret_bl;

}

}

2、天了个撸,SB架构师根本就飘在天空没下来,根本就没想文件上传这一回事

public String uploadByHttp(HttpServletRequest request) throws Exception{

String filePath=null;

List fileNames = new ArrayList<>();

//创建一个通用的多部分解析器

CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());

//判断 request 是否有文件上传,即多部分请求

if(multipartResolver.isMultipart(request)){

//转换成多部分request

MultipartHttpServletRequest multiRequest =multipartResolver.resolveMultipart(request);

MultiValueMap multiFileMap = multiRequest.getMultiFileMap();

List fileSet = new LinkedList<>();

for(Entry> temp : multiFileMap.entrySet()){

fileSet = temp.getValue();

}

String rootPath=System.getProperty("user.dir");

for(MultipartFile temp : fileSet){

filePath=rootPath+"/tem/"+temp.getOriginalFilename();

File file = new File(filePath);

if(!file.exists()){

file.mkdirs();

}

fileNames.add(temp.getOriginalFilename());

temp.transferTo(file);

}

}

}

3、神啊,我正在撸框架,请问HttpServletRequest怎么获取!!!!

(1)在web.xml中配置一个监听

org.springframework.web.context.request.RequestContextListener

(2)HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();

文件下载(直接用链接下载的不算),这比较简单

1、本地文件下载(即文件保存在本地)

public void fileDownLoad(HttpServletRequest request,HttpServletResponse response,String fileName,String filePath) throws Exception {

response.setCharacterEncoding("UTF-8");

//设置ContentType字段值

response.setContentType("text/html;charset=utf-8");

//通知浏览器以下载的方式打开

response.addHeader("Content-type", "appllication/octet-stream");

response.addHeader("Content-Disposition", "attachment;filename="+fileName);

//通知文件流读取文件

InputStream in = request.getServletContext().getResourceAsStream(filePath);

//获取response对象的输出流

OutputStream out = response.getOutputStream();

byte[] buffer = new byte[1024];

int len;

//循环取出流中的数据

while((len = in.read(buffer)) != -1){

out.write(buffer,0,len);

}

}

2、远程文件下载(即网上资源下载,只知道文件URI)

public static void downLoadFromUrl(String urlStr,String fileName,HttpServletResponse response){

try {

urlStr=urlStr.replaceAll("\\\\", "/");

URL url = new URL(urlStr);

HttpURLConnection conn = (HttpURLConnection)url.openConnection();

//设置超时间为3秒

conn.setConnectTimeout(3*1000);

//防止屏蔽程序抓取而返回403错误

conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");

//得到输入流

InputStream inputStream = conn.getInputStream();

response.reset();

response.setContentType("application/octet-stream; charset=utf-8");

response.setHeader("Content-Disposition", "attachment; filename=" + new String(fileName.getBytes("GBK"),"ISO8859_1"));

//获取响应报文输出流对象

//获取response对象的输出流

OutputStream out = response.getOutputStream();

byte[] buffer = new byte[1024];

int len;

//循环取出流中的数据

while((len = in.read(buffer)) != -1){

out.write(buffer,0,len);

}

} catch (Exception e) {

e.printStackTrace();

}

}

以上这篇Java后台Controller实现文件下载操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

java下载xlsx文件_Java后台Controller实现文件下载操作相关推荐

  1. Java后台Controller实现文件下载操作

    代码 参数: 1.filePath:文件的绝对路径(d:\download\a.xlsx) 2.fileName(a.xlsx) 3.编码格式(GBK) 4.response.request不介绍了, ...

  2. java下载xlsx文件_【小坑】java下载excel文件

    excel文件的导入导出是很常见的功能,这次做了个下载的功能,踩了一些坑,记下来避免以后重复踩-- 1.inputstream序列化问题 Could not write JSON document: ...

  3. java下载网络文件_java下载网络文件的方法有哪些

    下载网络文件的方法有:字节流下载 apache的FileUtils工具包下载 NIO下载 实现代码如下:package com.dsp.rpc.metricelf; import org.apache ...

  4. java 下载 docx文件_Java文件下载的几种方式.docx

    Java文件下载的几种方式文章分类:/blogs/category/javaJava编程 Java文件下载的几种方式Java代码 public?HttpServletResponse?download ...

  5. java 下载db文件_Java下载文件自定义名称和格式类型

    response.setContentType()的作用是使客户端浏览器,区分不同种类的数据,并根据不同的MIME调用浏览器内不同的程序嵌入模块来处理相应的数据,可以设置文件格式.参考数据如下: re ...

  6. java 下载zip文件_Java以压缩包方式下载文件

    从云服务器上下载文件,以压缩包方式下载 以下载多个文件为例,需要导入zip4j的jar包,版本不要太高 public void downloadZip(List list, HttpServletRe ...

  7. java下载网络文件_java 从网络Url中下载文件

    /** * 从网络Url中下载文件 * @param urlStr * @param fileName * @param savePath * @throws IOException */ publi ...

  8. 如何通过Java下载远程文件到浏览器

    如何通过Java下载远程文件到浏览器 整体思路: 首先获取远程资源的文件输入流,使用HttpServletResponse的输出流,通过Java io转换将输入流转成输出流,写入指定文件,下载到浏览器 ...

  9. java下载网络中的文件,java下载网络文件解决思路

    java下载网络文件 下面这段代码是下载一个http网络文件的代码,但有时候下载下来的图片是完整的,有时候下载下来的不完整,还有下载的ppt,pdf之类,也是打不开的.请大件们给指导一下,小弟感激不尽 ...

最新文章

  1. Java知识整理——JDBC
  2. java mask_Java 三大属性:
  3. LeetCode 323. 无向图中连通分量的数目(并查集)
  4. 加利福尼亚大学(尔湾)等提出 Nasty Teacher,避免模型“被蒸馏”,加强知识产权保护(ICLR 2021)...
  5. 设计模式的C语言应用-状态机模式-第二章
  6. 优酷基于 Pipeline 的播放器开放式架构设计与实践
  7. 高斯低通滤波 matlab_一维和二维高斯函数及其一阶和二阶导数
  8. 在Visual Studio中一次运行两个项目
  9. Microsoft Deployment Toolkit build 8456
  10. 测试开始系列——功能测试用例模板
  11. docker insecure-registry
  12. delphi学习笔记(2)-object pascal语言的语句 选择自 xmz2629 的 Blog
  13. 周记--听平凡人说故事
  14. Hadoop高频面试题(建议收藏)
  15. IPFS 之包管理器GX
  16. 神经平面分布图怎么看,面部神经网络 分布图
  17. JS获取前一年或后一年的时间
  18. 知名公司薪水(转帖)
  19. iOS 使用Moya网络请求
  20. echarts社区(多样化echarts图表)

热门文章

  1. 2022下半年系统集成项目管理工程师易混淆知识点:职能型、矩阵型、项目型组织结构
  2. 删除打印字符的CLEAN函数及清除文本空格的TRIM函数详解
  3. java 声明一个bus类_第11章 新特性 – 你应该更新的Java知识之Observer - Java 基础入门笔记...
  4. 理想国pandas教程(版本01)
  5. excel取消工作表保护
  6. MATLAB中出现 索引超出矩阵维度,老是提示索引超出矩阵维度,求大神指导
  7. 软件测试面试题_每天一道软件测试面试题系列 (八)_描述一次测试用例设计的完整的过程 怎样估计测试工作量?进行测试时产生了哪些文档或记录?
  8. 微信小程序 首页轮播图 x轴 横向滚动视图
  9. 【Linux进程/线程间通信】实现荔枝派zero与电脑串口通信
  10. 你离顶尖Linux运维工程有多远 ?