Browse Source

七牛云上传文件,图片校验

master
qyhdd 4 years ago
parent
commit
b30e178549
  1. 30
      bnyer-services/bnyer-file/pom.xml
  2. 7
      bnyer-services/bnyer-file/src/main/java/com/bnyer/file/controller/SysFileController.java
  3. 9
      bnyer-services/bnyer-file/src/main/java/com/bnyer/file/service/IQiniuService.java
  4. 248
      bnyer-services/bnyer-file/src/main/java/com/bnyer/file/service/impl/QiniuServiceImpl.java
  5. 162
      bnyer-services/bnyer-file/src/main/java/com/bnyer/file/utils/StringUtil.java
  6. 9
      bnyer-services/bnyer-file/src/main/resources/bootstrap.yml
  7. 6
      bnyer-services/bnyer-img/pom.xml
  8. 8
      pom.xml

30
bnyer-services/bnyer-file/pom.xml

@ -16,50 +16,50 @@
</description>
<dependencies>
<!-- SpringCloud Alibaba Nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- SpringCloud Alibaba Nacos Config -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- SpringCloud Alibaba Sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!-- SpringBoot Actuator -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- FastDFS -->
<dependency>
<groupId>com.github.tobato</groupId>
<artifactId>fastdfs-client</artifactId>
</dependency>
<!-- Minio -->
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>${minio.version}</version>
</dependency>
<!-- bnyer Api System -->
<dependency>
<groupId>com.dimensionalnode</groupId>
<artifactId>bnyer-api-system</artifactId>
</dependency>
<!-- bnyer Common Swagger -->
<dependency>
<groupId>com.dimensionalnode</groupId>
@ -78,7 +78,15 @@
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger.fox.version}</version>
</dependency>
<dependency>
<groupId>com.qiniu</groupId>
<artifactId>qiniu-java-sdk</artifactId>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.3.0</version>
</dependency>
</dependencies>
<build>
@ -97,5 +105,5 @@
</plugin>
</plugins>
</build>
</project>
</project>

7
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("文件上传失败!");

9
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);
}

248
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<MultipartFile> checkImageFormat(ArrayList<MultipartFile> multipartFiles){
ArrayList<MultipartFile> afterCheckFiles = new ArrayList<>();
for (MultipartFile multipartFile : multipartFiles) {
ArrayList<String> 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<String> 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);
}
}

162
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<String,String> param){
StringBuffer sb = new StringBuffer();
sb.append("<xml>");
for (Map.Entry<String,String> entry : param.entrySet()) {
sb.append("<"+ entry.getKey() +">");
sb.append(entry.getValue());
sb.append("</"+ entry.getKey() +">");
}
sb.append("</xml>");
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;
}
}

9
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

6
bnyer-services/bnyer-img/pom.xml

@ -95,6 +95,12 @@
<artifactId>xxl-job-core</artifactId>
<version>2.1.2</version>
</dependency>
<!--七牛云-->
<dependency>
<groupId>com.qiniu</groupId>
<artifactId>qiniu-java-sdk</artifactId>
<version>7.2.18</version>
</dependency>
</dependencies>
<build>

8
pom.xml

@ -42,6 +42,7 @@
<transmittable-thread-local.version>2.12.2</transmittable-thread-local.version>
<lombok>1.18.12</lombok>
<hutool.version>5.8.0.M3</hutool.version>
<qiniu.version>7.2.18</qiniu.version>
</properties>
<!-- 依赖声明 -->
@ -251,7 +252,12 @@
<artifactId>hutool-all</artifactId>
<version>${hutool.version}</version>
</dependency>
<!--七牛云-->
<dependency>
<groupId>com.qiniu</groupId>
<artifactId>qiniu-java-sdk</artifactId>
<version>${qiniu.version}</version>
</dependency>
</dependencies>
</dependencyManagement>

Loading…
Cancel
Save