diff --git a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/config/QnOssConfig.java b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/config/QnOssConfig.java new file mode 100644 index 000000000..46aa681d5 --- /dev/null +++ b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/config/QnOssConfig.java @@ -0,0 +1,27 @@ +package com.bsd.pjcloud.admin.api.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Component +@ConfigurationProperties(prefix = "qn") +@Data +public class QnOssConfig { + + private Oss oss; + + @Data + public static class Oss { + + private String accessKey; + + private String secretKey; + + private String bucketName; + + private String domain; + + } + +} diff --git a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/third/QnUploadVo.java b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/third/QnUploadVo.java new file mode 100644 index 000000000..1e9990b10 --- /dev/null +++ b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/third/QnUploadVo.java @@ -0,0 +1,14 @@ +package com.bsd.pjcloud.admin.api.vo.third; + +import lombok.Data; + +@Data +public class QnUploadVo { + + public String fileHash; + + public String fileName; + + public String fullUrl; + +} diff --git a/pjcloud-upms/pjcloud-upms-biz/pom.xml b/pjcloud-upms/pjcloud-upms-biz/pom.xml index a1516b609..4ec10d336 100644 --- a/pjcloud-upms/pjcloud-upms-biz/pom.xml +++ b/pjcloud-upms/pjcloud-upms-biz/pom.xml @@ -33,6 +33,11 @@ pjcloud 通用用户权限管理系统业务处理模块 + + com.qiniu + qiniu-java-sdk + [7.19.0, 7.19.99] + com.bsd diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/SysFileController.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/SysFileController.java index a7ca77cef..55dedf43c 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/SysFileController.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/SysFileController.java @@ -42,6 +42,7 @@ import org.springframework.http.HttpHeaders; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; +import java.util.Map; import java.util.Objects; /** @@ -122,6 +123,14 @@ public class SysFileController { return sysFileService.uploadFile(file, dir, groupId, type); } + /** + * 七牛云上传 + */ + @PostMapping(value = "/qn/upload") + public R> qnUpload(@RequestPart("file") MultipartFile file, @RequestParam(value = "dir", required = false) String dir, @RequestParam(value = "groupId", required = false) Long groupId, @RequestParam(value = "type", required = false) String type) { + return sysFileService.qnUpload(file, dir, groupId, type); + } + /** * 获取文件 * diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/QnOssService.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/QnOssService.java new file mode 100644 index 000000000..844368d3e --- /dev/null +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/QnOssService.java @@ -0,0 +1,11 @@ +package com.bsd.pjcloud.admin.service; + + +import com.bsd.pjcloud.admin.api.vo.third.QnUploadVo; +import org.springframework.web.multipart.MultipartFile; + +public interface QnOssService { + + QnUploadVo upload(MultipartFile file, String fileName); + +} diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/SysFileService.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/SysFileService.java index ad3174886..f7c1c15d4 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/SysFileService.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/SysFileService.java @@ -27,6 +27,7 @@ import jakarta.servlet.http.HttpServletResponse; import org.springframework.web.multipart.MultipartFile; import java.util.List; +import java.util.Map; /** * 文件管理 @@ -36,57 +37,66 @@ import java.util.List; */ public interface SysFileService extends IService { - /** - * 上传文件 - * @param file 文件流 - * @param dir 文件夹 - * @param groupId 分组ID - * @param type 类型 - * @return - */ - R uploadFile(MultipartFile file, String dir, Long groupId, String type); + /** + * 上传文件 + * + * @param file 文件流 + * @param dir 文件夹 + * @param groupId 分组ID + * @param type 类型 + * @return + */ + R uploadFile(MultipartFile file, String dir, Long groupId, String type); - R innerUpload(MultipartFile file, String dir, Long groupId, String type); + R innerUpload(MultipartFile file, String dir, Long groupId, String type); - /** - * 读取文件 - * @param fileName 文件名称 - * @param response 输出流 - */ - void getFile(String fileName, HttpServletResponse response); + R> qnUpload(MultipartFile file, String dir, Long groupId, String type); - /** - * 删除文件 - * @param id - * @return - */ - Boolean deleteFile(Long id); + /** + * 读取文件 + * + * @param fileName 文件名称 + * @param response 输出流 + */ + void getFile(String fileName, HttpServletResponse response); - /** - * 查询文件组列表 - * @param fileGroup SysFileGroup对象,用于筛选条件 - * @return 包含文件组列表的Tree对象列表 - */ - List> listFileGroup(SysFileGroup fileGroup); + /** + * 删除文件 + * + * @param id + * @return + */ + Boolean deleteFile(Long id); - /** - * 添加或更新文件组 - * @param fileGroup SysFileGroup对象,要添加或更新的文件组信息 - * @return 添加或更新成功返回true,否则返回false - */ - Boolean saveOrUpdateGroup(SysFileGroup fileGroup); + /** + * 查询文件组列表 + * + * @param fileGroup SysFileGroup对象,用于筛选条件 + * @return 包含文件组列表的Tree对象列表 + */ + List> listFileGroup(SysFileGroup fileGroup); - /** - * 删除文件组 - * @param id 待删除文件组的ID - * @return 删除成功返回true,否则返回false - */ - Boolean deleteGroup(Long id); + /** + * 添加或更新文件组 + * + * @param fileGroup SysFileGroup对象,要添加或更新的文件组信息 + * @return 添加或更新成功返回true,否则返回false + */ + Boolean saveOrUpdateGroup(SysFileGroup fileGroup); - /** - * 移动文件组 - * @param fileGroupDTO SysFileGroupDTO对象,要移动的文件组信息 - * @return 移动成功返回true,否则返回false - */ - Boolean moveFileGroup(SysFileGroupDTO fileGroupDTO); + /** + * 删除文件组 + * + * @param id 待删除文件组的ID + * @return 删除成功返回true,否则返回false + */ + Boolean deleteGroup(Long id); + + /** + * 移动文件组 + * + * @param fileGroupDTO SysFileGroupDTO对象,要移动的文件组信息 + * @return 移动成功返回true,否则返回false + */ + Boolean moveFileGroup(SysFileGroupDTO fileGroupDTO); } diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysFileServiceImpl.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysFileServiceImpl.java index 29f8355aa..cc023e513 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysFileServiceImpl.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysFileServiceImpl.java @@ -29,11 +29,14 @@ import cn.hutool.crypto.SecureUtil; import com.amazonaws.services.s3.model.S3Object; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsd.pjcloud.admin.api.config.QnOssConfig; import com.bsd.pjcloud.admin.api.dto.SysFileGroupDTO; import com.bsd.pjcloud.admin.api.entity.SysFile; import com.bsd.pjcloud.admin.api.entity.SysFileGroup; +import com.bsd.pjcloud.admin.api.vo.third.QnUploadVo; import com.bsd.pjcloud.admin.mapper.SysFileGroupMapper; import com.bsd.pjcloud.admin.mapper.SysFileMapper; +import com.bsd.pjcloud.admin.service.QnOssService; import com.bsd.pjcloud.admin.service.SysFileService; import com.bsd.pjcloud.common.core.constant.CommonConstants; import com.bsd.pjcloud.common.core.util.R; @@ -70,6 +73,10 @@ public class SysFileServiceImpl extends ServiceImpl impl private final FileProperties properties; + private final QnOssConfig qnOssConfig; + + private final QnOssService qnOssService; + /** * 上传文件 * @@ -116,10 +123,25 @@ public class SysFileServiceImpl extends ServiceImpl impl return R.ok(resultMap); } + /** + * 七牛云上传 + */ + @Override + public R> qnUpload(MultipartFile file, String dir, Long groupId, String type) { + String fileName = IdUtil.simpleUUID() + StrUtil.DOT + FileUtil.extName(file.getOriginalFilename()); + Map resultMap = new HashMap<>(4); + + QnUploadVo upload = qnOssService.upload(file, fileName); + + resultMap.put("bucketName", qnOssConfig.getOss().getBucketName()); + resultMap.put("fileName", fileName); + resultMap.put("url", upload.getFullUrl()); + return R.ok(resultMap); + } + /** * 读取文件 * - * @param bucket * @param fileName * @param response */ diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/third/QnOssServiceImpl.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/third/QnOssServiceImpl.java new file mode 100644 index 000000000..0ec765818 --- /dev/null +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/third/QnOssServiceImpl.java @@ -0,0 +1,54 @@ +package com.bsd.pjcloud.admin.service.impl.third; + +import com.alibaba.nacos.shaded.com.google.gson.Gson; +import com.bsd.pjcloud.admin.api.config.QnOssConfig; +import com.bsd.pjcloud.admin.api.vo.third.QnUploadVo; +import com.bsd.pjcloud.admin.service.QnOssService; +import com.qiniu.http.Response; +import com.qiniu.storage.Configuration; +import com.qiniu.storage.Region; +import com.qiniu.storage.UploadManager; +import com.qiniu.storage.model.DefaultPutRet; +import com.qiniu.util.Auth; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.io.InputStream; + + +@Slf4j +@Service +@RequiredArgsConstructor +public class QnOssServiceImpl implements QnOssService { + + private final QnOssConfig qnOssConfig; + + @Override + public QnUploadVo upload(MultipartFile file, String fileName) { + QnOssConfig.Oss oss = qnOssConfig.getOss(); + + Auth auth = Auth.create(oss.getAccessKey(), oss.getSecretKey()); + String upToken = auth.uploadToken(oss.getBucketName()); + + Configuration config = Configuration.create(Region.region0()); + config.resumableUploadAPIVersion = Configuration.ResumableUploadAPIVersion.V2; + UploadManager uploadManager = new UploadManager(config); + + try (InputStream inputStream = file.getInputStream()) { + Response response = uploadManager.put(inputStream, fileName, upToken, null, null); + DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class); + QnUploadVo result = new QnUploadVo(); + result.setFileHash(putRet.hash); + result.setFileName(fileName); + result.setFullUrl(oss.getDomain() + "/" + putRet.key); + return result; + } catch (Exception e) { + e.printStackTrace(); + log.error("七牛云上传视频错误:{}", e.getMessage()); + return null; + } + } + +} diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/resources/application.yml b/pjcloud-upms/pjcloud-upms-biz/src/main/resources/application.yml index 40fc40aab..c8c768d9b 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/resources/application.yml +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/resources/application.yml @@ -18,4 +18,9 @@ spring: - optional:nacos:${spring.application.name}-@profiles.active@.yml - +qn: + oss: + accessKey: IVrAjjdrTeZi14pqDd2s5kb_iAIGXATEMtOgmQUF + secretKey: SNhPscR3_xqX3E_B1XtMMWmLMrz7ipcguzNykQvo + bucketName: bizcabinet + domain: https://bizcabinet.zianxin.com \ No newline at end of file