OSS文件压缩问题解决方案-可即时下载

90 阅读2分钟

前言

本文致力于提供简洁明了的解决方案以及技术详解,故请详细看代码注释。

前提条件

  • Retrofit2 - 2.9.0
    • Converter-GSON - 2.9.0
  • 阿里云
    • 函数计算
    • OSS对象存储

Maven配置

<!--Retrofit2-->
<dependency>
    <groupId>com.squareup.retrofit2</groupId>
    <artifactId>retrofit</artifactId>
    <version>2.9.0</version>
</dependency>
<dependency>
    <groupId>com.squareup.retrofit2</groupId>
    <artifactId>converter-gson</artifactId>
    <version>2.9.0</version>
</dependency>

请求流程

graph LR
开始 --> 获取Path --> 发送请求 --> 等待3xx状态码 --> 认定成功 --> 结束

相关Java类

/**
 * 数据传输体
 */
@Data
public class FunctionCalculationEntity {
    @SerializedName("bucket")
    private String bucket;
    @SerializedName("source-dir")
    private String sourceDir;
    @SerializedName("source-files")
    private List<String> sourceFiles;
    @SerializedName("dest-file")
    private String destFile;
}
/**
 * 重定向拦截器
 */
public class BodyInterceptor implements Interceptor {
    @Override
    public okhttp3.Response intercept(Chain chain) throws IOException {
        Request request = chain.request();
        okhttp3.Response response = chain.proceed(request);
        if (response.isRedirect()) {
            String location = response.header("Location");
            return response.newBuilder()
                    .code(200) // 将状态码改为200
                    .message(location) // 将重定向地址作为响应消息
                    .build();
        }
        return response;
    }
}

Controller

/**
 * OSS
 */
@Component
@Slf4j
public class OSS{
    private OkHttpClient client = new OkHttpClient.Builder()
            .connectTimeout(15, TimeUnit.SECONDS)
            .readTimeout(15, TimeUnit.SECONDS)
            .addInterceptor(new BodyInterceptor())
            .followRedirects(false)
            .followSslRedirects(false)
            .build();

    public final FunctionCalculationService service = new Retrofit.Builder()
            .baseUrl("函数计算地址")
            .addConverterFactory(GsonConverterFactory.create())
            .client(client)
            .build()
            .create(FunctionCalculationService.class);
}

Service

/**
 * Retrofit请求
 */
public interface FunctionCalculationService {
    @Headers({"Content-Type: application/json;charset=UTF-8"})
    @POST("/")
    Call<Void> zipFiles(@Body FunctionCalculation functionCalculation);
}

请注意:若这里添加X-Fc-Invocation-Type: Async请求头,则不需要拦截器用于拦截重定向请求。

添加X-Fc-Invocation-Type: Async是指该HTTP函数为异步函数,无需等待结果返回。并且请求成功后返回代码是201,符合Retrofit对请求成功的检测。

疑问

  • 为什么选用Retrofit作为请求客户端?不是还有restTemplate么?

原因有很多,这里举例几个最直接的原因:

  1. Retrofit默认支持超时时间,而restTemplate并不支持。
  2. Retrofit我使用的比较顺手,restTemplate是我在接触SpringBoot之后才会使用的东西。
  3. Retrofit可以统一管理请求地址,restTemplate比较分散不易集中管理。

总结

这篇文章是关于如何使用阿里云的函数计算和OSS对象存储来实现文件压缩的功能。文章主要包括以下几个部分:

  • 前言:介绍了文章的目的和范围,以及需要用到的技术和工具。
  • 前提条件:列出了文章所依赖的Maven依赖和版本,以及阿里云的服务和产品。
  • Maven配置:给出了如何在pom.xml文件中添加Retrofit2和Converter-GSON的依赖。
  • 请求流程:用流程图展示了文件压缩的请求过程,从获取路径到发送请求到等待响应。
  • 相关Java类:定义了数据传输体和重定向拦截器两个Java类,用于封装请求参数和处理重定向响应。
  • Controller:创建了OSS类,用于初始化OkHttpClient和Retrofit对象,并创建FunctionCalculationService接口的实例。
  • Service:定义了FunctionCalculationService接口,用于声明zipFiles方法,该方法用于向函数计算地址发送POST请求,并传递FunctionCalculation对象作为请求体。