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

网友投稿 731 2022-11-18


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

代码

参数:

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

2.fileName(a.xlsx)

3.编码http://格式(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();

}

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Springmvc请求参数类型转换器及原生api代码实例
下一篇:java中下拉框select和单选按钮的回显操作
相关文章

 发表评论

暂时没有评论,来抢沙发吧~