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)运行结果如下: