SpringBoot - 网络请求客户端WebClient使用详解4(下载文件)
五、文件下载
1,下载图片
(1)下面是一个图片下载的样例,下载一个网络上的图片并保存到本地。
@RestController
public class HelloController {
// 创建 WebClient 对象
private WebClient webClient = WebClient.builder()
.build();
@GetMapping("/test")
public void test() {
// 记录下开始下载时的时间
Instant now = Instant.now();
Mono<Resource> mono = webClient
.get() // GET 请求
.uri("https://www.baidu.com/img/bd_logo1.png") // 请求路径
.accept(MediaType.IMAGE_PNG)
.retrieve() // 获取响应体
.bodyToMono(Resource.class); //响应数据类型转换
Resource resource = mono.block();
try {
// 文件保存的本地路径
String targetPath = "/Users/hangge/Desktop/logo.png";
// 将下载下来的图片保存到本地
BufferedImage bufferedImage = ImageIO.read(resource.getInputStream());
ImageIO.write(bufferedImage, "png", new File(targetPath));
} catch (IOException e) {
System.out.println("文件写入失败:" + e.getMessage());
}
System.out.println("文件下载完成,耗时:" + ChronoUnit.MILLIS.between(now, Instant.now())
+ " 毫秒");
return;
}
}
(2)运行结果如下:

2,下载文件
(1)下面代码下载一个 zip 文件并保存到本地,文件名不变(使用原始的文件名)
@RestController
public class HelloController {
// 创建 WebClient 对象
private WebClient webClient = WebClient.builder()
.build();
@GetMapping("/test")
public void test() {
// 记录下开始下载时的时间
Instant now = Instant.now();
Mono<ClientResponse> mono = webClient
.get() // GET 请求
.uri("http://www.hangge.com/1.zip") // 请求路径
.accept(MediaType.APPLICATION_OCTET_STREAM)
.exchange(); // 获取响应体
ClientResponse response = mono.block();
try {
// 从header中获取原始文件名
HttpHeaders httpHeaders = response.headers().asHttpHeaders();
String contentLocation = httpHeaders.getFirst(HttpHeaders.LOCATION);
String fileName = contentLocation.substring(contentLocation.lastIndexOf("/")+1);
// 将文件保存到桌面(文件名不变)
Resource resource = response.bodyToMono(Resource.class).block();
File out = new File("/Users/hangge/Desktop/" + fileName);
FileUtils.copyInputStreamToFile(resource.getInputStream(),out);
System.out.println("文件保存成功:" + out.getAbsolutePath());
} catch (IOException e) {
System.out.println("文件写入失败:" + e.getMessage());
}
System.out.println("文件下载完成,耗时:" + ChronoUnit.MILLIS.between(now, Instant.now())
+ " 毫秒");
return;
}
}
(2)运行结果如下:
