SView Help Center
English (US)

解压

Author: sviewngts Last Updated: 2026-08-26 15:49
接口名 POST: /login-register/open-api/documents/unzip
入参:(body传值) application/json
是否必传 默认值 描述 备注
fileId 是 - 文件的唯一ID 该文件在企业看图平台内的唯一ID,可在同步文件元信息接口返回值中获取
fileScope 是 - 文件归属域 我的空间->personal 
项目空间(企业空间)->project
入参:(Header传值)
Authorization 是 - 传递AccessToken 格式:Bearer {AccessToken}
入参示例:(application/json)

 

{
    "fileId": "17fc1899dexxx9c24850d308a9",
    "fileScope": “personal”
}
回参示例:(application/json)

 

{
    "code": 0,
    "msg": null,
    "data": {
        "taskId":"aaaaaaaaaaaa" //前端可将此ID作为socketId与服务端建立socket链接,监听解压进度
    },
    "ok": true
}
package com.hoteam.sview.demo;

import cn.hutool.core.util.StrUtil;
import cn.hutool.http.Header;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpStatus;
import cn.hutool.core.util.JsonUtil;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;

/**
 * 压缩包解压调用 Demo
 * 接口:POST /login-register/open-api/documents/unzip
 * 业务成功判定:code=0 成功,code≠0 取 msg 提示
 * 返回taskId可作为socketId建立socket监听解压进度
 */
@Slf4j
public class DocumentUnzipDemo {

    // ===================== 入参实体 =====================
    @Data
    public static class UnzipReq {
        /**
         * 文件唯一ID
         */
        private String fileId;
        /**
         * 文件归属域:personal 我的空间 / project 项目空间
         */
        private String fileScope;
    }

    // ===================== 返回体实体 =====================
    @Data
    public static class UnzipResp {
        private Integer code;
        private String msg;
        private Boolean ok;
        private UnzipData data;
    }

    @Data
    public static class UnzipData {
        /**
         * 解压任务ID,前端socketId监听解压进度
         */
        private String taskId;
    }

    // ===================== 核心调用方法 =====================
    public static UnzipResp unzipFile(String apiBaseUrl, String accessToken, UnzipReq req) {
        if (StrUtil.isBlank(apiBaseUrl)) {
            log.warn("接口基础地址不能为空");
            return null;
        }
        if (StrUtil.isBlank(accessToken)) {
            log.warn("AccessToken不能为空");
            return null;
        }
        if (req == null
                || StrUtil.isBlank(req.getFileId())
                || StrUtil.isBlank(req.getFileScope())) {
            log.warn("解压请求必填参数缺失,req:{}", req);
            return null;
        }

        String fullUrl = apiBaseUrl + "/login-register/open-api/documents/unzip";

        try (HttpResponse response = HttpRequest.post(fullUrl)
                .header(Header.AUTHORIZATION, "Bearer " + accessToken)
                .header(Header.CONTENT_TYPE, "application/json")
                .body(JsonUtil.toJsonStr(req))
                .timeout(60_000)
                .execute()) {

            int status = response.getStatus();
            String respBody = response.body();
            log.info("解压接口响应 status=[{}], body=[{}]", status, respBody);

            if (status != HttpStatus.HTTP_OK) {
                log.warn("解压HTTP请求失败,响应状态码=[{}]", status);
                return null;
            }

            UnzipResp resp = JsonUtil.parse(respBody, UnzipResp.class);
            if (resp == null) {
                log.warn("解压接口返回JSON解析失败");
                return null;
            }

            if (resp.getCode() != null && resp.getCode() != 0) {
                String errMsg = StrUtil.isNotBlank(resp.getMsg()) ? resp.getMsg() : "未知业务异常";
                log.warn("解压业务失败,code=[{}], msg=[{}]", resp.getCode(), errMsg);
                return resp;
            }

            log.info("解压任务提交成功");
            return resp;

        } catch (Exception e) {
            log.error("调用解压接口异常", e);
            return null;
        }
    }

    // ===================== Main 调用示例 =====================
    public static void main(String[] args) {
        String baseApi = "https://xxx.xxx.com";
        String token = "你的AccessToken";

        UnzipReq req = new UnzipReq();
        req.setFileId("平台返回的压缩包文件fileId");
        // personal=我的空间,project=项目空间
        req.setFileScope("personal");

        UnzipResp result = unzipFile(baseApi, token, req);
        if (result == null) {
            log.error("解压请求整体失败");
            return;
        }
        if (result.getCode() != 0) {
            log.error("提交解压任务失败,错误码:{}, 错误信息:{}", result.getCode(), result.getMsg());
            return;
        }

        UnzipData data = result.getData();
        if (data == null || StrUtil.isBlank(data.getTaskId())) {
            log.warn("解压接口未返回taskId");
            return;
        }

        // 获取任务ID,用于socket监听解压进度
        String taskId = data.getTaskId();
        log.info("解压任务提交成功,taskId={},可建立Socket监听解压进度", taskId);
    }
}

 

