diff --git a/dk-modules/sample/src/main/java/org/dromara/sample/storage/config/OssTianyiConfig.java b/dk-modules/sample/src/main/java/org/dromara/sample/storage/config/OssTianyiConfig.java new file mode 100644 index 0000000..3fcf366 --- /dev/null +++ b/dk-modules/sample/src/main/java/org/dromara/sample/storage/config/OssTianyiConfig.java @@ -0,0 +1,79 @@ +package org.dromara.sample.storage.config; + +import io.minio.MinioClient; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * Minio 配置信息 + * + * @author ruoyi + */ +@Configuration +@ConfigurationProperties(prefix = "osstianyi") +public class OssTianyiConfig +{ + + private String endPoint; + private String accessKey; + private String secretKey; + private String bucketName; + + public String getEndPoint() { + return endPoint; + } + + public void setEndPoint(String endPoint) { + this.endPoint = endPoint; + } + + public String getAccessKey() + { + return accessKey; + } + + public void setAccessKey(String accessKey) + { + this.accessKey = accessKey; + } + + public String getSecretKey() + { + return secretKey; + } + + public void setSecretKey(String secretKey) + { + this.secretKey = secretKey; + } + + public String getBucketName() + { + return bucketName; + } + + public void setBucketName(String bucketName) + { + this.bucketName = bucketName; + } + + @Override + public String toString() { + return "OssTianyiConfig{" + + "endPoint='" + endPoint + '\'' + + ", accessKey='" + accessKey + '\'' + + ", secretKey='" + secretKey + '\'' + + ", bucketName='" + bucketName + '\'' + + '}'; + } + + @Bean + public MinioClient getMinioClient() + { +// System.out.println("OssTianyiConfig"); +// System.out.println("OssTianyiConfig" + endPoint); + System.out.println(toString()); + return MinioClient.builder().endpoint(endPoint).credentials(accessKey, secretKey).build(); + } +} diff --git a/dk-modules/sample/src/main/java/org/dromara/sample/storage/controller/OssTianyiController.java b/dk-modules/sample/src/main/java/org/dromara/sample/storage/controller/OssTianyiController.java new file mode 100644 index 0000000..0f29fee --- /dev/null +++ b/dk-modules/sample/src/main/java/org/dromara/sample/storage/controller/OssTianyiController.java @@ -0,0 +1,58 @@ +package org.dromara.sample.storage.controller; + + +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.core.domain.R; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.web.core.BaseController; +import org.dromara.sample.storage.domain.SysUploadFile; +import org.dromara.sample.storage.util.OssTianyiClientUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.util.HashMap; + +/** + * 系统上传文件Controller + * + * @author tom + * @date 2024-12-21 + */ +@RestController +@RequestMapping("/ossTianyi") +public class OssTianyiController extends BaseController +{ + + @Autowired + private OssTianyiClientUtils ossTianyiClientUtils; + + /** + * 查询系统上传文件列表 (实际是上传接口) + */ + @SaCheckPermission("file:sysUploadFile:list") + @GetMapping("/list") + public TableDataInfo list(SysUploadFile sysUploadFile) + { + String localFilePath = "D:\\123pan\\page.html"; + try{ + ossTianyiClientUtils.uploadFileTest("page.html","dev/temp",localFilePath); + }catch (Exception e){ + e.printStackTrace(); + } + + return null; + } + + @GetMapping("/upload") + public R> upload(@RequestPart("file") MultipartFile file) { + try { + ossTianyiClientUtils.uploadFile("page.html", "dev/temp", file); + } catch (Exception e) { + e.printStackTrace(); + } + + return null; + } + +} diff --git a/dk-modules/sample/src/main/java/org/dromara/sample/storage/domain/SysUploadFile.java b/dk-modules/sample/src/main/java/org/dromara/sample/storage/domain/SysUploadFile.java new file mode 100644 index 0000000..9e004dd --- /dev/null +++ b/dk-modules/sample/src/main/java/org/dromara/sample/storage/domain/SysUploadFile.java @@ -0,0 +1,211 @@ +package org.dromara.sample.storage.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +/** + * 系统上传文件对象 sys_upload_file + * + * @author tom + * @date 2024-12-21 + */ +@TableName("sys_upload_file") +public class SysUploadFile extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** ID */ + @TableId(value="id",type = IdType.AUTO) + private Long id; + + /** 删除标记 */ + @TableField("del_flag") + private Long delFlag; + + /** 文件名称 */ + @TableField("name") + private String name; + + /** 上传时文件名 */ + @TableField("file_name") + private String fileName; + + /** 物理路径 */ + @TableField("path") + private String path; + + /** 文件URL */ + @TableField("url") + private String url; + + /** 文件扩展名 */ + @TableField("extend") + private String extend; + + /** 文件类型 */ + @TableField("dict_file_type") + private Long dictFileType; + + /** 关联对象ID */ + @TableField("object_id") + private Long objectId; + + /** 关联对象类型 */ + @TableField("object_type") + private String objectType; + + /** 关联对象ID */ + @TableField("object_link_id") + private String objectLinkId; + + /** 排序 */ + @TableField("sort") + private Long sort; + + /** 标签 */ + @TableField("tags") + private String tags; + + public void setId(Long id) + { + this.id = id; + } + + public Long getId() + { + return id; + } + public void setDelFlag(Long delFlag) + { + this.delFlag = delFlag; + } + + public Long getDelFlag() + { + return delFlag; + } + public void setName(String name) + { + this.name = name; + } + + public String getName() + { + return name; + } + public void setFileName(String fileName) + { + this.fileName = fileName; + } + + public String getFileName() + { + return fileName; + } + public void setPath(String path) + { + this.path = path; + } + + public String getPath() + { + return path; + } + public void setUrl(String url) + { + this.url = url; + } + + public String getUrl() + { + return url; + } + public void setExtend(String extend) + { + this.extend = extend; + } + + public String getExtend() + { + return extend; + } + public void setDictFileType(Long dictFileType) + { + this.dictFileType = dictFileType; + } + + public Long getDictFileType() + { + return dictFileType; + } + public void setObjectId(Long objectId) + { + this.objectId = objectId; + } + + public Long getObjectId() + { + return objectId; + } + public void setObjectType(String objectType) + { + this.objectType = objectType; + } + + public String getObjectType() + { + return objectType; + } + + public String getObjectLinkId() { + return objectLinkId; + } + + public void setObjectLinkId(String objectLinkId) { + this.objectLinkId = objectLinkId; + } + + public void setSort(Long sort) + { + this.sort = sort; + } + + public Long getSort() + { + return sort; + } + + public String getTags() { + return tags; + } + + public void setTags(String tags) { + this.tags = tags; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("delFlag", getDelFlag()) + .append("name", getName()) + .append("fileName", getFileName()) + .append("path", getPath()) + .append("url", getUrl()) + .append("extend", getExtend()) + .append("dictFileType", getDictFileType()) + .append("objectId", getObjectId()) + .append("objectType", getObjectType()) + .append("sort", getSort()) + .toString(); + } +} diff --git a/dk-modules/sample/src/main/java/org/dromara/sample/storage/util/OssTianyiClientUtils.java b/dk-modules/sample/src/main/java/org/dromara/sample/storage/util/OssTianyiClientUtils.java new file mode 100644 index 0000000..e952f4a --- /dev/null +++ b/dk-modules/sample/src/main/java/org/dromara/sample/storage/util/OssTianyiClientUtils.java @@ -0,0 +1,174 @@ +package org.dromara.sample.storage.util; + +import cn.hutool.core.io.FileUtil; +import io.minio.*; +import io.minio.errors.*; +import io.minio.messages.Item; +import org.dromara.sample.storage.config.OssTianyiConfig; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.web.multipart.MultipartFile; + +import java.io.BufferedInputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; + +@Component +public class OssTianyiClientUtils { + + private static MinioClient minioClient; + +// private static String endPoint = "https://jiangsu-10.zos.ctyun.cn"; //地域节点,可访问 +// // private static String endPoint = "https://dk-ty-oss-bucket.jiangsu-10.zos.ctyun.cn"; //说是桶的域名地址,支持公网访问ZOS,实测报错 +// private static String minioAccessKey = "22e3f37368a242b38f4f25d98c9baf1f"; +// private static String minioSecretKey = "0d858850666248e59830d9a596847062"; + +// private static String bucketName = "dk-ty-oss-bucket"; +// private String bucketName = "dkossbucket"; + private String objectName = "page.html"; + //注意,天翼云里默认路径就是文件名,不需要在前面加根路径/ + private String filePath = "dev/temp/"; + private String fileDir = "dev"; + + + @Autowired + OssTianyiConfig ossTianyiConfig; + + @Autowired + public OssTianyiClientUtils(OssTianyiConfig ossTianyiConfig) { + this.ossTianyiConfig = ossTianyiConfig; + init(); + } + + private void init() { + this.minioClient = MinioClient.builder() + .endpoint(ossTianyiConfig.getEndPoint()) + .credentials(ossTianyiConfig.getAccessKey(), ossTianyiConfig.getSecretKey()) + .build(); + } + + /** + * 天翼云OSS初始化(采用S3 Compatible Storage) + */ +// public void tianyiOssInit() { +// minioClient = MinioClient.builder() +// .endpoint(ossTianyiConfig.getEndPoint()) +// .credentials(ossTianyiConfig.getAccessKey(), ossTianyiConfig.getSecretKey()) +// .build(); +// } + + /** + * 文件上传 (固定) + */ + public void uploadFileTest(String objectName, String filePath, String localFilePath) throws Exception { + File file = new File(localFilePath); + BufferedInputStream inputStream = FileUtil.getInputStream(file); + String contentType = Files.probeContentType(file.toPath()); + if (contentType == null) { + contentType = "application/octet-stream"; + } + PutObjectArgs args = PutObjectArgs.builder() + .bucket(ossTianyiConfig.getBucketName()) + .object(filePath + objectName) + .stream(inputStream, FileUtil.size(file), -1) + .contentType(contentType) + .build(); + minioClient.putObject(args); + } + + public void uploadFile(String s, String s1, MultipartFile file) { + try { + PutObjectArgs args = PutObjectArgs.builder() + .bucket(ossTianyiConfig.getBucketName()) + .object( file.getName()) + .stream(file.getInputStream(), file.getSize(), -1) + .contentType(file.getContentType()) + .build(); + minioClient.putObject(args); + } catch (Exception e) { + e.printStackTrace(); + } + + } + + + + /** + * 文件删除 + */ + public void deleteFile(String bucketName, String objectName) throws Exception { + minioClient.removeObject( + RemoveObjectArgs.builder() + .bucket(bucketName) + .object(objectName) + .build()); + } + + /** + * 文件下载 + */ + public void downloadFile(String bucketName, String objectName, String downloadPath) throws Exception { + InputStream inputStream = minioClient.getObject( + GetObjectArgs.builder() + .bucket(bucketName) + .object(objectName) + .build() + ); + FileUtil.writeFromStream(inputStream, new File(downloadPath)); + } + + /** + * 文件列表 + * @param bucketName + * @param prefix + */ + public void listFiles(String bucketName, String prefix) { + Iterable> results = minioClient.listObjects( + ListObjectsArgs.builder() + .bucket(bucketName) + .prefix(prefix) + .recursive(true) + .build() + ); + + try { + for (Result result : results) { + try { +// System.out.println("文件名:" + result.get().objectName()); // 获取对象名称(文件路径) + System.out.println(result.get().objectName()); // 获取对象名称(文件路径) + } catch (Exception e) { + e.printStackTrace(); + } + } + + } catch (Exception e) { + System.err.println("文件读取异常: " + e.getMessage()); + } + + } + + + + +// public void updateFile(String bucketName, String objectName, String filePath, String localFilePath) throws Exception { +// uploadFile(bucketName, objectName, filePath, localFilePath); +// } + + +// public static void main(String[] args) throws Exception { +// String localFilePath = "D:\\123pan\\page.html"; +// +// tianyiOssInit("", "", ""); +// uploadFile(bucketName, objectName, filePath, localFilePath);//正常 +//// deleteFile(bucketName, filePath + objectName);//正常 +//// listFiles(bucketName, fileDir + "/"); // 正常 +// +//// downloadFile(bucketName, filePath + objectName, "D:\\123pan\\downloaded_page.html"); //正常 +// +// } + +}