/* * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * Neither the name of the dreamlu.net developer nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * Author: Chill 庄骞 (smallchill@163.com) */ package org.springblade.modules.resource.endpoint; import io.minio.*; import io.minio.errors.*; import io.swagger.annotations.Api; import javafx.scene.Parent; import lombok.AllArgsConstructor; import lombok.SneakyThrows; import org.springblade.common.config.FileConfig; import org.springblade.common.constant.FtpConstant; import org.springblade.common.utils.FileUtil; import org.springblade.core.launch.constant.AppConstant; import org.springblade.core.oss.model.BladeFile; import org.springblade.core.oss.model.OssFile; import org.springblade.core.secure.annotation.PreAuth; import org.springblade.core.tenant.annotation.NonDS; import org.springblade.core.tool.api.R; import org.springblade.core.tool.constant.RoleConstant; import org.springblade.core.tool.utils.Func; import org.springblade.modules.FTP.FtpUtil; import org.springblade.modules.apply.entity.Apply; import org.springblade.modules.apply.entity.ExamPayment; import org.springblade.modules.apply.service.ExamPaymentService; import org.springblade.modules.exam.service.ExamPaperService; import org.springblade.modules.resource.builder.oss.OssBuilder; import org.springblade.modules.resource.entity.Attach; import org.springblade.modules.resource.service.IAttachService; import org.springblade.modules.system.entity.User; import org.springblade.modules.system.service.IUserService; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.text.SimpleDateFormat; import java.util.*; import java.util.regex.Pattern; import static org.springblade.common.constant.FtpConstant.*; /** * 对象存储端点 * * @author Chill */ @NonDS @RestController @AllArgsConstructor @Api(value = "对象存储端点", tags = "对象存储端点") @RequestMapping(AppConstant.APPLICATION_RESOURCE_NAME + "/oss/endpoint") public class OssEndpoint { /** * 对象存储构建类 */ private final OssBuilder ossBuilder; /** * 附件表服务 */ private final IAttachService attachService; private final IUserService userService; private final ExamPaperService examPaperService; private final ExamPaymentService examPaymentService; /** * 创建存储桶 * * @param bucketName 存储桶名称 * @return Bucket */ @SneakyThrows @PostMapping("/make-bucket") @PreAuth(RoleConstant.HAS_ROLE_ADMIN) public R makeBucket(@RequestParam String bucketName) { ossBuilder.template().makeBucket(bucketName); return R.success("创建成功"); } /** * 创建存储桶 * * @param bucketName 存储桶名称 * @return R */ @SneakyThrows @PostMapping("/remove-bucket") @PreAuth(RoleConstant.HAS_ROLE_ADMIN) public R removeBucket(@RequestParam String bucketName) { ossBuilder.template().removeBucket(bucketName); return R.success("删除成功"); } /** * 拷贝文件 * * @param fileName 存储桶对象名称 * @param destBucketName 目标存储桶名称 * @param destFileName 目标存储桶对象名称 * @return R */ @SneakyThrows @PostMapping("/copy-file") public R copyFile(@RequestParam String fileName, @RequestParam String destBucketName, String destFileName) { ossBuilder.template().copyFile(fileName, destBucketName, destFileName); return R.success("操作成功"); } /** * 获取文件信息 * * @param fileName 存储桶对象名称 * @return InputStream */ @SneakyThrows @GetMapping("/stat-file") public R statFile(@RequestParam String fileName) { return R.data(ossBuilder.template().statFile(fileName)); } /** * 获取文件相对路径 * * @param fileName 存储桶对象名称 * @return String */ @SneakyThrows @GetMapping("/file-path") public R filePath(@RequestParam String fileName) { return R.data(ossBuilder.template().filePath(fileName)); } /** * 获取文件外链 * * @param fileName 存储桶对象名称 * @return String */ @SneakyThrows @GetMapping("/file-link") public R fileLink(@RequestParam String fileName) { return R.data(ossBuilder.template().fileLink(fileName)); } /** * 上传文件 * * @param file 文件 * @return ObjectStat */ @SneakyThrows @PostMapping("/put-file") public R putFile(@RequestParam MultipartFile file) { BladeFile bladeFile = ossBuilder.template().putFile(file.getOriginalFilename(), file.getInputStream()); return R.data(bladeFile); } /** * app 文件上传 * * @param file 图片对象 */ @PostMapping("put-file-app") public R putFileApp(@RequestParam MultipartFile file) throws IOException, ServerException, InsufficientDataException, InternalException, InvalidResponseException, InvalidKeyException, NoSuchAlgorithmException, XmlParserException, ErrorResponseException { //填写你文件上传的地址以及相应信息 String url = "http://223.82.109.183:2081"; String access = "zhbaadmin"; String secret = "zhbapassword"; String bucket = "zhba"; MinioClient minioClient = MinioClient.builder() .endpoint(url) .credentials(access, secret) .build(); // 检查存储桶是否已经存在 boolean isExist = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucket).build()); if (!isExist) { // 创建一个名为zip的存储桶,用于zip文件。 minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucket).build()); minioClient.setBucketPolicy(SetBucketPolicyArgs.builder().bucket(bucket).build()); } String fileName = file.getOriginalFilename(); String newName = "upload/picture/" + UUID.randomUUID().toString().replaceAll("-", "") + fileName.substring(fileName.lastIndexOf(".")); InputStream in = file.getInputStream(); String[] split = newName.split("/"); //创建头部信息 Map headers = new HashMap<>(1 << 2); //添加自定义内容类型 headers.put("Content-Type", "application/octet-stream"); //上传 minioClient.putObject( PutObjectArgs.builder().bucket(bucket).object(newName).stream( in, in.available(), -1) .headers(headers) .build()); InputStream inputStream = file.getInputStream(); FtpUtil.uploadFile(ftpHost_dev, ftpPort, ftpUserName, ftpPassword, ftpPath, "/", split[2], inputStream); in.close(); String urls = "http://223.82.109.183:2081/zhba/" + newName; return R.data(urls); } /** * 文件上传,自定义上传 * * @param file 图片对象 */ @PostMapping("put-files") public R putFiles(@RequestParam MultipartFile file) throws IOException, ServerException, InsufficientDataException, InternalException, InvalidResponseException, InvalidKeyException, NoSuchAlgorithmException, XmlParserException, ErrorResponseException { //填写你文件上传的地址以及相应信息 String url = "http://223.82.109.183:2081"; String access = "zhbaadmin"; String secret = "zhbapassword"; String bucket = "zhba"; MinioClient minioClient = MinioClient.builder() .endpoint(url) .credentials(access, secret) .build(); // 检查存储桶是否已经存在 boolean isExist = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucket).build()); if (!isExist) { // 创建一个名为zip的存储桶,用于zip文件。 minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucket).build()); minioClient.setBucketPolicy(SetBucketPolicyArgs.builder().bucket(bucket).build()); } String fileName = file.getOriginalFilename(); String newName = "upload/picture/" + UUID.randomUUID().toString().replaceAll("-", "") + fileName.substring(fileName.lastIndexOf(".")); InputStream in = file.getInputStream(); String[] split = newName.split("/"); //创建头部信息 Map headers = new HashMap<>(1 << 2); //添加自定义内容类型 headers.put("Content-Type", "application/octet-stream"); //上传 minioClient.putObject( PutObjectArgs.builder().bucket(bucket).object(newName).stream( in, in.available(), -1) .headers(headers) .build()); InputStream inputStream = file.getInputStream(); FtpUtil.uploadFile(ftpHost_dev, ftpPort, ftpUserName, ftpPassword, ftpPath, "/", split[2], inputStream); in.close(); String urls = "http://223.82.109.183:2081/zhba/" + newName; //数据封装 Map map = new HashMap<>(2); map.put("name", newName); map.put("url", urls); //返回 return R.data(map); } /** * 文件上传,zip * * @param file 图片对象 */ @PostMapping("put-file-zip") public R putFileZip(@RequestParam MultipartFile file) throws Exception { Map map = new HashMap<>(1); //填写你文件上传的地址以及相应信息 String url = "http://223.82.109.183:2081"; String access = "zhbaadmin"; String secret = "zhbapassword"; String bucket = "zhba"; MinioClient minioClient = MinioClient.builder() .endpoint(url) .credentials(access, secret) .build(); // 检查存储桶是否已经存在 boolean isExist = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucket).build()); if (!isExist) { // 创建一个名为zip的存储桶,用于zip文件。 minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucket).build()); minioClient.setBucketPolicy(SetBucketPolicyArgs.builder().bucket(bucket).build()); } String fileName = file.getOriginalFilename(); String namePath = fileName.substring(0,fileName.lastIndexOf(".")); String fileType = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase(Locale.US); //判断文件是不是zip类型 if(!fileType.equals("zip")){ map.put("data","上传文件类型不符!"); return R.data(map); } //FileConfig.localtion是配置文件和config类生产的,测试demo可以直接把FileConfig.localtion替换成D:/test String uuid = UUID.randomUUID().toString(); String desPath = FileConfig.localtion + File.separator + uuid.replaceAll("-", ""); // String desPath = "D:/test" + File.separator + uuid.replaceAll("-", ""); //遗漏了这个代码,在本地测试环境不会出问题,在服务器上一定会报没有找到文件的错误 String savePath = FileConfig.localtion + File.separator; FileUtil fileUtil = new FileUtil(); //解压zip文件 FileUtil.unZip(file, desPath,savePath); List fileList = new ArrayList<>(); //获取图片文件 fileList = fileUtil.getSubFiles(desPath+File.separator+namePath,fileList); for (MultipartFile multipartFile : fileList){ if(multipartFile.getName().toLowerCase().endsWith(".png") || multipartFile.getName().toLowerCase().endsWith(".jpg")) { String newName = "upload/picture/" + UUID.randomUUID().toString().replaceAll("-", "") + multipartFile.getName().substring(multipartFile.getName().lastIndexOf(".")); InputStream in = multipartFile.getInputStream(); String[] split = newName.split("/"); //创建头部信息 Map headers = new HashMap<>(1 << 2); //添加自定义内容类型 headers.put("Content-Type", "application/octet-stream"); //上传 minioClient.putObject( PutObjectArgs.builder().bucket(bucket).object(newName).stream( in, in.available(), -1) .headers(headers) .build()); String urls = "http://223.82.109.183:2081/zhba/" + newName; //内网 String inUrl = ip + newName; //取出身份证号,查询用户信息,更新用户信息 String pictrueName = multipartFile.getName().substring(0, multipartFile.getName().lastIndexOf(".")); // String regex ="([1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx])|([1-9]\\d{5}\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3})"; String regex ="[\u4e00-\u9fa5]"; Pattern compile = Pattern.compile(regex); String idCardNo = compile.matcher(pictrueName).replaceAll(""); User user = userService.getUserInfoByIdCardNo(idCardNo); //设置用户头像url if (null!=user){ user.setAvatar(urls); //更新用户信息 userService.updateById(user); //内网数据推送 //数据推送 String s = "update blade_user set avatar = " + "'" + inUrl + "'" + "where id = " + "'" + user.getId() + "'"; FtpUtil.sqlFileUpload(s); //文件推送 InputStream inputStream = multipartFile.getInputStream(); FtpUtil.uploadFile(ftpHost_dev, ftpPort, ftpUserName, ftpPassword, ftpPath, "/", split[2], inputStream); in.close(); } } } //最后要删除文件 FileUtil.clearFiles(FileConfig.localtion + File.separator + file.getOriginalFilename()); FileUtil.clearFiles(desPath); //数据封装 map.put("data", "上传成功!"); //返回 return R.data(map); } /** * 文件上传,zip , 缴费凭证 * * @param file 图片对象 */ @PostMapping("put-file-exam-payment-zip") public R putFileExamPaymentZip(@RequestParam MultipartFile file) throws Exception { Map map = new HashMap<>(1); //填写你文件上传的地址以及相应信息 String url = "http://223.82.109.183:2081"; String access = "zhbaadmin"; String secret = "zhbapassword"; String bucket = "zhba"; MinioClient minioClient = MinioClient.builder() .endpoint(url) .credentials(access, secret) .build(); // 检查存储桶是否已经存在 boolean isExist = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucket).build()); if (!isExist) { // 创建一个名为zip的存储桶,用于zip文件。 minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucket).build()); minioClient.setBucketPolicy(SetBucketPolicyArgs.builder().bucket(bucket).build()); } String fileName = file.getOriginalFilename(); String namePath = fileName.substring(0,fileName.lastIndexOf(".")); String fileType = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase(Locale.US); //判断文件是不是zip类型 if(!fileType.equals("zip")){ map.put("data","上传文件类型不符!"); return R.data(map); } //FileConfig.localtion是配置文件和config类生产的,测试demo可以直接把FileConfig.localtion替换成D:/test String uuid = UUID.randomUUID().toString(); String desPath = FileConfig.localtion + File.separator + uuid.replaceAll("-", ""); //遗漏了这个代码,在本地测试环境不会出问题,在服务器上一定会报没有找到文件的错误 String savePath = FileConfig.localtion + File.separator; FileUtil fileUtil = new FileUtil(); //解压zip文件 FileUtil.unZip(file, desPath,savePath); List fileList = new ArrayList<>(); //获取图片文件 fileList = fileUtil.getSubFiles(desPath,fileList); for (MultipartFile multipartFile : fileList){ if(multipartFile.getName().toLowerCase().endsWith(".png") || multipartFile.getName().toLowerCase().endsWith(".jpg")) { String newName = "upload/picture/" + UUID.randomUUID().toString().replaceAll("-", "") + multipartFile.getName().substring(multipartFile.getName().lastIndexOf(".")); InputStream in = multipartFile.getInputStream(); String[] split = newName.split("/"); //创建头部信息 Map headers = new HashMap<>(1 << 2); //添加自定义内容类型 headers.put("Content-Type", "application/octet-stream"); //上传 minioClient.putObject( PutObjectArgs.builder().bucket(bucket).object(newName).stream( in, in.available(), -1) .headers(headers) .build()); String urls = "http://223.82.109.183:2081/zhba/" + newName; //内网 String inUrl = ip + newName; //取出身份证号,查询用户信息,更新用户信息 String pictrueName = multipartFile.getName().substring(0, multipartFile.getName().lastIndexOf(".")); // String regex ="([1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx])|([1-9]\\d{5}\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3})"; String regex ="[\u4e00-\u9fa5]"; Pattern compile = Pattern.compile(regex); String idCardNo = compile.matcher(pictrueName).replaceAll(""); User user = userService.getUserInfoByIdCardNo(idCardNo); //设置用户头像url if (null!=user){ ExamPayment examPayment = new ExamPayment(); examPayment.setWorkerId(user.getId().toString()); examPayment.setCertificateUrl(urls); examPayment.setType(1); examPayment.setPaymentTime(new Date()); //查询当前人员的报名信息 List applyList = examPaperService.getApplyDetail(user.getId().toString()); //有且只有一条信息 if (applyList.size()==1){ examPayment.setApplyCode(applyList.get(0).getId().toString()); } //新增 examPaymentService.save(examPayment); //数据推送 String formatStr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(examPayment.getPaymentTime()); String s = "insert into sys_apply(id,type,payment_time,worker_id,apply_code,certificate_url) " + "values(" + "'" + examPayment.getId() + "'" + "," + "'" + examPayment.getType() + "'" + "," + "'" + formatStr + "'" + "," + "'" + examPayment.getWorkerId() + "'" + "," + "'" + examPayment.getApplyCode() + "'" + "," +"'" + examPayment.getCertificateUrl() + "'" + ")"; FtpUtil.sqlFileUpload(s); //文件推送 InputStream inputStream = multipartFile.getInputStream(); FtpUtil.uploadFile(ftpHost_dev, ftpPort, ftpUserName, ftpPassword, ftpPath, "/", split[2], inputStream); in.close(); } } } //最后要删除文件 FileUtil.clearFiles(FileConfig.localtion + File.separator + file.getOriginalFilename()); FileUtil.clearFiles(desPath); //数据封装 map.put("data", "上传成功!"); //返回 return R.data(map); } /** * 文件上传,自定义上传 * * @param file 图片对象 */ @PostMapping("put-files-talk") public R putFilestak(@RequestParam MultipartFile file) throws IOException, ServerException, InsufficientDataException, InternalException, InvalidResponseException, InvalidKeyException, NoSuchAlgorithmException, XmlParserException, ErrorResponseException { //填写你文件上传的地址以及相应信息 String url = "http://223.82.109.183:2081"; String access = "zhbaadmin"; String secret = "zhbapassword"; String bucket = "zhba"; MinioClient minioClient = MinioClient.builder() .endpoint(url) .credentials(access, secret) .build(); // 检查存储桶是否已经存在 boolean isExist = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucket).build()); if (!isExist) { // 创建一个名为zip的存储桶,用于zip文件。 minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucket).build()); minioClient.setBucketPolicy(SetBucketPolicyArgs.builder().bucket(bucket).build()); } String fileName = file.getOriginalFilename(); String newName = "upload/picture/" + UUID.randomUUID().toString().replaceAll("-", "") + fileName.substring(fileName.lastIndexOf(".")); InputStream in = file.getInputStream(); String[] split = newName.split("/"); //创建头部信息 Map headers = new HashMap<>(1 << 2); //添加自定义内容类型 headers.put("Content-Type", "application/octet-stream"); //上传 minioClient.putObject( PutObjectArgs.builder().bucket(bucket).object(newName).stream( in, in.available(), -1) .headers(headers) .build()); InputStream inputStream = file.getInputStream(); FtpUtil.uploadFile(ftpHost_dev, ftpPort, ftpUserName, ftpPassword, ftpPath, "/", split[2], inputStream); in.close(); String urls = "http://223.82.109.183:2081/zhba/" + newName; //数据封装 Map map = new HashMap<>(2); map.put("name", newName); map.put("url", urls); //返回 return R.data(map); } /** * 上传文件 * * @param fileName 存储桶对象名称 * @param file 文件 * @return ObjectStat */ @SneakyThrows @PostMapping("/put-file-by-name") public R putFile(@RequestParam String fileName, @RequestParam MultipartFile file) { BladeFile bladeFile = ossBuilder.template().putFile(fileName, file.getInputStream()); return R.data(bladeFile); } /** * 上传文件并保存至附件表 * * @param file 文件 * @return ObjectStat */ @SneakyThrows @PostMapping("/put-file-attach") public R putFileAttach(@RequestParam MultipartFile file, String deptid, String type, Long noticeId, String cardid) { String fileName = file.getOriginalFilename(); BladeFile bladeFile = ossBuilder.template().putFile(fileName, file.getInputStream()); InputStream inputStream = file.getInputStream(); Long attachId = buildAttach(fileName, file.getSize(), bladeFile, deptid, type, noticeId, cardid, inputStream); bladeFile.setAttachId(attachId); return R.data(bladeFile); } /** * 上传文件并保存至附件表 * * @param fileName 存储桶对象名称 * @param file 文件 * @return ObjectStat */ @SneakyThrows @PostMapping("/put-file-attach-by-name") public R putFileAttach(@RequestParam String fileName, @RequestParam MultipartFile file, String deptid, String type, Long noticeId, String cardid) { BladeFile bladeFile = ossBuilder.template().putFile(fileName, file.getInputStream()); Long attachId = buildAttach(fileName, file.getSize(), bladeFile, deptid, type, noticeId, cardid, file.getInputStream()); bladeFile.setAttachId(attachId); return R.data(bladeFile); } /** * 构建附件表 * * @param fileName 文件名 * @param fileSize 文件大小 * @param bladeFile 对象存储文件 * @return attachId */ private Long buildAttach(String fileName, Long fileSize, BladeFile bladeFile, String deptid, String type, Long noticeId, String cardid, InputStream in) throws Exception { //BladeUser user = AuthUtil.getUser(); String fileExtension = org.springblade.core.tool.utils.FileUtil.getFileExtension(fileName); Attach attach = new Attach(); attach.setDomain(bladeFile.getDomain()); attach.setTenantId("000000"); attach.setLink(bladeFile.getLink()); attach.setName(bladeFile.getName()); attach.setOriginalName(bladeFile.getOriginalName()); attach.setAttachSize(fileSize); attach.setExtension(fileExtension); attach.setDeptid(deptid); attach.setCardid(cardid); attach.setType(type); if (null != noticeId) { attach.setNoticeId(noticeId); } attachService.save(attach); String[] split = bladeFile.getName().split("/"); String ip = FtpConstant.ip+"/zhba/upload/picture/"; String imgurl = ip + split[2]; FtpUtil.uploadFile(ftpHost_dev, ftpPort, ftpUserName, ftpPassword, ftpPath, "/", split[2], in); //数据同步 String s1 = "insert into blade_attach(id,tenant_id,link,domain,name,original_name,extension,attach_size,create_user,deptid," + "create_time,update_user,update_time,status,is_deleted,type,cardid"; if (noticeId != null) { s1 += ",notice_id"+")" +"values(" + "'" + attach.getId() + "'" + "," + "'" + attach.getTenantId() + "'" + "," + "'" + imgurl + "'" + "," + "'" + ip + "'" + "," + "'" + split[2] + "'" + "," + "'" + attach.getOriginalName() + "'" + "," + "'" + attach.getExtension() + "'" + "," + "'" + attach.getAttachSize() + "'" + "," + "'" + attach.getCreateUser() + "'" + "," + "'" + attach.getDeptid() + "'" + "," + "'" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "'" + "," + "'" + attach.getUpdateUser() + "'" + "," + "'" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "'" + "," + "'" + attach.getStatus() + "'" + "," + "'" + attach.getIsDeleted() + "'" + "," + "'" + attach.getType() + "'" + "," + "'" + cardid + "'"; } else { s1 += ") " + "values(" + "'" + attach.getId() + "'" + "," + "'" + attach.getTenantId() + "'" + "," + "'" + imgurl + "'" + "," + "'" + ip + "'" + "," + "'" + split[2] + "'" + "," + "'" + attach.getOriginalName() + "'" + "," + "'" + attach.getExtension() + "'" + "," + "'" + attach.getAttachSize() + "'" + "," + "'" + attach.getCreateUser() + "'" + "," + "'" + attach.getDeptid() + "'" + "," + "'" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "'" + "," + "'" + attach.getUpdateUser() + "'" + "," + "'" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "'" + "," + "'" + attach.getStatus() + "'" + "," + "'" + attach.getIsDeleted() + "'" + "," + "'" + attach.getType() + "'" + "," + "'" + cardid + "'"; } if (noticeId != null) { s1 += ","+"'" + noticeId + "'" + ")"; } else { s1 += ")"; } FtpUtil.sqlFileUpload(s1); return attach.getId(); } /** * 删除文件 * * @param fileName 存储桶对象名称 * @return R */ @SneakyThrows @PostMapping("/remove-file") @PreAuth(RoleConstant.HAS_ROLE_ADMIN) public R removeFile(@RequestParam String fileName) { ossBuilder.template().removeFile(fileName); return R.success("操作成功"); } /** * 批量删除文件 * * @param fileNames 存储桶对象名称集合 * @return R */ @SneakyThrows @PostMapping("/remove-files") @PreAuth(RoleConstant.HAS_ROLE_ADMIN) public R removeFiles(@RequestParam String fileNames) { ossBuilder.template().removeFiles(Func.toStrList(fileNames)); return R.success("操作成功"); } }