Spring Mvc下实现以文件流方式下载文件的方法示例
作者:爱吃牛奶糖 发布时间:2023-11-12 10:14:22
标签:Spring,Mvc,文件流,下载
项目中需要对一个点击事件进行下载操作,同时通过点击事件,已经可以从jsp页面获取到需要访问的URL和下载的文件名(数据库获取,jsp页面显示)。点击事件JS如下:
function downloadFile(filePath,fileName){
fileName = fileName.substr(0,fileName.lastIndexOf("."));
$.ajax({
async : false,
cache:false,
type: 'get',
dataType : "json",
url: RootPath() + "/checkDownload",//请求的action路径
data:{url:filePath},
error: function () {//请求失败处理函数
alert("下载失败");
},
success:function(json) { //请求成功后处理函数。
var code = json.code;
if(code) {
window.location.href = RootPath()+"/todownload?url="+filePath+"&name="+fileName;
}else {
layer.alert(fileName+' 文件不存在');
}
}
});
}
该ajax调用后台(checkDownload)方法,首先判断从该url能否获得指定下载的文件,如果获取不到,方法返回参数code=0,页面弹出“...文件不存在”。
@RequestMapping("/checkDownload")
@ResponseBody
public Result checkDownload(String url,HttpServletResponse response) {
Result result = Result.createSuccessResult();
HttpURLConnection conn = null;
try {
URL path = new URL(url);
conn = (HttpURLConnection) path.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5 * 1000);
conn.getInputStream();// 通过输入流获取数据
} catch (IOException ex) {
result.setCode(0);
ex.printStackTrace();
}finally {
if(conn != null) {
conn.disconnect();
}
}
return result;
}
如果checkDownload方法中能够正确获得资源,方法返回参数code=1,ajax成功执行:window.location.href = RootPath()+"/todownload?url="+filePath+"&name="+fileName; 调用(todownload)方法,传入url和name,执行文件下载。
@RequestMapping("/todownload")
@ResponseBody
public void download(String url, String name, HttpServletResponse response) {
HttpURLConnection conn = null;
try {
File file = new File(url);
// 取得文件的后缀名。
String ext = file.getName().substring(file.getName().lastIndexOf(".") + 1).toLowerCase();
StringBuffer buffername = new StringBuffer(name);
String filename = buffername.append(".").append(ext).toString();
URL path = new URL(url);
conn = (HttpURLConnection) path.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5 * 1000);
InputStream fis = conn.getInputStream();// 通过输入流获取数据
byte[] buffer = readInputStream(fis);
if (null != buffer && buffer.length > 0) {
// 清空response
response.reset();
// 设置response的Header
response.addHeader("Content-Disposition","attachment;filename="+ new String((filename).getBytes("GBK"),"ISO8859_1"));
response.addHeader("Content-Length", "" + buffer.length);
OutputStream toClient = response.getOutputStream();
response.setContentType("application/octet-stream");
toClient.write(buffer);
toClient.flush();
toClient.close();
}
} catch (IOException ex) {
ex.printStackTrace();
}finally {
if(conn != null) {
conn.disconnect();
}
}
}
/**
* 从输入流中获取数据
* @param inStream 输入流
* @return
* @throws Exception
*/
private byte[] readInputStream(InputStream fis) throws IOException {
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while( (len=fis.read(buffer)) != -1 ){
outStream.write(buffer, 0, len);
}
fis.close();
return outStream.toByteArray();
}
PS:Spring MVC 文件流形式下载(返回)视频文件
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
/**
* 文件流形式下载视频
* @author Front Ng
* @date 2019-05-23 09:25
**/
@Controller
@RequestMapping(value = "/download")
@Api(value = "下载", tags = "下载")
public class DownloadController {
@ApiOperation(value = "下载视频")
@RequestMapping(method = RequestMethod.GET)
public void download(HttpServletResponse response) throws IOException {
File file = new File("/Users/front/Downloads/123.mp4");
FileInputStream inputStream = new FileInputStream(file);
byte[] data = new byte[(int) file.length()];
int length = inputStream.read(data);
inputStream.close();
String fileName = URLEncoder.encode("文件流形式视频.mp4", "UTF-8");
response.setContentType("application/octet-stream;charset=UTF-8");
response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
response.addHeader("Content-Length", "" + data.length);
OutputStream stream = response.getOutputStream();
stream.write(data);
stream.flush();
stream.close();
}
}
来源:https://blog.csdn.net/u011232863/article/details/79931509


猜你喜欢
- Java 数据库连接池详解数据库连接池的原理是:连接池基本的思想是在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库
- C#自己没有Inputbox这个类,但是Inputbox也蛮好用的,所以有两种方法可以使用一:间接调用vb中的Inputbox功能 
- 本文实例讲述了C#利用Windows自带gdi32.dll实现抓取屏幕功能,是C#应用程序设计中一个非常实用的功能,现分享给大家供大家参考借
- Comparable 比较器,内置定义的比较方法,实现比较 较简单Comparator 策略模式,需要定义不同的策略和比较的对象,实现比较
- class MyThreadScopeData { // 单例 &nbs
- 前言Mybatis作为一个应用广泛的优秀的ORM框架,已经成了JavaWeb世界近乎标配的部分,这个框架具有强大的灵活性,在四大组件(Exe
- pom.xml配置<dependency> <groupId>org.springframework.
- 在这里,记录我在项目中使用log4net记录本地日志的步骤。在不会之前感觉很难,很神秘,一旦会了之后其实没那么难。其实所有的事情都是一样的,
- 1.使用java.util.Properties类的load()方法示例:Java代码InputStream in = lnew Buffe
- 目录文件下载文件上传 * * 的配置多个 * 的执行顺序异常处理器基于配置的异常处理基于注解的异常处理总结文件下载使用ResponseEn
- spring缓存cache的使用在spring配置文件中添加schema和spring对缓存注解的支持:<?xml version=&
- 对于生成的sql语句 自动加上单引号的情况mybatis是这样的,如果表的字段跟系统字段冲突,写sql语句的时候必须得加上单引号,这样才会区
- 在上一节中,我带大家学习了详解SpringBoot集成Redis来实现缓存技术方案,尤其是结合Spring Cache的注解的实现方案,接下
- 前段时间spring boot 2.0发布了,与之对应的spring cloud Finchley版本也随之而来了,两者之间的关系和版本对应
- 序列化与反序列化是.net程序设计中常见的应用,本文即以实例展示了.net实现序列化与反序列化的方法。具体如下:一般来说,.net中的序列化
- 本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下此篇博客为整理文章,供大家学习。1.首先下载common
- 数据加解密的实现方式多种多样,在mybatis环境中数据加解密变得非常简单易用,本文旨在提供参考,在生产中应尽可能完成单元测试,开展足够的覆
- 一、前言原型模式是一种比较简单的模式,也非常容易理解,实现一个接口,重写一个方法即完成了原型模式。在实际应用中,原型模式很少单独出现。经常与
- 前言:最近终于用上了高性能的测试机(54C96G * 3),相较之前的单机性能提升了三倍,数量提升了三倍,更关键的宽带提单机升了30倍不止,
- 前言本文主要介绍其具体的实现思路(视频仅有代码输入,并无过程介绍等),同时,在原本实现的基础上,进行了多处修改和优化,具体参见下面的内容。优