建立socket连接
// socket地址
ws(s)://{baseURL}/emh/ws/info?socketId={taksId}
// 举例,若域名配置了oss安全证书,则需要以 wss:// 开头
// ws://10.1.201.7:9999/emh/ws/info?socketId=aaaaaaaa
// wss://www.baidu.com/emh/ws/info?socketId=aaaaaaaa
建立连接后,需要实时监听socket返回的消息,根据消息体中的status状态判断是否处理成功,根据 percent 来获取进度
消息体示例

{"code":0,"command":"UNCOMPRESS_FILE","data":"{\"taskId\":\"2fa1931b7f004bb7b1577098368d0729\",\"subTaskType\":\"unzip\",\"status\":\"success\",\"msg\":\"ptc-wire_test.zip文件已解压完毕,请到压缩文件所在文件夹查看\",\"waitingLength\":\"0\",\"waitingTime\":\"0\"}

 

任务状态(status)
new:新建
processing :处理中
success:成功
failed :失败
<template>
  <div class="unzip-container">
    <div v-if="loading">提交解压任务中...</div>
    <div v-if="progress > 0">解压进度:{{ progress }}%</div>
    <div v-if="errorMsg" class="error">{{ errorMsg }}</div>

    <div v-if="unzipSuccess">
      <span>✅ 解压任务完成,可浏览解压后的文件</span>
    </div>
  </div>
</template>

<script>
import axios from 'axios'

export default {
  name: 'DocumentUnzip',
  data() {
    return {
      // 接口基础地址
      baseUrl: 'https://xxx.xxx.com',
      // 你的 token
      token: '你的 accessToken',

      fileId: '压缩包对应的fileId',
      fileScope: 'personal', // personal(我的空间) / project(项目空间)

      taskId: '',
      socket: null,

      loading: false,
      progress: 0,
      errorMsg: '',
      unzipSuccess: false
    }
  },
  mounted() {
    this.submitUnzipTask()
  },
  beforeDestroy() {
    // 页面销毁关闭 socket
    if (this.socket) {
      this.socket.close()
    }
  },
  methods: {
    /**
     * 1. 提交解压任务
     */
    async submitUnzipTask() {
      this.loading = true
      this.errorMsg = ''
      this.unzipSuccess = false

      try {
        const res = await axios({
          url: `${this.baseUrl}/login-register/open-api/documents/unzip`,
          method: 'post',
          headers: {
            Authorization: 'Bearer ' + this.token
          },
          data: {
            fileId: this.fileId,
            fileScope: this.fileScope
          }
        })

        const { code, msg, data } = res.data

        // 业务失败
        if (code !== 0) {
          this.errorMsg = msg || '提交解压任务失败'
          return
        }

        // 获取解压任务taskId,建立socket监听解压进度
        if (data?.taskId) {
          this.taskId = data.taskId
          this.connectSocket()
          return
        }

        this.errorMsg = '接口返回异常:taskId为空'

      } catch (err) {
        console.error(err)
        this.errorMsg = '网络请求异常'
      } finally {
        this.loading = false
      }
    },

    /**
     * 2. 建立 WebSocket 监听解压进度
     */
    connectSocket() {
      // 拼接 socket 地址,http转ws、https转wss
      const socketUrl = `${this.baseUrl.replace('http', 'ws')}/emh/ws/info?socketId=${this.taskId}`
      this.socket = new WebSocket(socketUrl)

      this.socket.onopen = () => {
        console.log('WebSocket‑解压进度监听连接成功')
      }

      this.socket.onmessage = (evt) => {
        try {
          const msg = JSON.parse(evt.data)
          // 解压任务消息(和预览转码socket消息格式一致)
          if (msg.command === 'CONVERT_TASK') {
            const { status, percent } = msg.data || {}
            this.progress = percent || 0

            // 解压成功
            if (status === 'success') {
              this.socket.close()
              this.unzipSuccess = true
            }

            // 解压失败
            if (status === 'failed') {
              this.errorMsg = '压缩包解压失败'
              this.socket.close()
            }
          }
        } catch (e) {
          console.error('socket消息解析失败', e)
        }
      }

      this.socket.onerror = (err) => {
        console.error('socket异常', err)
        this.errorMsg = '解压进度监听连接失败'
      }

      this.socket.onclose = () => {
        console.log('解压‑socket已关闭')
      }
    }
  }
}
</script>

<style scoped>
.error {
  color: red;
  margin: 10px 0;
}
</style>