OpenFeign 本身主要用于定义和调用 HTTP 服务接口。实现文件下载时,它会向服务端发送一个 HTTP 请求(通常是 GET 请求),服务端接收到请求后,将文件以流的形式返回,客户端再将这个流保存为本地文件,从而完成文件下载。
实现文件下载步骤如下:
服务端代码:
@GetMapping("/download/{filename}") public ResponseEntity<byte[]> downloadFile(@PathVariable("filename") String filename) { try { // D:\tmp\uploads\ 是基础路径 java.io.File file = new java.io.File("D:\\tmp\\uploads\\" + filename); byte[] fileContent = java.nio.file.Files.readAllBytes(file.toPath()); // 设置响应头,告诉浏览器这是一个文件下载,并且指定文件名 org.springframework.http.HttpHeaders headers = new org.springframework.http.HttpHeaders(); headers.add("Content-Disposition", "attachment; filename=" + filename); // 返回文件内容、响应头和状态码200(表示成功) return new ResponseEntity<>(fileContent, headers, org.springframework.http.HttpStatus.OK); } catch (Exception e) { // 如果出现异常,返回状态码500(表示服务器内部错误) return new ResponseEntity<>(null, null, org.springframework.http.HttpStatus.INTERNAL_SERVER_ERROR); } }
代码详细说明:
@GetMapping("/download/{filename}") 定义了一个 GET 请求的接口,{filename} 是一个路径变量,表示要下载的文件名。
在方法内部,首先尝试读取指定目录下的文件,将文件内容读取为字节数组。
然后创建响应头 HttpHeaders,通过 Content-Disposition 属性设置为 attachment; filename=加上文件名,这样浏览器会将响应识别为文件下载,并以指定的文件名保存。
最后返回一个 ResponseEntity,包含文件字节数组、响应头和状态码 200(如果成功)或者 500(如果出现异常)。
定义 Feign 客户端:
// 下载文件 @GetMapping("/simple/download/{filename}") ResponseEntity<byte[]> downloadFile(@PathVariable("filename") String filename);
💥注意:@GetMapping 注解定义了一个 GET 请求方法,路径 /download/{filename} 与服务端的接口路径相对应,{filename} 是一个路径变量,用于指定要下载的文件名。方法返回ResponseEntity<byte[]> 用于接收从服务端返回的包含文件字节数组的响应。
调用 Feign 客户端实现文件下载:
// 下载文件 @GetMapping("/download/{filename}") public ResponseEntity<byte[]> downloadFile(@PathVariable("filename") String filename) { return simpleFeign.downloadFile(filename); }
使用 ApiFox 调用接口,输出如下图:
点击“下载”链接,下载文件,如下图: