From b30e17854902d5d49817a1b7262ed9663e843b47 Mon Sep 17 00:00:00 2001 From: qyhdd Date: Wed, 8 Jun 2022 17:46:10 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=83=E7=89=9B=E4=BA=91=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=E6=96=87=E4=BB=B6=EF=BC=8C=E5=9B=BE=E7=89=87=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bnyer-services/bnyer-file/pom.xml | 30 ++- .../file/controller/SysFileController.java | 7 +- .../com/bnyer/file/service/IQiniuService.java | 9 + .../file/service/impl/QiniuServiceImpl.java | 248 ++++++++++++++++++ .../java/com/bnyer/file/utils/StringUtil.java | 162 ++++++++++++ .../src/main/resources/bootstrap.yml | 9 + bnyer-services/bnyer-img/pom.xml | 6 + pom.xml | 8 +- 8 files changed, 465 insertions(+), 14 deletions(-) create mode 100644 bnyer-services/bnyer-file/src/main/java/com/bnyer/file/service/IQiniuService.java create mode 100644 bnyer-services/bnyer-file/src/main/java/com/bnyer/file/service/impl/QiniuServiceImpl.java create mode 100644 bnyer-services/bnyer-file/src/main/java/com/bnyer/file/utils/StringUtil.java diff --git a/bnyer-services/bnyer-file/pom.xml b/bnyer-services/bnyer-file/pom.xml index a6296b8..98026f8 100644 --- a/bnyer-services/bnyer-file/pom.xml +++ b/bnyer-services/bnyer-file/pom.xml @@ -16,50 +16,50 @@ - + com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery - + com.alibaba.cloud spring-cloud-starter-alibaba-nacos-config - + com.alibaba.cloud spring-cloud-starter-alibaba-sentinel - + org.springframework.boot spring-boot-starter-actuator - + com.github.tobato fastdfs-client - + io.minio minio ${minio.version} - + com.dimensionalnode bnyer-api-system - + com.dimensionalnode @@ -78,7 +78,15 @@ springfox-swagger-ui ${swagger.fox.version} - + + com.qiniu + qiniu-java-sdk + + + com.squareup.okhttp3 + okhttp + 3.3.0 + @@ -97,5 +105,5 @@ - - \ No newline at end of file + + diff --git a/bnyer-services/bnyer-file/src/main/java/com/bnyer/file/controller/SysFileController.java b/bnyer-services/bnyer-file/src/main/java/com/bnyer/file/controller/SysFileController.java index efaf070..592d2af 100644 --- a/bnyer-services/bnyer-file/src/main/java/com/bnyer/file/controller/SysFileController.java +++ b/bnyer-services/bnyer-file/src/main/java/com/bnyer/file/controller/SysFileController.java @@ -1,6 +1,7 @@ package com.bnyer.file.controller; import com.bnyer.common.core.domain.R; +import com.bnyer.file.service.IQiniuService; import com.bnyer.file.service.MinioService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -25,7 +26,8 @@ public class SysFileController { @Autowired private MinioService minioService; - + @Autowired + private IQiniuService qiniuService; /** * 批量上传图片 */ @@ -54,7 +56,8 @@ public class SysFileController public R upload(@RequestParam("file") MultipartFile file) { String url = null; try{ - url = minioService.uploadFile(file); + //url = minioService.uploadFile(file); + url=qiniuService.userUpload(file); }catch (Exception e){ log.error("文件上传失败,原因为:【{}】",e.getMessage()); return R.fail("文件上传失败!"); diff --git a/bnyer-services/bnyer-file/src/main/java/com/bnyer/file/service/IQiniuService.java b/bnyer-services/bnyer-file/src/main/java/com/bnyer/file/service/IQiniuService.java new file mode 100644 index 0000000..e780e7a --- /dev/null +++ b/bnyer-services/bnyer-file/src/main/java/com/bnyer/file/service/IQiniuService.java @@ -0,0 +1,9 @@ +package com.bnyer.file.service; + +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; + +public interface IQiniuService { + String userUpload(MultipartFile file); +} diff --git a/bnyer-services/bnyer-file/src/main/java/com/bnyer/file/service/impl/QiniuServiceImpl.java b/bnyer-services/bnyer-file/src/main/java/com/bnyer/file/service/impl/QiniuServiceImpl.java new file mode 100644 index 0000000..f525040 --- /dev/null +++ b/bnyer-services/bnyer-file/src/main/java/com/bnyer/file/service/impl/QiniuServiceImpl.java @@ -0,0 +1,248 @@ +package com.bnyer.file.service.impl; + +import cn.hutool.core.net.multipart.UploadFile; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.nacos.common.codec.Base64; +import com.bnyer.common.core.domain.R; +import com.bnyer.file.service.IQiniuService; +import com.bnyer.file.utils.StringUtil; +import com.google.gson.Gson; +import com.google.gson.JsonSyntaxException; +import com.qiniu.common.QiniuException; +import com.qiniu.common.Zone; +import com.qiniu.http.Client; +import com.qiniu.http.Response; +import com.qiniu.storage.Configuration; +import com.qiniu.storage.UploadManager; +import com.qiniu.storage.model.DefaultPutRet; +import com.qiniu.util.Auth; +import com.qiniu.util.StringMap; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; + +/** + * @Author: Yeman + * @Date: 2022-06-08-10:51 + * @Description: + */ +@Service("qiniuService") +public class QiniuServiceImpl implements IQiniuService { + @Value("${qiniu.accessKey}") + private static String accessKey; + + @Value("${qiniu.secretKey}") + private static String secretKey; + + @Value("${qiniu.bucketName}") + private static String bucketName; + + @Value("${qiniu.url}") + private static String url; + + private String token = null; + private UploadManager uploadManager; + private static Zone zone = new Zone.Builder(Zone.autoZone()) + .upHttp("http://upload.qiniup.com") + .upHttps("http://upload.qiniup.com") + .upBackupHttp("http://upload.qiniup.com") + .upBackupHttps("http://upload.qiniup.com") + .rsHttp("http://rs.qiniu.com") + .rsfHttp("http://rsf.qiniu.com") + .apiHttp("http://api.qiniu.com") + .iovipHttp("http://iovip.qbox.me").build(); + @Override + public String userUpload(MultipartFile file) { + String s = updloadFile(file); + return s; + } + public static String updloadFile(MultipartFile file){ + // 获取文件的名称 + String fileName = file.getOriginalFilename(); + //构造一个带指定 Region 对象的配置类 + Configuration cfg = new Configuration(zone); + cfg.useHttpsDomains=false; + UploadManager uploadManager = new UploadManager(cfg); + Auth auth = Auth.create(accessKey, secretKey); + String token = auth.uploadToken(bucketName); + // 使用工具类根据上传文件生成唯一图片名称 + String imgName = StringUtil.getRandomImgName(fileName); + if (!file.isEmpty()) { + FileInputStream inputStream =null; + try { + inputStream=(FileInputStream) file.getInputStream(); + Response response = uploadManager.put(inputStream, imgName, token,null,null); + DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class); + url=url+"/"+putRet.key; + //System.out.println(putRet.hash); + inputStream.close(); + } catch (QiniuException ex) { + ex.printStackTrace(); + return "error"; + } catch (JsonSyntaxException e) { + e.printStackTrace(); + return "error"; + }catch (IOException ioe){ + ioe.printStackTrace(); + return "error"; + } + //String path = qiniuService.uploadFile(file) + // System.out.print("七牛云返回的图片链接:" + path); + return url; + } + return "error"; + } + + /** + * 检查图片内容是否符合规定 + * @param imageUrl 图片的url地址或者图片Base64编码(Base64编码请求时应在开头加上data:application/octet-stream;base64,) + * @return JSONObject + */ + public static JSONObject checkImageContent(String imageUrl) { + + //基础参数拼接 + String url = "http://ai.qiniuapi.com/v3/image/censor"; + String host = "ai.qiniuapi.com"; + String body = "{ \"data\": { \"uri\": \""+imageUrl+"\" }, \"params\": { \"scenes\": [ \"pulp\", \"terror\", \"politician\" ] } }"; + String contentType = "application/json"; + String method = "POST"; + String accessKey="p53_UbfvTkc_EsRZU-neo7FN6dK1TpEhH9xpHf1q"; + String secretKey="1W3byAEOKcsz7fKdE_ndCDJy6u_IGojH4A_fwuQx"; + Auth auth = Auth.create(accessKey, secretKey); + String qiniuToken = "Qiniu " + auth.signRequestV2(url, method, body.getBytes(), contentType); + //log.info("url={},body={},qiniuToken={}",url,body,qiniuToken); + //头部部分 + StringMap header = new StringMap(); + header.put("Host",host); + header.put("Authorization",qiniuToken); + header.put("Content-Type", contentType); + Configuration c = new Configuration(zone); + Client client = new Client(c); + try { + Response response = client.post(url, body.getBytes(), header, contentType); + //System.out.println(response.bodyString()); + //log.info("response result={}",response.bodyString()); + JSONObject checkResult = JSON.parseObject(response.bodyString()); + String checkMsg = JSON.parseObject(checkResult.get("result").toString()).get("suggestion").toString(); + if (checkMsg.equals("pass")){ + //可以通过 + } + if (checkMsg.equals("review")){ + //人工审核 + } + if (checkMsg.equals("block")){ + //不可通过 + } + return checkResult; + } catch (QiniuException e) { + e.printStackTrace(); + } + return null; + } + + + /** + * 检查图片的格式 + * @param multipartFiles + * @return 格式正确的文件 + */ + public static ArrayList checkImageFormat(ArrayList multipartFiles){ + ArrayList afterCheckFiles = new ArrayList<>(); + for (MultipartFile multipartFile : multipartFiles) { + ArrayList imageSuffixList = new ArrayList<>(); + String suffix = getSuffix(multipartFile); + //图片后缀 + imageSuffixList.add("jpg"); + imageSuffixList.add("png"); + imageSuffixList.add("avi"); + imageSuffixList.add("flv"); + imageSuffixList.add("mpg"); + imageSuffixList.add("mpeg"); + imageSuffixList.add("mpe"); + imageSuffixList.add("m1v"); + imageSuffixList.add("m2v"); + imageSuffixList.add("mpv2"); + imageSuffixList.add("mp2v"); + imageSuffixList.add("dat"); + imageSuffixList.add("ts"); + imageSuffixList.add("tp"); + imageSuffixList.add("tpr"); + imageSuffixList.add("pva"); + imageSuffixList.add("pss"); + imageSuffixList.add("mp4"); + imageSuffixList.add("m4v"); + imageSuffixList.add("m4p"); + imageSuffixList.add("m4b"); + imageSuffixList.add("3gp"); + imageSuffixList.add("3gpp"); + imageSuffixList.add("3g2"); + imageSuffixList.add("3gp2"); + imageSuffixList.add("ogg"); + imageSuffixList.add("mov"); + imageSuffixList.add("qt"); + imageSuffixList.add("amr"); + imageSuffixList.add("rm"); + imageSuffixList.add("ram"); + imageSuffixList.add("rmvb"); + imageSuffixList.add("rpm"); + //判断视频的后缀 MP4、MOV、WMV + ArrayList videoSuffixList = new ArrayList<>(); + videoSuffixList.add("mp4"); + videoSuffixList.add("mov"); + videoSuffixList.add("wmv"); +// imageSuffix.add("jpg"); +// imageSuffix.add("jpg"); + if (suffix != null&&imageSuffixList.contains(suffix)&&multipartFile.getSize() / 1024 < 50000&&multipartFile.getSize() / 1024 > 0) { + afterCheckFiles.add(multipartFile); + } + } + return afterCheckFiles; + } + + public static String getSuffix(MultipartFile file) { + String originalFilename = file.getOriginalFilename(); + //System.out.println(originalFilename); + int dot = originalFilename.lastIndexOf('.'); + int fileNameLength = originalFilename.length(); + if ((dot > -1) && (dot < (originalFilename.length()))) { + String suffix = originalFilename.substring(dot + 1, fileNameLength); + return suffix.toLowerCase(); + } + return null; + } + public static String getImageString(String imageFile){ + InputStream is = null; + try { + byte[] data = null; + is = new FileInputStream(new File(imageFile)); + data = new byte[is.available()]; + is.read(data); + return new String(Base64.encodeBase64(data)); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (null != is) { + try { + is.close(); + is = null; + } catch (Exception e) { + e.printStackTrace(); + } + } + } + return ""; + } + public static void main(String[] args) { + String imageString = getImageString("C:\\Users\\ASUS\\Documents\\WeChat Files\\wxid_vzk0z5ghy6q922\\FileStorage\\File\\2020-09\\20220608134731.png"); + JSONObject jsonObject = checkImageContent("data:application/octet-stream;base64," + imageString); + System.out.println(JSON.parseObject(jsonObject.get("result").toString()).get("suggestion").toString()); + System.out.println(jsonObject); + } +} diff --git a/bnyer-services/bnyer-file/src/main/java/com/bnyer/file/utils/StringUtil.java b/bnyer-services/bnyer-file/src/main/java/com/bnyer/file/utils/StringUtil.java new file mode 100644 index 0000000..2ffe9bb --- /dev/null +++ b/bnyer-services/bnyer-file/src/main/java/com/bnyer/file/utils/StringUtil.java @@ -0,0 +1,162 @@ +package com.bnyer.file.utils; + +import cn.hutool.core.date.DateUtil; +import lombok.extern.slf4j.Slf4j; + +import java.util.Map; +import java.util.UUID; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * @Author: Yeman + * @Date: 2022-06-08-11:08 + * @Description: + */ +@Slf4j +public class StringUtil { + /** + * 数值类型前面补零(共13位) + * @param num + * @return + */ + public static String supplementZeroGenerateThirteen(int num){ + String str = String.format("%013d", num); + + return str; + } + + /** + * 数值类型前面补零(共16位) + * @param num + * @return + */ + public static String supplementZeroGenerateSixteen(int num){ + String str = String.format("%016d", num); + + return str; + } + /** + * 数值类型前面补零(共3位) + * @param num + * @return + */ + public static String supplementZeroGenerateThree(int num){ + String str = String.format("%03d", num); + + return str; + } + + /** + * 判断字符串是不是double型 + * @param str + * @return + */ + public static boolean isNumeric(String str){ + Pattern pattern = Pattern.compile("[0-9]+[.]{0,1}[0-9]*[dD]{0,1}"); + Matcher isNum = pattern.matcher(str); + if( !isNum.matches() ){ + return false; + } + return true; + } + + public static String trim(String str, boolean nullFlag){ + String tempStr = null; + + if (str != null) + { + tempStr = str.trim(); + } + + if (nullFlag) + { + if ("".equals(tempStr) || "null".equals(tempStr)) + { + tempStr = null; + } + } + else + { + if (tempStr == null) + { + tempStr = ""; + } + } + + return tempStr; + } + public static String replace(String strSource, String strFrom, String strTo) { + if(strSource==null){ + return null; + } + int i = 0; + if ((i = strSource.indexOf(strFrom, i)) >= 0) { + char[] cSrc = strSource.toCharArray(); + char[] cTo = strTo.toCharArray(); + int len = strFrom.length(); + StringBuffer buf = new StringBuffer(cSrc.length); + buf.append(cSrc, 0, i).append(cTo); + i += len; + int j = i; + while ((i = strSource.indexOf(strFrom, i)) > 0) { + buf.append(cSrc, j, i - j).append(cTo); + i += len; + j = i; + } + buf.append(cSrc, j, cSrc.length - j); + return buf.toString(); + } + return strSource; + } + + + public static String deal(String str) { + str = replace(str, "\\", "\\\\"); + str = replace(str, "'", "\\'"); + str = replace(str, "\r", "\\r"); + str = replace(str, "\n", "\\n"); + str = replace(str, "\"", "\\\""); + return str; + } + + public static String GetMapToXML(Map param){ + StringBuffer sb = new StringBuffer(); + sb.append(""); + for (Map.Entry entry : param.entrySet()) { + sb.append("<"+ entry.getKey() +">"); + sb.append(entry.getValue()); + sb.append(""); + } + sb.append(""); + return sb.toString(); + } + + public static void main(String[] args){ + //String a = StringUtil.supplementZeroGenerateThirteen(1000); + double a = 32.; + System.out.println(StringUtil.isNumeric("32.")); + System.out.println(a); + } + + /** + * @Description: 生成唯一图片名称 + * @Param: fileName + * @return: 云服务器fileName + */ + public static String getRandomImgName(String fileName) { + + int index = fileName.lastIndexOf("."); + + if ((fileName == null || fileName.isEmpty()) || index == -1){ + throw new IllegalArgumentException(); + } + // 获取文件后缀 + String suffix = fileName.substring(index); + // 生成UUID + String uuid = UUID.randomUUID().toString().replaceAll("-", ""); + // 生成上传至云服务器的路径 + String path = "code/duck/" + DateUtil.today() + "-" + uuid + suffix; + return path; + } +} diff --git a/bnyer-services/bnyer-file/src/main/resources/bootstrap.yml b/bnyer-services/bnyer-file/src/main/resources/bootstrap.yml index 1178a47..a1a9223 100644 --- a/bnyer-services/bnyer-file/src/main/resources/bootstrap.yml +++ b/bnyer-services/bnyer-file/src/main/resources/bootstrap.yml @@ -13,3 +13,12 @@ spring: profiles: # 环境配置 active: dev + servlet: + multipart: + maxFileSize: 5MB +qiniu: + accessKey: p53_UbfvTkc_EsRZU-neo7FN6dK1TpEhH9xpHf1q + secretKey: 1W3byAEOKcsz7fKdE_ndCDJy6u_IGojH4A_fwuQx + url: http://rd582ra2f.hd-bkt.clouddn.com/ + bucketName: cyjd + diff --git a/bnyer-services/bnyer-img/pom.xml b/bnyer-services/bnyer-img/pom.xml index 47d63c9..3aae3b2 100644 --- a/bnyer-services/bnyer-img/pom.xml +++ b/bnyer-services/bnyer-img/pom.xml @@ -95,6 +95,12 @@ xxl-job-core 2.1.2 + + + com.qiniu + qiniu-java-sdk + 7.2.18 + diff --git a/pom.xml b/pom.xml index e4e109a..080a6c6 100644 --- a/pom.xml +++ b/pom.xml @@ -42,6 +42,7 @@ 2.12.2 1.18.12 5.8.0.M3 + 7.2.18 @@ -251,7 +252,12 @@ hutool-all ${hutool.version} - + + + com.qiniu + qiniu-java-sdk + ${qiniu.version} +