| @@ -9,6 +9,7 @@ import com.ruoyi.platform.mapper.DatasetDao; | |||||
| import com.ruoyi.platform.mapper.DatasetVersionDao; | import com.ruoyi.platform.mapper.DatasetVersionDao; | ||||
| import com.ruoyi.platform.service.DatasetService; | import com.ruoyi.platform.service.DatasetService; | ||||
| import com.ruoyi.platform.service.DatasetVersionService; | import com.ruoyi.platform.service.DatasetVersionService; | ||||
| import com.ruoyi.platform.service.MinioService; | |||||
| import com.ruoyi.platform.utils.BeansUtils; | import com.ruoyi.platform.utils.BeansUtils; | ||||
| import com.ruoyi.platform.utils.FileUtil; | import com.ruoyi.platform.utils.FileUtil; | ||||
| import com.ruoyi.platform.utils.MinioUtil; | import com.ruoyi.platform.utils.MinioUtil; | ||||
| @@ -56,6 +57,9 @@ public class DatasetServiceImpl implements DatasetService { | |||||
| @Resource | @Resource | ||||
| private DatasetVersionService datasetVersionService; | private DatasetVersionService datasetVersionService; | ||||
| @Resource | |||||
| private MinioService minioService; | |||||
| // 固定存储桶名 | // 固定存储桶名 | ||||
| private final String bucketName = "platform-data"; | private final String bucketName = "platform-data"; | ||||
| @@ -209,39 +213,16 @@ public class DatasetServiceImpl implements DatasetService { | |||||
| */ | */ | ||||
| @Override | @Override | ||||
| public List<Map<String, String>> uploadDataset(MultipartFile[] files, String uuid) throws Exception { | public List<Map<String, String>> uploadDataset(MultipartFile[] files, String uuid) throws Exception { | ||||
| List<Map<String, String>> results = new ArrayList<>(); | |||||
| // //时间戳统一定在外面,一次上传就定好 | |||||
| // Date createTime = new Date(); | |||||
| // String timestamp = new SimpleDateFormat("yyyyMMdd-HHmmss").format(createTime); | |||||
| List<Map<String, String>> results = new ArrayList<>(); | |||||
| for (MultipartFile file:files){ | for (MultipartFile file:files){ | ||||
| if (file.isEmpty()) { | |||||
| throw new Exception("文件为空,无法上传"); | |||||
| } | |||||
| // 获取文件大小并转换为可读形式 | |||||
| long sizeInBytes = file.getSize(); | |||||
| String formattedSize = FileUtil.formatFileSize(sizeInBytes); // 格式化文件大小 | |||||
| // 其余操作基于 modelsVersionToUse | |||||
| // 构建objectName | |||||
| String username = SecurityUtils.getLoginUser().getUsername(); | String username = SecurityUtils.getLoginUser().getUsername(); | ||||
| String fileName = file.getOriginalFilename(); | String fileName = file.getOriginalFilename(); | ||||
| String objectName = "datasets/" + username + "/" + uuid + "/" + fileName; | String objectName = "datasets/" + username + "/" + uuid + "/" + fileName; | ||||
| // 上传文件到MinIO并将记录新增到数据库中 | |||||
| try (InputStream inputStream = file.getInputStream()) { | |||||
| minioUtil.uploadObject(bucketName, objectName, inputStream); | |||||
| Map<String, String> fileResult = new HashMap<>(); | |||||
| fileResult.put("fileName", file.getOriginalFilename()); | |||||
| fileResult.put("url", objectName); // objectName根据实际情况定义 | |||||
| fileResult.put("fileSize", formattedSize); | |||||
| results.add(fileResult); | |||||
| } catch (Exception e) { | |||||
| throw new Exception("上传数据集失败: " + e.getMessage(), e); | |||||
| } | |||||
| results.add(minioService.uploadFile(bucketName, objectName, file)); | |||||
| } | } | ||||
| return results; | return results; | ||||
| } | } | ||||
| @@ -308,6 +289,7 @@ public class DatasetServiceImpl implements DatasetService { | |||||
| List<VersionVo> datasetVersionVos = datasetVo.getDatasetVersionVos(); | List<VersionVo> datasetVersionVos = datasetVo.getDatasetVersionVos(); | ||||
| if (datasetVersionVos==null || datasetVersionVos.isEmpty()){ | if (datasetVersionVos==null || datasetVersionVos.isEmpty()){ | ||||
| throw new Exception("数据集版本信息错误"); | throw new Exception("数据集版本信息错误"); | ||||
| } | } | ||||
| Dataset dataset = new Dataset(); | Dataset dataset = new Dataset(); | ||||
| @@ -50,7 +50,7 @@ public class MinioServiceImpl implements MinioService { | |||||
| } | } | ||||
| @Override | @Override | ||||
| public Map<String, String> uploadFile(String bucketName, String objectName,MultipartFile file ) throws Exception { | |||||
| public Map<String, String> uploadFile(String bucketName, String objectName, MultipartFile file ) throws Exception { | |||||
| if (file.isEmpty()) { | if (file.isEmpty()) { | ||||
| throw new Exception("文件为空,无法上传"); | throw new Exception("文件为空,无法上传"); | ||||
| } | } | ||||
| @@ -65,7 +65,7 @@ public class MinioServiceImpl implements MinioService { | |||||
| result.put("url", objectName); // objectName根据实际情况定义 | result.put("url", objectName); // objectName根据实际情况定义 | ||||
| result.put("fileSize", formattedSize); | result.put("fileSize", formattedSize); | ||||
| } catch (Exception e) { | } catch (Exception e) { | ||||
| throw new Exception("上传数据集失败: " + e.getMessage(), e); | |||||
| throw new Exception("上传文件失败: " + e.getMessage(), e); | |||||
| } | } | ||||
| return result; | return result; | ||||
| } | } | ||||
| @@ -5,6 +5,7 @@ import com.ruoyi.platform.domain.Models; | |||||
| import com.ruoyi.platform.domain.ModelsVersion; | import com.ruoyi.platform.domain.ModelsVersion; | ||||
| import com.ruoyi.platform.mapper.ModelsDao; | import com.ruoyi.platform.mapper.ModelsDao; | ||||
| import com.ruoyi.platform.mapper.ModelsVersionDao; | import com.ruoyi.platform.mapper.ModelsVersionDao; | ||||
| import com.ruoyi.platform.service.MinioService; | |||||
| import com.ruoyi.platform.service.ModelsService; | import com.ruoyi.platform.service.ModelsService; | ||||
| import com.ruoyi.platform.service.ModelsVersionService; | import com.ruoyi.platform.service.ModelsVersionService; | ||||
| import com.ruoyi.platform.utils.BeansUtils; | import com.ruoyi.platform.utils.BeansUtils; | ||||
| @@ -52,6 +53,9 @@ public class ModelsServiceImpl implements ModelsService { | |||||
| @Resource | @Resource | ||||
| private ModelsVersionService modelsVersionService; | private ModelsVersionService modelsVersionService; | ||||
| @Resource | |||||
| private MinioService minioService; | |||||
| // 固定存储桶名 | // 固定存储桶名 | ||||
| private final String bucketName = "platform-data"; | private final String bucketName = "platform-data"; | ||||
| @@ -194,50 +198,23 @@ public class ModelsServiceImpl implements ModelsService { | |||||
| } | } | ||||
| /** | /** | ||||
| * 上传模型 | |||||
| * 上传模型文件 | |||||
| * | * | ||||
| * @param files 文件 | * @param files 文件 | ||||
| * @param uuid | |||||
| * @param uuid 唯一标识 | |||||
| * @return 是否成功 | * @return 是否成功 | ||||
| */ | */ | ||||
| @Override | @Override | ||||
| public List<Map<String, String>> uploadModels(MultipartFile[] files, String uuid) throws Exception { | public List<Map<String, String>> uploadModels(MultipartFile[] files, String uuid) throws Exception { | ||||
| List<Map<String, String>> results = new ArrayList<>(); | List<Map<String, String>> results = new ArrayList<>(); | ||||
| // //时间戳统一定在外面,一次上传就定好 | |||||
| // Date createTime = new Date(); | |||||
| // String timestamp = new SimpleDateFormat("yyyyMMdd-HHmmss").format(createTime); | |||||
| for (MultipartFile file:files){ | |||||
| if (file.isEmpty()) { | |||||
| throw new Exception("文件为空,无法上传"); | |||||
| } | |||||
| // 获取文件大小并转换为KB | |||||
| long sizeInBytes = file.getSize(); | |||||
| String formattedSize = FileUtil.formatFileSize(sizeInBytes); // 格式化文件大小 | |||||
| // 其余操作基于 modelsVersionToUse | |||||
| for (MultipartFile file:files) { | |||||
| // 构建objectName | |||||
| String username = SecurityUtils.getLoginUser().getUsername(); | String username = SecurityUtils.getLoginUser().getUsername(); | ||||
| String fileName = file.getOriginalFilename(); | String fileName = file.getOriginalFilename(); | ||||
| String objectName = "models/" + username + "/" + uuid + "/" + fileName; | String objectName = "models/" + username + "/" + uuid + "/" + fileName; | ||||
| // 上传文件到MinIO并将记录新增到数据库中 | |||||
| try (InputStream inputStream = file.getInputStream()) { | |||||
| minioUtil.uploadObject(bucketName, objectName, inputStream); | |||||
| // | |||||
| Map<String, String> fileResult = new HashMap<>(); | |||||
| fileResult.put("fileName", file.getOriginalFilename()); | |||||
| fileResult.put("url", objectName); // objectName根据实际情况定义 | |||||
| fileResult.put("fileSize", formattedSize); | |||||
| results.add(fileResult); | |||||
| } catch (Exception e) { | |||||
| throw new Exception("上传模型失败: " + e.getMessage(), e); | |||||
| } | |||||
| results.add(minioService.uploadFile(bucketName, objectName, file)); | |||||
| } | } | ||||
| return results; | return results; | ||||
| } | } | ||||
| @@ -8,6 +8,7 @@ import lombok.extern.slf4j.Slf4j; | |||||
| import org.springframework.beans.factory.annotation.Autowired; | import org.springframework.beans.factory.annotation.Autowired; | ||||
| import org.springframework.beans.factory.annotation.Value; | import org.springframework.beans.factory.annotation.Value; | ||||
| import org.springframework.stereotype.Component; | import org.springframework.stereotype.Component; | ||||
| import org.springframework.web.multipart.MultipartFile; | |||||
| import java.io.*; | import java.io.*; | ||||
| import java.nio.charset.StandardCharsets; | import java.nio.charset.StandardCharsets; | ||||
| @@ -23,7 +24,7 @@ import java.util.zip.ZipOutputStream; | |||||
| @Component | @Component | ||||
| public class MinioUtil { | public class MinioUtil { | ||||
| private MinioClient minioClient; | |||||
| private static MinioClient minioClient; | |||||
| @Autowired | @Autowired | ||||
| public MinioUtil(@Value("${minio.endpoint}")String minioEndpoint,@Value("${minio.accessKey}")String minioAccessKey,@Value("${minio.secretKey}") String minioSecretKey) { | public MinioUtil(@Value("${minio.endpoint}")String minioEndpoint,@Value("${minio.accessKey}")String minioAccessKey,@Value("${minio.secretKey}") String minioSecretKey) { | ||||
| @@ -43,6 +44,84 @@ public class MinioUtil { | |||||
| minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucketName).build()); | minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucketName).build()); | ||||
| } | } | ||||
| /** | |||||
| * 验证bucketName是否存在 | |||||
| * | |||||
| * @return boolean true:存在 | |||||
| */ | |||||
| public boolean bucketExists(String bucketName) | |||||
| throws Exception { | |||||
| return minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build()); | |||||
| } | |||||
| /** | |||||
| * 判断文件是否存在 | |||||
| * | |||||
| * @param bucketName 存储桶 | |||||
| * @param objectName 对象 | |||||
| * @return true:存在 | |||||
| */ | |||||
| public static boolean doesObjectExist(String bucketName, String objectName) { | |||||
| boolean exist = true; | |||||
| try { | |||||
| minioClient.statObject(StatObjectArgs.builder().bucket(bucketName).object(objectName).build()); | |||||
| } catch (Exception e) { | |||||
| exist = false; | |||||
| } | |||||
| return exist; | |||||
| } | |||||
| /** | |||||
| * 判断文件夹是否存在 | |||||
| * | |||||
| * @param bucketName 存储桶 | |||||
| * @param objectName 文件夹名称(去掉/) | |||||
| * @return true:存在 | |||||
| */ | |||||
| public static boolean doesFolderExist(String bucketName, String objectName) { | |||||
| boolean exist = false; | |||||
| try { | |||||
| Iterable<Result<Item>> results = minioClient.listObjects( | |||||
| ListObjectsArgs.builder().bucket(bucketName).prefix(objectName).recursive(false).build()); | |||||
| for (Result<Item> result : results) { | |||||
| Item item = result.get(); | |||||
| if (item.isDir() && objectName.equals(item.objectName())) { | |||||
| exist = true; | |||||
| } | |||||
| } | |||||
| } catch (Exception e) { | |||||
| exist = false; | |||||
| } | |||||
| return exist; | |||||
| } | |||||
| /** | |||||
| * 根据文件前置查询文件 | |||||
| * | |||||
| * @param bucketName bucket名称 | |||||
| * @param prefix 前缀 | |||||
| * @param recursive 是否递归查询 | |||||
| * @return MinioItem 列表 | |||||
| */ | |||||
| public static List<Item> getAllObjectsByPrefix(String bucketName, String prefix, boolean recursive) throws Exception { | |||||
| List<Item> list = new ArrayList<>(); | |||||
| Iterable<Result<Item>> objectsIterator = minioClient.listObjects( | |||||
| ListObjectsArgs. | |||||
| builder(). | |||||
| bucket(bucketName). | |||||
| prefix(prefix). | |||||
| recursive(recursive). | |||||
| build()); | |||||
| if (objectsIterator != null) { | |||||
| for (Result<Item> o : objectsIterator) { | |||||
| Item item = o.get(); | |||||
| list.add(item); | |||||
| } | |||||
| } | |||||
| return list; | |||||
| } | |||||
| public void uploadObject(String bucketName, String objectName, InputStream stream) throws Exception { | public void uploadObject(String bucketName, String objectName, InputStream stream) throws Exception { | ||||
| long size = stream.available(); | long size = stream.available(); | ||||
| minioClient.putObject( | minioClient.putObject( | ||||
| @@ -54,6 +133,36 @@ public class MinioUtil { | |||||
| ); | ); | ||||
| } | } | ||||
| /** | |||||
| * 通过MultipartFile,上传文件 | |||||
| * | |||||
| * @param bucketName 存储桶 | |||||
| * @param file 文件 | |||||
| * @param objectName 对象名 | |||||
| * @param contentType 文件类型 | |||||
| */ | |||||
| public static ObjectWriteResponse putObject(String bucketName, MultipartFile file, String objectName, String contentType) throws Exception { | |||||
| InputStream inputStream = file.getInputStream(); | |||||
| return minioClient.putObject( | |||||
| PutObjectArgs.builder().bucket(bucketName).object(objectName).contentType(contentType) | |||||
| .stream(inputStream, inputStream.available(), -1).build()); | |||||
| } | |||||
| /** | |||||
| * 通过MultipartFile,上传文件 | |||||
| * | |||||
| * @param bucketName 存储桶 | |||||
| * @param file 文件 | |||||
| * @param objectName 对象名 | |||||
| */ | |||||
| public static ObjectWriteResponse putObject(String bucketName, MultipartFile file, String objectName) throws Exception { | |||||
| InputStream inputStream = file.getInputStream(); | |||||
| return minioClient.putObject( | |||||
| PutObjectArgs.builder().bucket(bucketName).object(objectName) | |||||
| .stream(inputStream, inputStream.available(), -1).build()); | |||||
| } | |||||
| public void downloadObject(String bucketName, String objectName, OutputStream stream) throws Exception { | public void downloadObject(String bucketName, String objectName, OutputStream stream) throws Exception { | ||||
| try (InputStream inStream = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(objectName).build())) { | try (InputStream inStream = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(objectName).build())) { | ||||
| byte[] buffer = new byte[1024]; | byte[] buffer = new byte[1024]; | ||||