Commit 1ed5c8ba by zwb

添加简历头像文件上传

parent 9766577f
package org.dromara.common.core.utils;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public final class MD5 {
public static String encrypt(String strSrc) {
try {
char hexChars[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8',
'9', 'a', 'b', 'c', 'd', 'e', 'f' };
byte[] bytes = strSrc.getBytes();
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(bytes);
bytes = md.digest();
int j = bytes.length;
char[] chars = new char[j * 2];
int k = 0;
for (int i = 0; i < bytes.length; i++) {
byte b = bytes[i];
chars[k++] = hexChars[b >>> 4 & 0xf];
chars[k++] = hexChars[b & 0xf];
}
return new String(chars);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
throw new RuntimeException("MD5加密出错!!+" + e);
}
}
public static void main(String[] args) {
String msg = "{\"liveRoomId\":1,\"msgContent\":1,\"msgType\":\"4\",\"timestamp\":1679969941853}";
System.out.println(msg);
msg = msg.replaceAll("\\\\", "");
System.out.println(msg);
System.out.println(MD5.encrypt("111111"));
}
}
\ No newline at end of file
package com.bkty.system.controller;
import com.alibaba.nacos.common.utils.StringUtils;
import com.bkty.system.service.comm.CommService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.enums.FileTypeEnum;
import org.dromara.common.core.exception.WarnException;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping(value = "/comm", method = RequestMethod.POST)
@Tag(description = "comm", name = "通用接口")
public class CommController {
private final CommService commService;
/**
* 文件上传返回minio链接
*/
@PostMapping("/fileUpload")
public R fileUpload(@RequestParam("file") MultipartFile file) {
validateFile(file);
return new R<>(commService.fileUpload(file));
}
public void validateFile(MultipartFile file) {
String filename = file.getOriginalFilename();
if (StringUtils.isBlank(filename)) {
throw new WarnException("文件不能为空");
}
String suffix = filename.substring(filename.lastIndexOf('.') + 1);
long fileSize = file.getSize();
FileTypeEnum typeEnum = getFileTypeEnumBySuffix(suffix.toLowerCase());
if (typeEnum == null) {
throw new WarnException("不支持的文件类型");
}
if (typeEnum.getMaxSize() < fileSize) {
throw new WarnException("超过了最大文件大小" + ":" + typeEnum.getSizeDescription());
}
}
public FileTypeEnum getFileTypeEnumBySuffix(String suffix) {
if (StringUtils.isBlank(suffix)) {
return null;
}
return FileTypeEnum.getEnumBySuffix(suffix);
}
/**
* 上传文件到扣子
*/
// @PostMapping("/agentFileUpload")
// public R agentFileUpload(@RequestParam("file") MultipartFile file) throws Exception {
// validateFile(file);
//
// return new R<>(commService.agentFileUpload(file));
// }
@Operation(summary = "头像文件上传")
@PostMapping("avatarUpload")
public R<String> avatarUpload(@RequestParam("avatarFile") MultipartFile avatarFile) {
String fileUrl = commService.avatarUpload(avatarFile);
return new R<>(fileUrl);
}
}
\ No newline at end of file
......@@ -18,4 +18,11 @@ public interface CommService {
* 上传文件到扣子
*/
String agentFileUpload(byte[] fileBytes,String fileName) throws Exception;
/**
* 头像文件上传
* @param avatarFile
* @return
*/
String avatarUpload(MultipartFile avatarFile);
}
......@@ -6,16 +6,18 @@ import com.alibaba.fastjson2.JSONObject;
import com.bkty.system.config.MinioProperties;
import com.bkty.system.service.comm.CommService;
import com.bkty.system.service.coze.CozeApiService;
import io.minio.PutObjectArgs;
import io.minio.StatObjectArgs;
import io.minio.errors.ErrorResponseException;
import org.dromara.common.core.constant.Constants;
import com.bkty.system.utils.MinioUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.constant.CozeConstsnts;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.dromara.common.core.exception.WarnException;
import org.dromara.common.core.utils.MD5;
import org.springframework.http.HttpHeaders;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.multipart.MultipartFile;
import java.util.UUID;
......@@ -75,6 +77,46 @@ public class CommServiceImpl implements CommService {
}
return "";
}
@Override
public String avatarUpload(MultipartFile avatarFile) {
try {
// 1.根据文件对象获取文件的字节数组
byte[] bytes = avatarFile.getBytes();
// 2.堆文件的字节数组进行MD5处理,保证同一内容的文件在minio中只保存一份
String bytesToString = new String(bytes);
//用文件内容加密后得到的字符串做文件名前缀
String prefixEncrypt = MD5.encrypt(bytesToString);
//截取原文件名的后缀
String suffix = avatarFile.getOriginalFilename().substring(avatarFile.getOriginalFilename().lastIndexOf("."), avatarFile.getOriginalFilename().length());
String objectName = "avatar/" +prefixEncrypt + suffix;
//3.查询minio的缓存
StatObjectArgs.Builder statBuilder = StatObjectArgs.builder();
StatObjectArgs statObjectArgs = statBuilder.bucket(minioTemplate.getBucket()).object(objectName).build();
//该文件内容相同的对象是否在桶中
try {
// 尝试获取对象信息,如果存在则直接返回URL(避免重复上传)
minioUtils.statObject(statObjectArgs);
return minioTemplate.getUrl()+"/"+minioTemplate.getBucket() + objectName;
} catch (ErrorResponseException e) {
log.info("上传文件不存在,可以上传");
}
//4.上传对象到minio桶中
PutObjectArgs.Builder builder = PutObjectArgs.builder();
PutObjectArgs putObjectArgs = builder.bucket(minioTemplate.getBucket()).object(objectName).stream(avatarFile.getInputStream(), avatarFile.getSize(), -1).build();
minioUtils.putObject(putObjectArgs);
log.info("上传图片文件到minio成功..");
return minioTemplate.getUrl()+"/"+minioTemplate.getBucket() + objectName;
} catch (Exception e) {
log.error("头像上传到minio失败,原因:",e.getMessage());
throw new WarnException("头像上传到minio失败",e);
}
}
}
......
......@@ -2,6 +2,7 @@ package com.bkty.system.utils;
import com.bkty.system.config.MinioProperties;
import io.minio.*;
import io.minio.errors.*;
import io.minio.http.Method;
import io.minio.messages.Bucket;
import io.minio.messages.DeleteError;
......@@ -14,8 +15,11 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Paths;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.*;
/**
......@@ -308,4 +312,40 @@ public class MinioUtils {
return "application/octet-stream"; // 默认类型
}
}
/**
* 尝试获取对象信息
* @param args
* @return
* @throws ErrorResponseException
* @throws InsufficientDataException
* @throws InternalException
* @throws InvalidKeyException
* @throws InvalidResponseException
* @throws IOException
* @throws NoSuchAlgorithmException
* @throws ServerException
* @throws XmlParserException
*/
public StatObjectResponse statObject(StatObjectArgs args) throws ErrorResponseException, InsufficientDataException, InternalException, InvalidKeyException, InvalidResponseException, IOException, NoSuchAlgorithmException, ServerException, XmlParserException {
return client.statObject(args);
}
/**
* 使用文件流上传
* @param args
* @return
* @throws ErrorResponseException
* @throws InsufficientDataException
* @throws InternalException
* @throws InvalidKeyException
* @throws InvalidResponseException
* @throws IOException
* @throws NoSuchAlgorithmException
* @throws ServerException
* @throws XmlParserException
*/
public ObjectWriteResponse putObject(PutObjectArgs args) throws ErrorResponseException, InsufficientDataException, InternalException, InvalidKeyException, InvalidResponseException, IOException, NoSuchAlgorithmException, ServerException, XmlParserException {
return client.putObject(args);
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment