当前位置: > > > SpringBoot - 网络请求客户端WebClient使用详解4(下载文件)

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