获取图文档上传链接
| 接口名 | 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 同步元信息
}
}