# 设置在线解压策略(Java SDK)
#### 功能介绍
OBS支持ZIP包上传后自动解压并存放在指定目录。桶设置了在线解压策略后，上传到该桶内的ZIP包如果匹配解压策略，ZIP包将会自动解压到指定目录里。本接口用于为指定桶配置ZIP文件解压策略。了解更多在线解压相关信息，请参见[在线解压](https://support.huaweicloud.com/usermanual-obs/obs_03_0368.html)。
融合桶不支持在线解压。
#### 接口约束
**权限限制：**
- 需要使用IAM的角色与策略授权功能，增加Tenant Administrator权限后才能设置、获取、删除在线解压策略。
- 在线解压源需使用IAM创建云服务委托，委托OBS获取桶内数据，上传数据到桶内。委托需要给OBS服务授予obs:object:PutObject、obs:object:GetObject、obs:object:AbortMultipartUpload权限。
**包及文件大小限制：**
- 单个ZIP包大小上限为**1GB**。
- 单个ZIP包内最多可包含65536个文件。
- ZIP包内，单个文件解压后最大为40GB。
**时间限制：**
- ZIP包解压任务最大时长为10分钟。
**功能限制：**
- ZIP包的后缀必须为zip。
- ZIP包名称中不可带有中文标点符号、特殊符号和特殊编码，如：\\/:\*?"\<\>\|@#￥。
- 针对ZIP包嵌套的场景，在线解压策略的事件类型需设置为ObjectCreated:\*或ObjectCreated:CompleteMultipartUpload。
- 目前不支持解压任务完成后给用户发送消息通知。
- 目前仅支持解压压缩算法为deflated的ZIP包，此处的压缩算法与WINRAR等软件提供的Store、Normal等压缩方法不等同。
- 解压路径加上压缩包解压出文件的文件名，总字符长度不可超过512，否则会导致解压失败。
- 目前不支持解压加密ZIP包。
- 不支持企业联邦用户使用在线解压功能，更多关于联邦用户的相关信息请参考[账号与用户的关系](https://support.huaweicloud.com/iam_faq/iam_01_0615.html)和[身份提供商概述](https://support.huaweicloud.com/usermanual-iam/iam_08_0001.html)。

- OBS支持的region以及region与endPoint的对应关系，详细信息请参见[地区与终端节点](https://developer.huaweicloud.com/endpoint?OBS)。
 
#### 方法定义
obsClient.setBucketCompressPolicy(SetBucketCompressPolicyRequest request)
#### 请求参数说明
表1请求参数列表 
| **参数名称** | **参数类型**                                                    | **是否必选** | **描述**                                                                                                                                     |
|:---|:---|:---|:---|
| request      | [表2 SetBucketCompressPolicyRequest] | 必选             | **参数解释** **：** 设置在线解压策略请求参数，详见[表2 SetBucketCompressPolicyRequest]。 |
   
 表2SetBucketCompressPolicyRequest 
| **参数名称**     | **参数类型** | **是否必选**                                                    | **描述**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
|:---|:---|:---|:---|
| bucketName | String     | 必选   | **参数解释** **：** 桶名。 **约束限制：** - 桶的名字需全局唯一，不能与已有的任何桶名称重复，包括其他用户创建的桶。  - 桶命名规则如下： - 3～63个字符，数字或字母开头，支持小写字母、数字、"-"、"."。  - 禁止使用IP地址。  - 禁止以"-"或"."开头及结尾。  - 禁止两个"."相邻（如："my..bucket"）。  - 禁止"."和"-"相邻（如："my-.bucket"和"my.-bucket"）。    - 同一用户在同一个区域多次创建同名桶不会报错，创建的桶属性以第一次请求为准。   **默认取值：** 无 |
| compressPolicyConfiguration                                           | [表3 CompressPolicyConfiguration]   | 必选 | **参数解释** **：** 策略规则数组。详见[表3 CompressPolicyConfiguration]。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
   
 表3CompressPolicyConfiguration 
| **参数名称** | **参数类型**                                                         | **是否必选** | **描述**                                                                                                                                                                                                                                                                                                                                                                     |
|:---|:---|:---|:---|
| rules     | List\<[表4 CompressPolicyRule]\> | 必选       | **参数解释** **：** 策略规则数组。详见[表4 CompressPolicyRule]。 **约束限制：** 同一个桶下的不同策略前缀不能重复和起始包含，委托建议使用同一个。 **取值范围：** 数组大小\[1, 10\]。 **默认取值**： 无 |
   
 表4CompressPolicyRule 
| **参数名称**       | **参数类型**       | **是否必选** | **描述**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
|:---|:---|:---|:---|
| id            | String        | 必选       | **参数解释：** 解压策略名称。当前桶上配置的解压规则的唯一标识。例如：event_0001。 **约束限制：** - 只能由大写或小写的英文字母、数字、下划线（_）和连字符（-）组成。  - 解压策略名称、解压路径、IAM委托名称长度之和不超过800。   **取值范围：** 长度最长为256的字符串。 **默认取值**： 无 |
| project        | String         | 必选        | **参数解释：** 项目ID。 **取值范围：** 不涉及。 **默认取值**： 无                                                                                                                                                                                                                                                                                                                             |
| agency         | String          | 必选        | **参数解释：** IAM委托名。 **约束限制：** - 委托需要给OBS服务授予obs:object:PutObject、obs:object:GetObject、obs:object:AbortMultipartUpload权限。  - 解压策略名称、解压路径、IAM委托名称长度之和不超过800。   **默认取值：** 无                                                                  |
| events        | List\<String\> | 必选         | **参数解释：** 触发事件类型。 **取值范围：** \["ObjectCreated:\*"\] \["ObjectCreated:Put"\] \["ObjectCreated:Post"\] \["ObjectCreated:Copy"\] \["ObjectCreated:CompleteMultipartUpload"\] **默认取值**： 无                                                       |
| suffix        | String         | 必选        | **参数解释：** 匹配规则后缀。 **约束限制：** 当前仅支持.zip。 **取值范围：** .zip。 **默认取值**： 无                                                                                                                                                                                                                                                 |
| prefix        | String       | 可选         | **参数解释：** 匹配规则前缀。 **取值范围：** 长度最长为1023的字符串。 **默认取值**： 无                                                                                                                                                                                                                                                                                                              |
| overwrite     | int           | 必选         | **参数解释：** 解压后同名文件的处理方式。 **取值范围：** - 0：不覆盖跳过。  - 1：不覆盖，以文件的CRC32值重命名。  - 2：覆盖。   **默认取值**： 无                                                                           |
| decompresspath | String         | 可选        | **参数解释：** 文件解压后存放的路径。 **约束限制：** - 不为空时必须以"/"结尾，且不能以"/"开头。  - 解压策略名称、解压路径、IAM委托名称长度之和不超过800。   **取值范围：** 长度最长为800的字符串。 **默认取值**： 无                                            |
| policytype    | String       | 必选        | **参数解释：** 文件解压策略类型。 **约束限制：** 当前仅支持decompress。 **取值范围：** decompress：执行解压操作。 **默认取值**： decompress                                                                                                                                                                                                         |
   
#### 返回结果说明
表5返回结果HeaderResponse(SDK公共响应结果)各项属性说明 
| **参数名称** | **参数类型**             | **描述**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
|:---|:---|:---|
| statusCode  | int                         | **参数解释：** HTTP状态码。 **取值范围：** 状态码是一组从2xx（成功）到4xx或5xx（错误）的数字代码，状态码表示了请求响应的状态。 完整的状态码列表请参见[状态码](https://support.huaweicloud.com/api-obs/obs_04_0114.html)。 **默认取值：** 无 |
| responseHeaders               | Map\<String, Object\> | **参数解释：** HTTP响应消息头列表，由多个元组构成。元组中String代表响应消息头的名称，Object代表响应消息头的值。 **默认取值：** 无                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
   
#### 代码示例
本示例用于设置examplebucket桶的在线解压策略。
```
import com.obs.services.ObsClient;
import com.obs.services.ObsConfiguration;
import com.obs.services.exception.ObsException;
import com.obs.services.model.compress.CompressPolicyConfiguration;
import com.obs.services.model.compress.CompressPolicyRule;
import com.obs.services.model.compress.SetBucketCompressPolicyRequest;
import java.util.Arrays;
import java.util.List;
public class SetBucketCompressPolicy {
    public static void main(String[] args) {
        // 您可以通过环境变量获取访问密钥AK/SK，也可以使用其他外部引入方式传入。如果使用硬编码可能会存在泄露风险。
        // 您可以登录访问管理控制台获取访问密钥AK/SK
        String ak = System.getenv("ACCESS_KEY_ID");
        String sk = System.getenv("SECRET_ACCESS_KEY_ID");
        // 【可选】如果使用临时AK/SK和SecurityToken访问OBS，同样建议您尽量避免使用硬编码，以降低信息泄露风险。
        // 您可以通过环境变量获取访问密钥AK/SK/SecurityToken，也可以使用其他外部引入方式传入。
        String securityToken = System.getenv("SECURITY_TOKEN");
        // endpoint填写桶所在的endpoint, 此处以华北-北京四为例，其他地区请按实际情况填写。
        // 您可以通过环境变量获取endPoint，也可以使用其他外部引入方式传入。
        String endPoint = System.getenv("ENDPOINT");
        ObsConfiguration obsConfiguration = new ObsConfiguration();
        obsConfiguration.setEndPoint(endPoint);
        ObsClient obsClient = new ObsClient(ak, sk, securityToken, obsConfiguration);
        try {
            String exampleBucket = "examplebucket";
            String ruleId = "rule-001";
            String projectId = "your_project_id";
            // 委托需要给OBS服务授予obs:object: PutObject、obs: object:GetObject、obs: object:AbortMultipartUpload权限
            String agency = "your_agency";
            // 触发事件类型
            List<String> events = Arrays.asList("ObjectCreated:*");
            // 匹配规则后缀
            String suffix = ".zip";
            // 解压后同名文件的处理方式
            Integer overwrite = 0;
            CompressPolicyRule rule = new CompressPolicyRule(ruleId, projectId, agency, events, suffix, overwrite);
            // 匹配规则前缀
            rule.setPrefix("decompress/");
            // 文件解压后存放的路径
            rule.setDecompresspath("after-decompress/");
            // 文件解压策略类型，当前仅支持decompress
            rule.setPolicytype("decompress");
            List<CompressPolicyRule> rules = Arrays.asList(rule);
            CompressPolicyConfiguration config = new CompressPolicyConfiguration(rules);
            SetBucketCompressPolicyRequest setRequest =
                new SetBucketCompressPolicyRequest(exampleBucket, config);
            obsClient.setBucketCompressPolicy(setRequest);
            System.out.println("SetBucketCompressPolicy successfully");
        } catch (ObsException e) {
            System.out.println("SetBucketCompressPolicy failed");
            // 请求失败,打印http状态码
            System.out.println("HTTP Code:" + e.getResponseCode());
            // 请求失败,打印服务端错误码
            System.out.println("Error Code:" + e.getErrorCode());
            // 请求失败,打印详细错误信息
            System.out.println("Error Message:" + e.getErrorMessage());
            // 请求失败,打印请求id
            System.out.println("Request ID:" + e.getErrorRequestId());
            System.out.println("Host ID:" + e.getErrorHostId());
            e.printStackTrace();
        } catch (Exception e) {
            System.out.println("SetBucketCompressPolicy failed");
            // 其他异常信息打印
            e.printStackTrace();
        }
    }
}
```
#### 相关链接
- 更多示例代码，请参见[Github示例](https://github.com/huaweicloud/huaweicloud-sdk-java-obs/blob/master/app/src/test/java/samples_java/PFSBucketAndObjectOperationSample.java)。
- 设置在线解压策略过程中返回的错误码含义、问题原因及处理措施可参考[OBS错误码](https://support.huaweicloud.com/api-obs/obs_04_0115.html#section1)。
 
