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(""+ entry.getKey() +">");
+ }
+ 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}
+