一、下载单个文件
1.1 前端,使用A标签
<template>
<div>
<hr/>
home
<a href="http://localhost:8080/downloadProvider/downloadFile">下载</a>
</div>
</template>
1.2 后端,将文件,写入响应体
@RestController
@RequestMapping("/downloadProvider")
public class DownloadProviderController {
@GetMapping("/downloadFile")
public void downloaFile(HttpServletResponse response) {
try {
String path = "D:\\Users\\EX-YANGKE016\\Desktop\\请假.txt";
File file = new File(path);
InputStream inputStream = new FileInputStream(file);
BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(file.getName(), "UTF-8"));
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(response.getOutputStream());
int length;
byte[] temp = new byte[10 * 1024];
while ((length = bufferedInputStream.read(temp)) != -1) {
bufferedOutputStream.write(temp, 0, length);
}
bufferedOutputStream.flush();
bufferedOutputStream.close();
bufferedInputStream.close();
inputStream.close();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("文件下载失败");
}
}
}
二、使用Feign调用文件下载
2.1 feign调用
- 只需要将feign接口的返回值从void变更为Response
@GetMapping("/contractOriginApply/batchDownloadAttachments")
Response batchDownloadAttachments(@RequestParam("objectNo") String objectNo,
@RequestParam("objectType") String objectType);
2.2 消费端controller
- 原理:将feign返回的Response,复制到自己的response
@Override
public void batchDownloadAttachments(String objectNo,
String objectType,
HttpServletResponse response) {
InputStream inputStream;
try {
Response serviceResponse = contractClient.batchDownloadAttachments(objectNo, objectType);
Response.Body body = serviceResponse.body();
inputStream = body.asInputStream();
BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", serviceResponse.headers().get("Content-Disposition").toString().replace("[","").replace("]",""));
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(response.getOutputStream());
int length;
byte[] temp = new byte[1024 * 10];
while ((length = bufferedInputStream.read(temp)) != -1) {
bufferedOutputStream.write(temp, 0, length);
}
bufferedOutputStream.flush();
bufferedOutputStream.close();
bufferedInputStream.close();
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}