前言
在一些系统中,上次文件和下载文件都是十分常见的操作,在以后的博客中,已经跟大家分享了图片/文件上传的API,今天在这里跟大家分享一下文件下载的API。
功能简述
使用SpringBoot编写API,供前端开发者调用,可以做到点击一个按钮之后,下载指定的文件。
具体实现
现在来看只要的控制器代码
@CrossOrigin //实现跨域请求
//下面是编写接口名和请求方式
@RequestMapping(value = "/getDoc", method = RequestMethod.GET)
public void getDoc(HttpServletRequest request,
HttpServletResponse response) throws UnsupportedEncodingException {
//这里是我自己的逻辑,主要是拿到文件名
String alias = "fuwu";
String fileName = docService.fileDocPath(alias);
//测试文件名是否已经拿到
System.out.println(fileName);
// 文件名存在,则进行下载
if (fileName != null) {
//设置要从哪里文件中,找对应的文件
//若把API放到服务器上面的话,则换成相对应的服务器目录
String realPath = "E:\\Spring\\data\\doc\\";
File file = new File(realPath, fileName);
// 如果文件存在,则进行下载
if (file.exists()) {
// 配置文件下载
response.setHeader("content-type", "application/octet-stream");
response.setContentType("application/octet-stream");
// 下载文件能正常显示中文
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
// 实现文件下载
byte[] buffer = new byte[1024];
FileInputStream fis = null;
BufferedInputStream bis = null;
try {
fis = new FileInputStream(file);
bis = new BufferedInputStream(fis);
OutputStream os = response.getOutputStream();
int i = bis.read(buffer);
while (i != -1) {
os.write(buffer, 0, i);
i = bis.read(buffer);
}
System.out.println("Download the song successfully!");
} catch (Exception e) {
System.out.println("Download the song failed!");
} finally {
if (bis != null) {
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
}
根据上面的代码,我们的文件下载的API就已经写好了,之后还要测试一下这个接口是否可以被成功的访问到:
<button onclick="window.location.href='http://localhost:8080/api/getDoc'">下载doc</button>
这里要注意,文件下载的API是只能通过同步方法进行请求的,如果你通过异步的方法进行请求的话,则会报错的,大家注意一下
今天就分享到这里了,希望可以帮助到你