1、上一章节介绍了spring boot项目实现java上传,网站链接:https://blog.csdn.net/qq_41790332/article/details/102656636。本章主要讲解总结spring boot项目中使用java是如何下载文件的。
2、后台接口代码(我这里使用的是通过文件的url进行下载操作)
/**
* 描述:通过id下载所对应的附件
* author:yulin
* Create date 2019-10-13 16:18
*/
@GetMapping("/downByFileId")
@ResponseBody
public void downByFileId(@RequestParam(value="id", required=false) Integer id, HttpServletResponse response,HttpServletRequest request)throws FileNotFoundException, UnsupportedEncodingException {
//通过id查询获取到url
File2 file2=fileService.findByFileId( id );
String fileName=file2.getFileTrueName();
try {
URL url = new URL(request.getScheme() + "://" + request.getServerName() +":" + request.getServerPort()+ "/assets/file/" + URLEncoder.encode(file2.getFileTrueName(),"utf-8"));
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();
//获取自己数组
byte[] bs = readInputStream(inputStream);
/*response.setContentType("application/octet-stream;charset=ISO8859-1");*/
BufferedOutputStream output = null;
String fileNameDown=null;
try {
output = new BufferedOutputStream(response.getOutputStream());
// 中文文件名必须转码为 ISO8859-1,否则为乱码
fileNameDown = URLEncoder.encode(fileName, "UTF-8");
response.setContentType("application/force-download");
response.setHeader("Content-Disposition", "attachment;filename=" + fileNameDown);
output.write(bs);
response.flushBuffer();
} catch (Exception e) {
System.out.println( "错误" );
} // 用户可能取消了下载
finally {
if(output!=null){
try {
output.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 从输入流中获取字节数组
* @param inputStream
* @return
* @throws IOException
*/
public static byte[] readInputStream(InputStream inputStream) throws IOException {
byte[] buffer = new byte[1024];
int len = 0;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
while((len = inputStream.read(buffer)) != -1) {
bos.write(buffer, 0, len);
}
bos.close();
return bos.toByteArray();
}
需要注意的是 通过url下载时候需要将url中的中文名进行编码,要不后台控制台就会抛错。
前台js:
//下载文件
function download1(a) {
window.open("/downByFileId?id="+a);
}
用windows.open主要是为了适应微软自带的edge浏览器,如果使用<a>标签或者windows.location.href进行打开的话会出现闪退的现象。