From 952595dbb77fc9016f21d6ecf47f58b84f63fd78 Mon Sep 17 00:00:00 2001
From: DongZeLiang <2746733890@qq.com>
Date: Sat, 22 Feb 2025 15:56:57 +0800
Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.gitignore | 35 +++++
pom.xml | 62 +++++++++
.../muyu/aliyun/AliYunBaiLianApplication.java | 18 +++
.../aliyun/bailian/AddDataManagement.java | 47 +++++++
.../com/muyu/aliyun/bailian/ApplyLease.java | 95 ++++++++++++++
.../com/muyu/aliyun/bailian/Md5Utils.java | 39 ++++++
.../muyu/aliyun/bailian/ReviewResolution.java | 58 ++++++++
.../muyu/aliyun/bailian/TemporaryStorage.java | 124 ++++++++++++++++++
.../config/AlibabaCloudClientConfig.java | 30 +++++
.../bailian/data/FileUploadLeaseMode.java | 43 ++++++
.../data/UploadDataManagementMode.java | 27 ++++
.../bailian/data/UploadDescribeFileMode.java | 26 ++++
.../aliyun/bailian/data/UploadFileModel.java | 43 ++++++
.../aliyun/bailian/data/UploadPathMode.java | 20 +++
.../fixed/AddFileResponseBodyDataMode.java | 25 ++++
.../DescribeFileResponseBodyDataMode.java | 62 +++++++++
.../data/fixed/UploadLeaseParamsMode.java | 31 +++++
.../com/muyu/aliyun/config/OssConfig.java | 36 +++++
.../KnowledgeBaseUploadController.java | 21 +++
.../service/KnowledgeBaseUploadService.java | 8 ++
.../impl/KnowledgeBaseUploadServiceImpl.java | 121 +++++++++++++++++
src/main/resources/application.yml | 7 +
22 files changed, 978 insertions(+)
create mode 100644 .gitignore
create mode 100644 pom.xml
create mode 100644 src/main/java/com/muyu/aliyun/AliYunBaiLianApplication.java
create mode 100644 src/main/java/com/muyu/aliyun/bailian/AddDataManagement.java
create mode 100644 src/main/java/com/muyu/aliyun/bailian/ApplyLease.java
create mode 100644 src/main/java/com/muyu/aliyun/bailian/Md5Utils.java
create mode 100644 src/main/java/com/muyu/aliyun/bailian/ReviewResolution.java
create mode 100644 src/main/java/com/muyu/aliyun/bailian/TemporaryStorage.java
create mode 100644 src/main/java/com/muyu/aliyun/bailian/config/AlibabaCloudClientConfig.java
create mode 100644 src/main/java/com/muyu/aliyun/bailian/data/FileUploadLeaseMode.java
create mode 100644 src/main/java/com/muyu/aliyun/bailian/data/UploadDataManagementMode.java
create mode 100644 src/main/java/com/muyu/aliyun/bailian/data/UploadDescribeFileMode.java
create mode 100644 src/main/java/com/muyu/aliyun/bailian/data/UploadFileModel.java
create mode 100644 src/main/java/com/muyu/aliyun/bailian/data/UploadPathMode.java
create mode 100644 src/main/java/com/muyu/aliyun/bailian/data/fixed/AddFileResponseBodyDataMode.java
create mode 100644 src/main/java/com/muyu/aliyun/bailian/data/fixed/DescribeFileResponseBodyDataMode.java
create mode 100644 src/main/java/com/muyu/aliyun/bailian/data/fixed/UploadLeaseParamsMode.java
create mode 100644 src/main/java/com/muyu/aliyun/config/OssConfig.java
create mode 100644 src/main/java/com/muyu/aliyun/controller/KnowledgeBaseUploadController.java
create mode 100644 src/main/java/com/muyu/aliyun/service/KnowledgeBaseUploadService.java
create mode 100644 src/main/java/com/muyu/aliyun/service/impl/KnowledgeBaseUploadServiceImpl.java
create mode 100644 src/main/resources/application.yml
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..d769462
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,35 @@
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### Eclipse ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/
+
+### Mac OS ###
+.DS_Store
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..fe8e587
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,62 @@
+
+
+ 4.0.0
+
+ org.example
+ alibailian
+ 1.0-SNAPSHOT
+
+
+ 17
+ 17
+ UTF-8
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+ 3.2.6
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ 3.2.6
+
+
+
+ com.aliyun.oss
+ aliyun-sdk-oss
+ 3.17.4
+
+
+
+ com.alibaba
+ dashscope-sdk-java
+ 2.18.0
+
+
+ com.aliyun
+ bailian20231229
+ 2.0.0
+
+
+ com.aliyun
+ tea-openapi
+ 0.3.6
+
+
+ com.aliyun
+ tea-console
+ 0.0.1
+
+
+ com.aliyun
+ tea-util
+ 0.2.23
+
+
+
\ No newline at end of file
diff --git a/src/main/java/com/muyu/aliyun/AliYunBaiLianApplication.java b/src/main/java/com/muyu/aliyun/AliYunBaiLianApplication.java
new file mode 100644
index 0000000..7180d48
--- /dev/null
+++ b/src/main/java/com/muyu/aliyun/AliYunBaiLianApplication.java
@@ -0,0 +1,18 @@
+package com.muyu.aliyun;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+/**
+ * @author dongzeliang
+ * @version 1.0
+ * @description: 阿里云百炼
+ * @date 2025/2/21 17:33
+ */
+@SpringBootApplication
+public class AliYunBaiLianApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(AliYunBaiLianApplication.class, args);
+ }
+}
diff --git a/src/main/java/com/muyu/aliyun/bailian/AddDataManagement.java b/src/main/java/com/muyu/aliyun/bailian/AddDataManagement.java
new file mode 100644
index 0000000..38ebfa0
--- /dev/null
+++ b/src/main/java/com/muyu/aliyun/bailian/AddDataManagement.java
@@ -0,0 +1,47 @@
+package com.muyu.aliyun.bailian;
+
+import com.aliyun.bailian20231229.Client;
+import com.aliyun.bailian20231229.models.AddFileRequest;
+import com.aliyun.bailian20231229.models.AddFileResponse;
+import com.aliyun.bailian20231229.models.AddFileResponseBody;
+import com.aliyun.tea.TeaException;
+import com.aliyun.teautil.models.RuntimeOptions;
+import com.muyu.aliyun.bailian.data.UploadDataManagementMode;
+import com.muyu.aliyun.bailian.data.fixed.AddFileResponseBodyDataMode;
+import lombok.extern.log4j.Log4j2;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.HashMap;
+import java.util.Map;
+@Component
+@Log4j2
+public class AddDataManagement {
+
+
+ @Autowired
+ private Client client;
+
+ public AddFileResponseBodyDataMode addFile(UploadDataManagementMode uploadDataManagementMode) {
+ AddFileRequest addFileRequest = new AddFileRequest();
+ RuntimeOptions runtime = new RuntimeOptions();
+ Map headers = new HashMap<>();
+ try {
+ AddFileResponse addFileResponse = client.addFileWithOptions(uploadDataManagementMode.getWorkspaceId(), addFileRequest, headers, runtime);
+ if (addFileResponse.getStatusCode() != 200) {
+ throw new RuntimeException(addFileResponse.toString());
+ }
+ AddFileResponseBody body = addFileResponse.getBody();
+ AddFileResponseBody.AddFileResponseBodyData data = body.getData();
+ log.info("data:{}", data);
+ return AddFileResponseBodyDataMode.builder()
+ .fileId(data.getFileId())
+ .parser(data.getParser())
+ .build();
+
+ } catch (Exception error) {
+ log.error("异常:「{}」", error.getMessage(), error);
+ }
+ return null;
+ }
+}
diff --git a/src/main/java/com/muyu/aliyun/bailian/ApplyLease.java b/src/main/java/com/muyu/aliyun/bailian/ApplyLease.java
new file mode 100644
index 0000000..c561d21
--- /dev/null
+++ b/src/main/java/com/muyu/aliyun/bailian/ApplyLease.java
@@ -0,0 +1,95 @@
+// This file is auto-generated, don't edit it. Thanks.
+package com.muyu.aliyun.bailian;
+
+import com.aliyun.bailian20231229.Client;
+import com.aliyun.bailian20231229.models.ApplyFileUploadLeaseResponse;
+import com.aliyun.bailian20231229.models.ApplyFileUploadLeaseResponseBody;
+import com.aliyun.bailian20231229.models.ApplyFileUploadLeaseRequest;
+import com.aliyun.tea.*;
+import com.aliyun.teautil.models.RuntimeOptions;
+import com.muyu.aliyun.bailian.data.FileUploadLeaseMode;
+import com.muyu.aliyun.bailian.data.fixed.UploadLeaseParamsMode;
+import lombok.extern.log4j.Log4j2;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Component
+@Log4j2
+public class ApplyLease {
+
+ @Autowired
+ private Client client;
+
+ public UploadLeaseParamsMode applyFileUploadLease(FileUploadLeaseMode fileUploadLeaseModel) {
+ ApplyFileUploadLeaseRequest applyFileUploadLeaseRequest = new ApplyFileUploadLeaseRequest();
+ RuntimeOptions runtime = new RuntimeOptions();
+ Map headers = new HashMap<>();
+
+ applyFileUploadLeaseRequest.setFileName(fileUploadLeaseModel.getFileName());
+ applyFileUploadLeaseRequest.setMd5(fileUploadLeaseModel.getMd5());
+ applyFileUploadLeaseRequest.setSizeInBytes(fileUploadLeaseModel.getSizeInBytes());
+ applyFileUploadLeaseRequest.setCategoryType(fileUploadLeaseModel.getCategoryId());
+
+ try {
+ // 复制代码运行请自行打印 API 的返回值
+ ApplyFileUploadLeaseResponse applyFileUploadLeaseResponse =
+ client.applyFileUploadLeaseWithOptions(fileUploadLeaseModel.getCategoryId(), fileUploadLeaseModel.getWorkspaceId(), applyFileUploadLeaseRequest, headers, runtime);
+ if (applyFileUploadLeaseResponse.getStatusCode() != 200) {
+ throw new RuntimeException(applyFileUploadLeaseResponse.toString());
+ }
+ ApplyFileUploadLeaseResponseBody body = applyFileUploadLeaseResponse.getBody();
+ ApplyFileUploadLeaseResponseBody.ApplyFileUploadLeaseResponseBodyData data = body.getData();
+ ApplyFileUploadLeaseResponseBody.ApplyFileUploadLeaseResponseBodyDataParam param = data.getParam();
+ log.info("param:「{}」", param);
+ return UploadLeaseParamsMode.builder()
+ .Url(param.getUrl())
+ .Method(param.getMethod())
+ .build();
+
+ } catch (TeaException error) {
+ String exceptionName;
+ switch (error.getCode()) {
+ case "SDK.ConnectTimeout":
+ exceptionName = "网络连接超时";
+ break;
+ case "SDK.ReadTimeout":
+ exceptionName = "网络读取超时";
+ break;
+ case "SDK.ServerUnreachable":
+ exceptionName = "服务器不可达";
+ break;
+ case "InvalidAccessKeyId.NotFound":
+ exceptionName = "无效的访问密钥 ID";
+ break;
+ case "SignatureDoesNotMatch":
+ exceptionName = "签名不匹配";
+ break;
+ case "MissingParameter":
+ exceptionName = "缺少必要参数";
+ break;
+ case "InvalidParameterValue":
+ exceptionName = "参数值无效";
+ break;
+ case "Forbidden.NoPermission":
+ exceptionName = "没有权限";
+ break;
+ default:
+ exceptionName = "未知阿里云 API 异常";
+ }
+ log.error("异常名称:「{}」,错误码: {}, 错误信息: {}, 错误数据: {}", exceptionName, error.getCode(), error.getMessage(), error.getData());
+ } catch (NullPointerException e) {
+ log.error("异常名称:「空指针异常」,错误信息: {}", e.getMessage(), e);
+ } catch (ClassCastException e) {
+ log.error("异常名称:「类型转换异常」,错误信息: {}", e.getMessage(), e);
+ } catch (ArrayIndexOutOfBoundsException e) {
+ log.error("异常名称:「数组越界异常」,错误信息: {}", e.getMessage(), e);
+ } catch (Exception _error) {
+ log.error("异常名称:「未知通用异常」,错误信息: {}", _error.getMessage(), _error);
+ }
+ return null;
+ }
+
+}
diff --git a/src/main/java/com/muyu/aliyun/bailian/Md5Utils.java b/src/main/java/com/muyu/aliyun/bailian/Md5Utils.java
new file mode 100644
index 0000000..693ab7e
--- /dev/null
+++ b/src/main/java/com/muyu/aliyun/bailian/Md5Utils.java
@@ -0,0 +1,39 @@
+package com.muyu.aliyun.bailian;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+/**
+ * Md5工具类
+ */
+public class Md5Utils {
+ public static String getFileMd5(String filePath) {
+ MessageDigest digest = null;
+ try {
+ digest = MessageDigest.getInstance("MD5");
+
+ try (InputStream is = Files.newInputStream(Paths.get(filePath))) {
+ byte[] buffer = new byte[1024];
+ int read;
+ while ((read = is.read(buffer)) > 0) {
+ digest.update(buffer, 0, read);
+ }
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ byte[] md5Bytes = digest.digest();
+
+ StringBuilder md5String = new StringBuilder();
+ for (byte b : md5Bytes) {
+ md5String.append(String.format("%02x", b));
+ }
+ return md5String.toString();
+
+ } catch (NoSuchAlgorithmException e) {
+ throw new RuntimeException(e);
+ }
+ }
+}
diff --git a/src/main/java/com/muyu/aliyun/bailian/ReviewResolution.java b/src/main/java/com/muyu/aliyun/bailian/ReviewResolution.java
new file mode 100644
index 0000000..7dca6c9
--- /dev/null
+++ b/src/main/java/com/muyu/aliyun/bailian/ReviewResolution.java
@@ -0,0 +1,58 @@
+package com.muyu.aliyun.bailian;
+
+import com.aliyun.bailian20231229.Client;
+import com.aliyun.bailian20231229.models.*;
+import com.aliyun.tea.*;
+import com.aliyun.teautil.models.RuntimeOptions;
+import com.muyu.aliyun.bailian.data.UploadDescribeFileMode;
+import com.muyu.aliyun.bailian.data.fixed.DescribeFileResponseBodyDataMode;
+import lombok.extern.log4j.Log4j2;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.HashMap;
+import java.util.Map;
+@Component
+@Log4j2
+public class ReviewResolution {
+
+ @Autowired
+ private Client client;
+
+ public DescribeFileResponseBodyDataMode DescribeFile(UploadDescribeFileMode uploadDescribeFileMode) {
+ RuntimeOptions runtime = new RuntimeOptions();
+ Map headers = new HashMap<>();
+ try {
+ // 复制代码运行请自行打印 API 的返回值
+ DescribeFileResponse describeFileResponse = client.describeFileWithOptions(uploadDescribeFileMode.getWorkspaceId(), uploadDescribeFileMode.getFileId(), headers, runtime);
+ if (describeFileResponse.getStatusCode() == 200) {
+ log.info("文件信息获取成功");
+ } else {
+ log.info("文件信息获取失败");
+ throw new RuntimeException(describeFileResponse.toString());
+ }
+
+ DescribeFileResponseBody body = describeFileResponse.getBody();
+ DescribeFileResponseBody.DescribeFileResponseBodyData data = body.getData();
+ log.info("data:{}", data);
+ return DescribeFileResponseBodyDataMode.builder()
+ .categoryId(data.getCategoryId())
+ .createTime(data.getCreateTime())
+ .fileId(data.getFileId())
+ .fileName(data.getFileName())
+ .fileType(data.getFileType())
+ .parser(data.getParser())
+ .sizeInBytes(data.getSizeInBytes())
+ .status(data.getStatus())
+ .tags(data.getTags())
+ .build();
+
+ } catch (TeaException error) {
+ log.error("异常:「」", error);
+ } catch (Exception _error) {
+ log.error("异常:「」", _error);
+ }
+ return null;
+ }
+}
+
diff --git a/src/main/java/com/muyu/aliyun/bailian/TemporaryStorage.java b/src/main/java/com/muyu/aliyun/bailian/TemporaryStorage.java
new file mode 100644
index 0000000..d1f1f14
--- /dev/null
+++ b/src/main/java/com/muyu/aliyun/bailian/TemporaryStorage.java
@@ -0,0 +1,124 @@
+package com.muyu.aliyun.bailian;
+
+import com.muyu.aliyun.bailian.data.UploadFileModel;
+import lombok.extern.log4j.Log4j2;
+import org.springframework.stereotype.Component;
+
+import java.io.BufferedInputStream;
+import java.io.DataOutputStream;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+@Component
+@Log4j2
+public class TemporaryStorage {
+
+ public static void uploadFile(UploadFileModel uploadFileModel) {
+ HttpURLConnection connection = null;
+ try {
+ // 创建URL对象
+ URL url = new URL(uploadFileModel.getPreSignedUrl());
+ connection = (HttpURLConnection) url.openConnection();
+
+ // 设置请求方法用于文档上传,需与您在上一步中调用ApplyFileUploadLease接口实际返回的Data.Param中Method字段的值一致
+ connection.setRequestMethod(uploadFileModel.getMethod());
+
+ // 允许向connection输出,因为这个连接是用于上传文档的
+ connection.setDoOutput(true);
+
+ connection.setRequestProperty("X-bailian-extra", uploadFileModel.getBailianExtra());
+ connection.setRequestProperty("Content-Type", uploadFileModel.getContentType());
+
+ // 读取文档并通过连接上传
+ try (DataOutputStream outStream = new DataOutputStream(connection.getOutputStream());
+ FileInputStream fileInputStream = new FileInputStream(uploadFileModel.getFilePath())) {
+ byte[] buffer = new byte[4096];
+ int bytesRead;
+
+ while ((bytesRead = fileInputStream.read(buffer)) != -1) {
+ outStream.write(buffer, 0, bytesRead);
+ }
+
+ outStream.flush();
+ }
+
+ // 检查响应
+ int responseCode = connection.getResponseCode();
+ if (responseCode == HttpURLConnection.HTTP_OK) {
+ // 文档上传成功处理
+ log.info("File uploaded successfully");
+ } else {
+ // 文档上传失败处理
+ log.error("Failed to upload the file. ResponseCode: " + responseCode);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ if (connection != null) {
+ connection.disconnect();
+ }
+ }
+ }
+
+ public static void uploadFileLink(UploadFileModel uploadFileModel) {
+ HttpURLConnection connection = null;
+ try {
+ // 创建URL对象
+ URL url = new URL(uploadFileModel.getPreSignedUrl());
+ connection = (HttpURLConnection) url.openConnection();
+
+ // 设置请求方法用于文档上传,需与您在上一步中调用ApplyFileUploadLease接口实际返回的Data.Param中Method字段的值一致
+ connection.setRequestMethod(uploadFileModel.getMethod());
+
+ // 允许向connection输出,因为这个连接是用于上传文档的
+ connection.setDoOutput(true);
+
+ connection.setRequestProperty("X-bailian-extra", uploadFileModel.getBailianExtra());
+ connection.setRequestProperty("Content-Type", uploadFileModel.getContentType());
+
+ URL sourceUrl = new URL(uploadFileModel.getSourceUrlString());
+ HttpURLConnection sourceConnection = (HttpURLConnection) sourceUrl.openConnection();
+
+ // 设置访问OSS的请求方法为GET
+ sourceConnection.setRequestMethod("GET");
+ // 获取响应码,200表示请求成功
+ int sourceFileResponseCode = sourceConnection.getResponseCode();
+ if (sourceFileResponseCode != 200){
+ throw new RuntimeException();
+ }
+ // 从OSS读取文档并通过连接上传
+ if (sourceFileResponseCode != HttpURLConnection.HTTP_OK){
+ throw new RuntimeException("Failed to get source file.");
+ }
+ try (DataOutputStream outStream = new DataOutputStream(connection.getOutputStream());
+ InputStream in = new BufferedInputStream(sourceConnection.getInputStream())) {
+ byte[] buffer = new byte[4096];
+ int bytesRead;
+
+ while ((bytesRead = in.read(buffer)) != -1) {
+ outStream.write(buffer, 0, bytesRead);
+ }
+
+ outStream.flush();
+ }
+
+ // 检查响应
+ int responseCode = connection.getResponseCode();
+ if (responseCode == HttpURLConnection.HTTP_OK) {
+ // 文档上传成功
+ System.out.println("File uploaded successfully.");
+ } else {
+ // 文档上传失败
+ System.out.println("Failed to upload the file. ResponseCode: " + responseCode);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ if (connection != null) {
+ connection.disconnect();
+ }
+ }
+ }
+
+}
diff --git a/src/main/java/com/muyu/aliyun/bailian/config/AlibabaCloudClientConfig.java b/src/main/java/com/muyu/aliyun/bailian/config/AlibabaCloudClientConfig.java
new file mode 100644
index 0000000..0467ea2
--- /dev/null
+++ b/src/main/java/com/muyu/aliyun/bailian/config/AlibabaCloudClientConfig.java
@@ -0,0 +1,30 @@
+package com.muyu.aliyun.bailian.config;
+import com.aliyun.bailian20231229.Client;
+import com.aliyun.teaopenapi.models.Config;
+import com.muyu.aliyun.config.OssConfig;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+
+@Configuration
+public class AlibabaCloudClientConfig {
+
+ @Autowired
+ private OssConfig ossConfig;
+
+ /**
+ * 创建 Client Bean
+ * @return Client 对象
+ * @throws Exception 创建过程中可能抛出的异常
+ */
+ @Bean
+ public Client createClient() throws Exception {
+ Config config = new Config()
+ .setAccessKeyId(ossConfig.getAccessKeyId())
+ .setAccessKeySecret(ossConfig.getAccessKeySecret());
+
+ config.endpoint = ossConfig.getEndpoint();
+ return new Client(config);
+ }
+}
diff --git a/src/main/java/com/muyu/aliyun/bailian/data/FileUploadLeaseMode.java b/src/main/java/com/muyu/aliyun/bailian/data/FileUploadLeaseMode.java
new file mode 100644
index 0000000..460dc13
--- /dev/null
+++ b/src/main/java/com/muyu/aliyun/bailian/data/FileUploadLeaseMode.java
@@ -0,0 +1,43 @@
+package com.muyu.aliyun.bailian.data;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class FileUploadLeaseMode {
+
+ /**
+ * CategoryId字段用于存储文件的类别ID
+ * 这个ID有助于对文件进行分类管理
+ */
+ private String CategoryId;
+
+ /**
+ * FileName字段用于存储文件的名称
+ * 它帮助用户识别和搜索特定的文件
+ */
+ private String FileName;
+
+ /**
+ * Md5字段用于存储文件的MD5哈希值
+ * 这个值用于验证文件的完整性,确保文件未被篡改
+ */
+ private String Md5;
+
+ /**
+ * SizeInBytes字段用于存储文件的大小,以字节为单位
+ * 这个信息有助于用户了解文件的存储空间占用情况
+ */
+ private String SizeInBytes;
+
+ /**
+ * WorkspaceId字段用于存储文件所属的工作空间ID
+ * 这个ID用于确定文件属于哪个工作空间,有助于进行权限管理和访问控制
+ */
+ private String WorkspaceId;
+}
diff --git a/src/main/java/com/muyu/aliyun/bailian/data/UploadDataManagementMode.java b/src/main/java/com/muyu/aliyun/bailian/data/UploadDataManagementMode.java
new file mode 100644
index 0000000..7b066d5
--- /dev/null
+++ b/src/main/java/com/muyu/aliyun/bailian/data/UploadDataManagementMode.java
@@ -0,0 +1,27 @@
+package com.muyu.aliyun.bailian.data;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class UploadDataManagementMode {
+
+ /**
+ * 工作空间的唯一标识符
+ *
+ * 用于在系统中唯一标识一个工作空间,便于在不同模块和功能中引用和操作特定的工作空间
+ */
+ private String WorkspaceId;
+ /**
+ * 租约的标识符
+ *
+ * 用于在系统中唯一标识一个租约,便于在不同模块和功能中引用和操作特定的租约
+ */
+ private String LeaseId;
+
+}
diff --git a/src/main/java/com/muyu/aliyun/bailian/data/UploadDescribeFileMode.java b/src/main/java/com/muyu/aliyun/bailian/data/UploadDescribeFileMode.java
new file mode 100644
index 0000000..20b35f3
--- /dev/null
+++ b/src/main/java/com/muyu/aliyun/bailian/data/UploadDescribeFileMode.java
@@ -0,0 +1,26 @@
+package com.muyu.aliyun.bailian.data;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class UploadDescribeFileMode {
+
+ /**
+ * 工作空间标识符
+ * 用于唯一标识一个工作空间,在处理与工作空间相关的操作时使用
+ */
+ private String WorkspaceId;
+
+ /**
+ * 文件标识符
+ * 用于唯一标识一个文件,在处理与文件相关的操作时使用
+ */
+ private String FileId;
+
+}
diff --git a/src/main/java/com/muyu/aliyun/bailian/data/UploadFileModel.java b/src/main/java/com/muyu/aliyun/bailian/data/UploadFileModel.java
new file mode 100644
index 0000000..b872c0d
--- /dev/null
+++ b/src/main/java/com/muyu/aliyun/bailian/data/UploadFileModel.java
@@ -0,0 +1,43 @@
+package com.muyu.aliyun.bailian.data;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class UploadFileModel {
+
+ /**
+ * 用于存储预签名的URL,该URL用于访问存储服务中的对象
+ */
+ private String preSignedUrl;
+
+ /**
+ * 用于存储文件在本地的路径
+ */
+ private String filePath;
+
+ /**
+ * 用于存储HTTP请求的方法,例如GET、POST等
+ */
+ private String method;
+
+ /**
+ * 用于存储百链额外信息,可能包括与百链系统相关的特定参数或元数据
+ */
+ private String bailianExtra;
+
+ /**
+ * 用于存储文件的内容类型,例如text/plain、image/jpeg等
+ */
+ private String contentType;
+
+ /**
+ * 用于存储源URL字符串,即文件原始位置的URL
+ */
+ private String sourceUrlString;
+}
diff --git a/src/main/java/com/muyu/aliyun/bailian/data/UploadPathMode.java b/src/main/java/com/muyu/aliyun/bailian/data/UploadPathMode.java
new file mode 100644
index 0000000..f5688db
--- /dev/null
+++ b/src/main/java/com/muyu/aliyun/bailian/data/UploadPathMode.java
@@ -0,0 +1,20 @@
+package com.muyu.aliyun.bailian.data;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class UploadPathMode {
+
+ // 用于存储预签名URL或HTTP URL,以便进行后续的文件上传或下载操作
+ private String preSignedUrlOrHttpUrl;
+ // 本地文件路径,用于指定需要上传的文件位置或下载的文件保存位置
+ private String filePath;
+ // 服务器提供的URL,用于构建预签名URL或作为HTTP请求的地址
+ private String Url;
+}
diff --git a/src/main/java/com/muyu/aliyun/bailian/data/fixed/AddFileResponseBodyDataMode.java b/src/main/java/com/muyu/aliyun/bailian/data/fixed/AddFileResponseBodyDataMode.java
new file mode 100644
index 0000000..73c28ca
--- /dev/null
+++ b/src/main/java/com/muyu/aliyun/bailian/data/fixed/AddFileResponseBodyDataMode.java
@@ -0,0 +1,25 @@
+package com.muyu.aliyun.bailian.data.fixed;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class AddFileResponseBodyDataMode {
+ /**
+ * 文件ID,用于唯一标识一个文件
+ */
+ public String fileId;
+
+ /**
+ * 解析器标识,用于指示哪个解析器将用于处理文件
+ */
+ public String parser;
+
+
+
+}
diff --git a/src/main/java/com/muyu/aliyun/bailian/data/fixed/DescribeFileResponseBodyDataMode.java b/src/main/java/com/muyu/aliyun/bailian/data/fixed/DescribeFileResponseBodyDataMode.java
new file mode 100644
index 0000000..8f3b8f2
--- /dev/null
+++ b/src/main/java/com/muyu/aliyun/bailian/data/fixed/DescribeFileResponseBodyDataMode.java
@@ -0,0 +1,62 @@
+package com.muyu.aliyun.bailian.data.fixed;
+
+import com.aliyun.tea.NameInMap;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class DescribeFileResponseBodyDataMode {
+
+ /**
+ * 文件类别ID,用于标识文件的类别
+ */
+ public String categoryId;
+
+ /**
+ * 创建时间,记录文件何时被创建
+ */
+ public String createTime;
+
+ /**
+ * 文件ID,唯一标识一个文件
+ */
+ public String fileId;
+
+ /**
+ * 文件名,存储文件的名称
+ */
+ public String fileName;
+
+ /**
+ * 文件类型,描述文件的格式或种类
+ */
+ public String fileType;
+
+ /**
+ * 解析器类型,标识用于解析文件的工具或方法
+ */
+ public String parser;
+
+ /**
+ * 文件大小,以字节为单位
+ */
+ public Long sizeInBytes;
+
+ /**
+ * 文件状态,描述文件的当前状态(如已上传、处理中等)
+ */
+ public String status;
+
+ /**
+ * 标签列表,用于标识文件的关键字或类别
+ */
+ public List tags;
+
+
+}
diff --git a/src/main/java/com/muyu/aliyun/bailian/data/fixed/UploadLeaseParamsMode.java b/src/main/java/com/muyu/aliyun/bailian/data/fixed/UploadLeaseParamsMode.java
new file mode 100644
index 0000000..a4fb340
--- /dev/null
+++ b/src/main/java/com/muyu/aliyun/bailian/data/fixed/UploadLeaseParamsMode.java
@@ -0,0 +1,31 @@
+package com.muyu.aliyun.bailian.data.fixed;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class UploadLeaseParamsMode {
+
+ /**
+ * 请求头信息
+ * 存储HTTP请求的头部信息,如内容类型、认证信息等
+ */
+ private String Headers;
+
+ /**
+ * 请求方法
+ * 存储HTTP请求所使用的 方法,如GET、POST等
+ */
+ private String Method;
+
+ /**
+ * 请求URL
+ * 存储HTTP请求的目标URL,即请求的地址
+ */
+ private String Url;
+}
diff --git a/src/main/java/com/muyu/aliyun/config/OssConfig.java b/src/main/java/com/muyu/aliyun/config/OssConfig.java
new file mode 100644
index 0000000..b5e6377
--- /dev/null
+++ b/src/main/java/com/muyu/aliyun/config/OssConfig.java
@@ -0,0 +1,36 @@
+package com.muyu.aliyun.config;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@Configuration
+@ConfigurationProperties(prefix = "oss")
+public class OssConfig {
+ /**
+ * OSS服务的终端节点,用于指定OSS服务的接入地址
+ */
+ private String endpoint;
+
+ /**
+ * 阿里云访问密钥ID,用于身份验证
+ */
+ private String accessKeyId;
+
+ /**
+ * 阿里云访问密钥,与accessKeyId一起用于身份验证
+ */
+ private String accessKeySecret;
+
+ /**
+ * OSS服务中的存储空间名称
+ */
+ private String bucketName;
+}
diff --git a/src/main/java/com/muyu/aliyun/controller/KnowledgeBaseUploadController.java b/src/main/java/com/muyu/aliyun/controller/KnowledgeBaseUploadController.java
new file mode 100644
index 0000000..213ce94
--- /dev/null
+++ b/src/main/java/com/muyu/aliyun/controller/KnowledgeBaseUploadController.java
@@ -0,0 +1,21 @@
+package com.muyu.aliyun.controller;
+
+import com.muyu.aliyun.service.KnowledgeBaseUploadService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+@RestController
+@RequestMapping("/ai/industry/report")
+public class KnowledgeBaseUploadController {
+
+ @Autowired
+ private KnowledgeBaseUploadService knowledgeBaseUploadService;
+
+ @PostMapping("/KnowledgeBaseUpload")
+ public void uploadFile(@RequestParam("file") MultipartFile file) {
+ String workspaceId = "llm-98lxu358qfvxdxvt";
+ String categoryId = "cate_997567e8a7e94f4caab94e78c580adb4_10062067";
+ knowledgeBaseUploadService.uploadDocument(file, workspaceId, categoryId);
+ }
+}
diff --git a/src/main/java/com/muyu/aliyun/service/KnowledgeBaseUploadService.java b/src/main/java/com/muyu/aliyun/service/KnowledgeBaseUploadService.java
new file mode 100644
index 0000000..876129c
--- /dev/null
+++ b/src/main/java/com/muyu/aliyun/service/KnowledgeBaseUploadService.java
@@ -0,0 +1,8 @@
+package com.muyu.aliyun.service;
+
+import org.springframework.web.multipart.MultipartFile;
+
+public interface KnowledgeBaseUploadService {
+ void uploadDocument(MultipartFile file, String workspaceId, String categoryId);
+
+}
diff --git a/src/main/java/com/muyu/aliyun/service/impl/KnowledgeBaseUploadServiceImpl.java b/src/main/java/com/muyu/aliyun/service/impl/KnowledgeBaseUploadServiceImpl.java
new file mode 100644
index 0000000..731622e
--- /dev/null
+++ b/src/main/java/com/muyu/aliyun/service/impl/KnowledgeBaseUploadServiceImpl.java
@@ -0,0 +1,121 @@
+package com.muyu.aliyun.service.impl;
+
+import com.aliyun.oss.OSS;
+import com.aliyun.oss.OSSClientBuilder;
+import com.muyu.aliyun.bailian.AddDataManagement;
+import com.muyu.aliyun.bailian.ApplyLease;
+import com.muyu.aliyun.bailian.ReviewResolution;
+import com.muyu.aliyun.bailian.TemporaryStorage;
+import com.muyu.aliyun.bailian.data.FileUploadLeaseMode;
+import com.muyu.aliyun.bailian.data.UploadDataManagementMode;
+import com.muyu.aliyun.bailian.data.UploadDescribeFileMode;
+import com.muyu.aliyun.bailian.data.UploadFileModel;
+import com.muyu.aliyun.bailian.data.fixed.AddFileResponseBodyDataMode;
+import com.muyu.aliyun.bailian.data.fixed.DescribeFileResponseBodyDataMode;
+import com.muyu.aliyun.bailian.data.fixed.UploadLeaseParamsMode;
+import com.muyu.aliyun.config.OssConfig;
+import com.muyu.aliyun.service.KnowledgeBaseUploadService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.UUID;
+
+import static com.muyu.aliyun.bailian.Md5Utils.getFileMd5;
+
+
+@Service
+public class KnowledgeBaseUploadServiceImpl implements KnowledgeBaseUploadService {
+
+ @Autowired
+ private ApplyLease applyLease;
+
+ @Autowired
+ private TemporaryStorage temporaryStorage;
+
+
+ @Autowired
+ private AddDataManagement addDataManagement;
+
+ @Autowired
+ private ReviewResolution reviewResolution;
+
+ @Override
+ public void uploadDocument(MultipartFile file, String workspaceId, String categoryId) {
+ try {
+ // 1. 保存临时文件
+ File tempFile = convertMultipartFileToFile(file);
+ // 获取文件大小
+ long sizeInBytes = tempFile.length();
+
+ // 2. 计算文件 MD5
+ String md5 = getFileMd5(tempFile.getAbsolutePath());
+
+ // 3. 申请文档上传租约
+ FileUploadLeaseMode fileUploadLeaseModel = new FileUploadLeaseMode();
+ fileUploadLeaseModel.setWorkspaceId(workspaceId);
+ fileUploadLeaseModel.setCategoryId(categoryId);
+ fileUploadLeaseModel.setFileName(file.getOriginalFilename());
+ fileUploadLeaseModel.setMd5(md5);
+ fileUploadLeaseModel.setSizeInBytes(String.valueOf(sizeInBytes));
+
+ UploadLeaseParamsMode leaseParams = applyLease.applyFileUploadLease(fileUploadLeaseModel);
+ if (leaseParams == null) {
+ throw new RuntimeException("申请文档上传租约失败");
+ }
+
+
+ // 4. 上传文档至百炼的临时存储
+ UploadFileModel uploadFileModel = new UploadFileModel();
+ uploadFileModel.setPreSignedUrl(leaseParams.getUrl());
+ uploadFileModel.setMethod(leaseParams.getMethod());
+ // 这里需要根据实际情况设置 X-bailian-extra 和 Content-Type
+ uploadFileModel.setBailianExtra("");
+ uploadFileModel.setContentType("");
+ uploadFileModel.setFilePath(tempFile.getAbsolutePath());
+ temporaryStorage.uploadFile(uploadFileModel);
+
+ // 5. 将文档添加至百炼的数据管理
+ UploadDataManagementMode uploadDataManagementMode = new UploadDataManagementMode();
+ uploadDataManagementMode.setWorkspaceId(workspaceId);
+ // 这里需要设置 LeaseId,假设 LeaseId 在 UploadLeaseParamsMode 中有对应的 getter
+ uploadDataManagementMode.setLeaseId("");
+ AddFileResponseBodyDataMode addFileResult = addDataManagement.addFile(uploadDataManagementMode);
+ if (addFileResult == null) {
+ throw new RuntimeException("将文档添加至百炼的数据管理失败");
+ }
+
+ // 6. 查看文档解析状态
+ UploadDescribeFileMode uploadDescribeFileMode = new UploadDescribeFileMode();
+ uploadDescribeFileMode.setWorkspaceId(workspaceId);
+ uploadDescribeFileMode.setFileId(addFileResult.getFileId());
+ DescribeFileResponseBodyDataMode describeFileResult = reviewResolution.DescribeFile(uploadDescribeFileMode);
+ if (describeFileResult == null) {
+ throw new RuntimeException("查看文档解析状态失败");
+ }
+
+ // 清理临时文件
+ tempFile.delete();
+
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ private File convertMultipartFileToFile(MultipartFile file) throws IOException {
+ Path tempFilePath = Files.createTempFile(null, null);
+ File tempFile = tempFilePath.toFile();
+ file.transferTo(tempFile);
+ return tempFile;
+ }
+
+
+}
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
new file mode 100644
index 0000000..6efc416
--- /dev/null
+++ b/src/main/resources/application.yml
@@ -0,0 +1,7 @@
+oss:
+ internal:
+ endpoint: https://oss-cn-hangzhou-internal.aliyuncs.com
+ endpoint: https://oss-cn-hangzhou.aliyuncs.com
+ accessKeyId: LTAI5tLvo45NpqjoH11G1beU
+ accessKeySecret: NjfA4hBwban4W8Db7RBwDJd0pBHJeM
+ bucketName: idicc-pangu-prod
\ No newline at end of file