SView Help Center
English (US)

获取图文档上传链接

Author: sviewngts Last Updated: 2026-08-25 16:31
接口名 POST: dms/common/oss/uploadUrl
入参:(body传值) application/json
是否必传 默认值 描述 备注
objectName 是 - 待上传的文件名 待上传的文件名,需携带后缀
category 是 - 目录类别 见下方描述
入参示例:(application/json)

 

{
    "objectName": "test.prt",
    "category": "entProjectSpace"
}
回参示例:(application/json)

 

 
{
    "code": 0,
    "msg": null,
    "data": {
        "relativePath": "sviewbusiness%2Ftest%2F20260526%2F105840196370411d9a70af13d98a45ed%2Ftest.prt",
        "uploadUrl": "http://10.1.201.9:9999/dms/common/local/upload?bucketName=sviewngts&objectName=sviewbusiness/test/20260526/105840196370411d9a70af13d98a45ed/test.prt"
    },
    "ok": true
}

 

category:
  "entCommon":"企业看图通用路径"
  "entMySpace":"企业看图我的空间路径"
  "entProjectSpace":"企业看图项目空间路径" //默认使用这个即可
  "entAvatar":"企业看图用户头像"
  "entProjectCover":"企业看图项目封面"
  "entPbr":"企业看图pbr材质"
package com.hoteam.sview.demo;

import cn.hutool.core.util.StrUtil;
import cn.hutool.http.ContentType;
import cn.hutool.http.Header;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpStatus;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;

/**
 * 获取图文档上传链接 调用 Demo
 * <p>
 * 接口:POST /dms/common/oss/uploadUrl
 * 注意:该接口无需传递 AccessToken 与公共 Header(tenant-id 等)。
 */
@Slf4j
public class GetUploadUrlDemo {

    /** 业务网关地址,部署时替换为实际 gateway 地址 */
    private static final String UPLOAD_URL_API = "http://your-host/dms/common/oss/uploadUrl";

    /** category 枚举:见接口文档说明 */
    public static final class Category {
        /** 企业看图通用路径 */
        public static final String ENT_COMMON = "entCommon";
        /** 企业看图我的空间路径 */
        public static final String ENT_MY_SPACE = "entMySpace";
        /** 企业看图项目空间路径(默认推荐 */
        public static final String ENT_PROJECT_SPACE = "entProjectSpace";
        /** 企业看图用户头像 */
        public static final String ENT_AVATAR = "entAvatar";
        /** 企业看图项目封面 */
        public static final String ENT_PROJECT_COVER = "entProjectCover";
        /** 企业看图 pbr 材质 */
        public static final String ENT_PBR = "entPbr";

        private Category() {}
    }

    /**
     * 上传链接结果对象
     */
    @Data
    public static class UploadUrlResult {
        /** OSS 上的相对路径,后续同步元信息时使用 */
        private String relativePath;
        /** 实际可执行 PUT/POST 上传的预签名 URL */
        private String uploadUrl;
    }

    /**
     * 获取图文档上传链接(免鉴权)
     *
     * @param objectName 待上传的文件名(必须携带后缀,例如:test.prt)
     * @param category   目录类别,参考 {@link Category},为空时默认 entMySpace
     * @return 上传链接结果,失败返回 null
     */
    public static UploadUrlResult getUploadUrl(String objectName, String category) {
        if (StrUtil.isBlank(objectName)) {
            log.warn("objectName 不能为空");
            return null;
        }
        if (!StrUtil.contains(objectName, ".")) {
            log.warn("objectName 需要携带后缀,例如 test.prt,当前: [{}]", objectName);
            return null;
        }

        // 组装 body
        JSONObject body = new JSONObject();
        body.set("objectName", objectName);
        body.set("category", StrUtil.isBlank(category) ? Category.ENT_MY_SPACE : category);

        HttpRequest request = HttpRequest.post(UPLOAD_URL_API)
                .header(Header.CONTENT_TYPE, ContentType.JSON.getValue())
                .body(body.toString())
                .timeout(10_000);

        // 该接口无需传递 AccessToken,也无需透传公共 Header(tenant-id / deviceId 等)

        try (HttpResponse response = request.execute()) {
            int status = response.getStatus();
            String respBody = response.body();
            log.info("获取上传链接响应: status=[{}], body=[{}]", status, respBody);

            if (status == HttpStatus.HTTP_UNAUTHORIZED) {
                log.warn("接口返回 401,但本接口无需鉴权,请检查网关路由配置, body=[{}]", respBody);
                return null;
            }
            if (!response.isOk() || StrUtil.isBlank(respBody)) {
                log.warn("获取上传链接响应异常: status=[{}], body=[{}]", status, respBody);
                return null;
            }

            JSONObject json = JSONUtil.parseObj(respBody);
            // 仅以 code=0 判定业务成功
            Integer code = json.getInt("code");
            if (code == null || code != 0) {
                log.warn("获取上传链接业务失败: code=[{}], msg=[{}], body=[{}]",
                        code, json.getStr("msg"), respBody);
                return null;
            }

            JSONObject data = json.getJSONObject("data");
            if (data == null) {
                log.warn("响应中未提取到 data, body=[{}]", respBody);
                return null;
            }
            String relativePath = data.getStr("relativePath");
            String uploadUrl = data.getStr("uploadUrl");
            if (StrUtil.hasBlank(relativePath, uploadUrl)) {
                log.warn("响应 data 字段不完整, data=[{}]", data);
                return null;
            }

            UploadUrlResult result = new UploadUrlResult();
            result.setRelativePath(relativePath);
            result.setUploadUrl(uploadUrl);

            log.info("获取上传链接成功: objectName=[{}], category=[{}], relativePath=[{}], uploadUrl=[{}]",
                    objectName, body.getStr("category"), relativePath, uploadUrl);
            return result;
        } catch (Exception e) {
            log.error("获取图文档上传链接接口异常", e);
            return null;
        }
    }

    /**
     * 调用入口示例
     */
    public static void main(String[] args) {
        // 默认走 entMySpace 我的空间路径
        UploadUrlResult result = getUploadUrl("test.prt", Category.ENT_MY_SPACE);
        if (result == null) {
            log.warn("获取上传链接失败");
            return;
        }
        log.info("relativePath = {}", result.getRelativePath());
        log.info("uploadUrl    = {}", result.getUploadUrl());

        // 后续步骤:使用 uploadUrl 进行实际文件 PUT/POST 上传,再使用 relativePath 同步元信息
    }
}