base64图片上传

This commit is contained in:
tqzhang 2025-02-12 16:48:02 +08:00
parent 7c8e5eb3b0
commit dfec21bbd6
11 changed files with 641 additions and 0 deletions

View File

@ -0,0 +1,75 @@
package com.bonus.core.common.core.util;
import cn.hutool.core.codec.Base64;
import cn.hutool.core.io.FileUtil;
import org.springframework.web.multipart.MultipartFile;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
public class Base64DecodedMultipartFile implements MultipartFile {
private final byte[] imgContent;
private final String header;
public Base64DecodedMultipartFile(byte[] imgContent, String header) {
this.imgContent = imgContent;
this.header = header.split(";")[0];
}
public static MultipartFile base64ToMultipart(String base64) {
String[] baseSplit = base64.split(",");
byte[] b = Base64.decode(baseSplit[1]);
for(int i = 0; i < b.length; ++i) {
if (b[i] < 0) {
b[i] = (byte)(b[i] + 256);
}
}
return new Base64DecodedMultipartFile(b, baseSplit[0]);
}
@Override
public String getName() {
double var10000 = (double)System.currentTimeMillis() + Math.random();
return "" + var10000 + "." + this.header.split("/")[1];
}
@Override
public String getOriginalFilename() {
long var10000 = System.currentTimeMillis() + (long)((int)(Math.random() * 10000.0));
return "" + var10000 + "." + this.header.split("/")[1];
}
@Override
public String getContentType() {
return this.header.split(":")[1];
}
@Override
public boolean isEmpty() {
return this.imgContent == null || this.imgContent.length == 0;
}
@Override
public long getSize() {
return (long)this.imgContent.length;
}
@Override
public byte[] getBytes() throws IOException {
return this.imgContent;
}
@Override
public InputStream getInputStream() {
return new ByteArrayInputStream(this.imgContent);
}
@Override
public void transferTo(File dest) throws IOException, IllegalStateException {
FileUtil.writeBytes(this.imgContent, dest);
}
}

View File

@ -0,0 +1,90 @@
package com.bonus.core.common.enums;
import java.util.ArrayList;
import java.util.List;
public enum FileNameSuffixEnum {
FILE_TYPE_JPG("jpg", "JPG"),
FILE_TYPE_JPEG("jpeg", "JPEG"),
FILE_TYPE_GIF("gif", "GIF"),
FILE_TYPE_BMP("bmp", "BMP"),
FILE_TYPE_PNG("png", "PNG"),
FILE_TYPE_APK("apk", "APK"),
FILE_TYPE_BIN("bin", "BIN"),
FILE_TYPE_PFX("pfx", "PFX"),
FILE_TYPE_CRT("crt", "CRT"),
FILE_TYPE_CER("cer", "CER"),
FILE_TYPE_KEY("key", "KER"),
FILE_TYPE_P12("p12", "P12"),
FILE_TYPE_ZIP("zip", "ZIP"),
FILE_TYPE_TXT("txt", "TXT"),
FILE_TYPE_MP4("mp4", "MP4"),
FILE_TYPE_AVI("avi", "AVI"),
FILE_TYPE_FLV("flv", "FLV"),
FILE_TYPE_MKV("mkv", "MKV"),
FILE_TYPE_MOV("mov", "MOV"),
FILE_TYPE_RMVB("rmvb", "RMVB"),
FILE_TYPE_WMV("wmv", "WMV"),
FILE_TYPE_ICO("ico", "ICO");
private final String key;
private final String desc;
private FileNameSuffixEnum(String key, String desc) {
this.key = key;
this.desc = desc;
}
public static List<String> getImgNameList() {
List<String> imgNameList = new ArrayList();
imgNameList.add(FILE_TYPE_JPG.getDesc());
imgNameList.add(FILE_TYPE_JPEG.getDesc());
imgNameList.add(FILE_TYPE_GIF.getDesc());
imgNameList.add(FILE_TYPE_BMP.getDesc());
imgNameList.add(FILE_TYPE_PNG.getDesc());
return imgNameList;
}
public static List<String> getPhotoNameList() {
List<String> imgNameList = new ArrayList();
imgNameList.add(FILE_TYPE_JPG.getDesc());
imgNameList.add(FILE_TYPE_JPEG.getDesc());
imgNameList.add(FILE_TYPE_PNG.getDesc());
return imgNameList;
}
public static List<String> getAllFileNameList() {
List<String> fileNameList = getImgNameList();
fileNameList.add(FILE_TYPE_APK.getDesc());
fileNameList.add(FILE_TYPE_BIN.getDesc());
fileNameList.add(FILE_TYPE_PFX.getDesc());
fileNameList.add(FILE_TYPE_CRT.getDesc());
fileNameList.add(FILE_TYPE_CER.getDesc());
fileNameList.add(FILE_TYPE_KEY.getKey());
fileNameList.add(FILE_TYPE_P12.getDesc());
fileNameList.add(FILE_TYPE_TXT.getDesc());
fileNameList.add(FILE_TYPE_ZIP.getDesc());
fileNameList.add(FILE_TYPE_ICO.getDesc());
fileNameList.add(FILE_TYPE_MP4.getDesc());
fileNameList.add(FILE_TYPE_AVI.getDesc());
fileNameList.add(FILE_TYPE_FLV.getDesc());
fileNameList.add(FILE_TYPE_MKV.getDesc());
fileNameList.add(FILE_TYPE_MOV.getDesc());
fileNameList.add(FILE_TYPE_RMVB.getDesc());
fileNameList.add(FILE_TYPE_WMV.getDesc());
return fileNameList;
}
public String getKey() {
return this.key;
}
public String getDesc() {
return this.desc;
}
// $FF: synthetic method
private static FileNameSuffixEnum[] $values() {
return new FileNameSuffixEnum[]{FILE_TYPE_JPG, FILE_TYPE_JPEG, FILE_TYPE_GIF, FILE_TYPE_BMP, FILE_TYPE_PNG, FILE_TYPE_APK, FILE_TYPE_BIN, FILE_TYPE_PFX, FILE_TYPE_CRT, FILE_TYPE_CER, FILE_TYPE_KEY, FILE_TYPE_P12, FILE_TYPE_ZIP, FILE_TYPE_TXT, FILE_TYPE_MP4, FILE_TYPE_AVI, FILE_TYPE_FLV, FILE_TYPE_MKV, FILE_TYPE_MOV, FILE_TYPE_RMVB, FILE_TYPE_WMV, FILE_TYPE_ICO};
}
}

View File

@ -0,0 +1,96 @@
package com.bonus.core.common.enums;
import java.util.ArrayList;
import java.util.List;
public enum FileUploadSourceEnum {
DISHES("dishes", "菜品"),
CUST("cust", "人员"),
TABLE("table", "餐桌"),
FACE("face", "人脸识别"),
PLACE("place", "位置信息"),
STALL("stall", "档口信息"),
SYSTEM("system", "系统"),
ANDROID_APK("androidapk", "安卓apk"),
ABC_MERCHANT_CERT_FILE("abccertfile", "农行商户证书"),
SZRCB_PFX_FILE("szrcbpfxfile", "苏州农商行证书"),
ANDROID_MENU_SELECT("androidmenuselect", "菜品识别采集"),
EVALUATE("evaluate", "订单评价"),
MATERIAL("material", "出入库原料"),
SUPPLIER("supplier", "供应商资质信息"),
COUPON("coupon", "餐券图片"),
QUOTATION("quotation", "报价图片"),
BACK_STAFF("backStaff", "后场人员"),
DEVICE_LOG("leniu_device_log", "设备文件日志6608和6609专用"),
ORDER_PLACE("orderPlace", "下单照片"),
DEVICE_LOGINFO("deviceLogInfo", "设备日志上传"),
DEVICE_UPDATE_ADMIN("deviceUpdateAdmin", "设备更新"),
DEVICE_VIDEO("deviceVideo", "设备操作录像"),
DEVICE_PIC("devicePic", "设备操作拍照"),
SAMPLE("sample", "留样");
private final String key;
private final String value;
private FileUploadSourceEnum(String key, String value) {
this.key = key;
this.value = value;
}
public static String getKey(String value) {
FileUploadSourceEnum[] fileUploadSourceEnumList = values();
FileUploadSourceEnum[] var2 = fileUploadSourceEnumList;
int var3 = fileUploadSourceEnumList.length;
for(int var4 = 0; var4 < var3; ++var4) {
FileUploadSourceEnum fileUploadSourceEnum = var2[var4];
if (fileUploadSourceEnum.value().equals(value)) {
return fileUploadSourceEnum.key();
}
}
return null;
}
public static String getValue(String key) {
FileUploadSourceEnum[] fileUploadSourceEnumList = values();
FileUploadSourceEnum[] var2 = fileUploadSourceEnumList;
int var3 = fileUploadSourceEnumList.length;
for(int var4 = 0; var4 < var3; ++var4) {
FileUploadSourceEnum fileUploadSourceEnum = var2[var4];
if (fileUploadSourceEnum.key().equals(key)) {
return fileUploadSourceEnum.value();
}
}
return null;
}
public static List<String> getAllEnumsKeyList() {
FileUploadSourceEnum[] fileUploadSourceEnumList = values();
List<String> uploadKeyList = new ArrayList();
FileUploadSourceEnum[] var2 = fileUploadSourceEnumList;
int var3 = fileUploadSourceEnumList.length;
for(int var4 = 0; var4 < var3; ++var4) {
FileUploadSourceEnum fileUploadSourceEnum = var2[var4];
uploadKeyList.add(fileUploadSourceEnum.key);
}
return uploadKeyList;
}
public String key() {
return this.key;
}
public String value() {
return this.value;
}
// $FF: synthetic method
private static FileUploadSourceEnum[] $values() {
return new FileUploadSourceEnum[]{DISHES, CUST, TABLE, FACE, PLACE, STALL, SYSTEM, ANDROID_APK, ABC_MERCHANT_CERT_FILE, SZRCB_PFX_FILE, ANDROID_MENU_SELECT, EVALUATE, MATERIAL, SUPPLIER, COUPON, QUOTATION, BACK_STAFF, DEVICE_LOG, ORDER_PLACE, DEVICE_LOGINFO, DEVICE_UPDATE_ADMIN, DEVICE_VIDEO, DEVICE_PIC, SAMPLE};
}
}

View File

@ -0,0 +1,58 @@
package com.bonus.core.common.sysfile.controller;
import com.bonus.common.core.web.controller.BaseController;
import com.bonus.common.core.web.domain.AjaxResult;
import com.bonus.core.common.core.util.Base64DecodedMultipartFile;
import com.bonus.core.common.enums.FileNameSuffixEnum;
import com.bonus.core.common.enums.FileUploadSourceEnum;
import com.bonus.core.common.sysfile.dto.SysFileUploadDTO;
import com.bonus.core.common.sysfile.service.SysFileService;
import com.bonus.core.common.sysfile.vo.SysFileUploadVO;
import com.bonus.encrypt.RequiresGuest;
import com.bonus.utils.LeRequest;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.validation.Valid;
import java.util.List;
@RestController
@RequestMapping({"/api/v1/sysfile"})
@Api(
value = "sysfile",
tags = {"文件管理"}
)
public class SysFileController{
private static final Logger log = LoggerFactory.getLogger(SysFileController.class);
private final SysFileService sysFileService;
@PostMapping({"/upload/base64"})
@RequiresGuest
@ApiOperation("base64文件上传")
public AjaxResult upload(@RequestBody @Valid SysFileUploadDTO dto) {
MultipartFile file = Base64DecodedMultipartFile.base64ToMultipart(dto.getBase64File());
String suffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".") + 1);
if (!FileNameSuffixEnum.getAllFileNameList().contains(suffix.toUpperCase())) {
return AjaxResult.error("接收参数错误,请上传正确的文件格式");
} else {
String uploadKey = dto.getUploadKey();
List<String> uploadKeyList = FileUploadSourceEnum.getAllEnumsKeyList();
if (!uploadKeyList.contains(uploadKey)) {
return AjaxResult.error("目前只支持指定文件路径的上传,请重试 ^_^");
} else {
SysFileUploadVO result = this.sysFileService.uploadFile(file, uploadKey);
return AjaxResult.success("上传成功", result);
}
}
}
public SysFileController(final SysFileService sysFileService) {
this.sysFileService = sysFileService;
}
}

View File

@ -0,0 +1,34 @@
package com.bonus.core.common.sysfile.dto;
import io.swagger.annotations.ApiModelProperty;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;
public class SysFileUploadDTO implements Serializable {
@ApiModelProperty("base64文件")
private @NotBlank(
message = "base64文件不能为空 ^_^"
) String base64File;
@ApiModelProperty("上传标识")
private @NotBlank(
message = "上传标识不能为空 ^_^"
) String uploadKey;
public String getBase64File() {
return this.base64File;
}
public String getUploadKey() {
return this.uploadKey;
}
public void setBase64File(final String base64File) {
this.base64File = base64File;
}
public void setUploadKey(final String uploadKey) {
this.uploadKey = uploadKey;
}
}

View File

@ -0,0 +1,10 @@
package com.bonus.core.common.sysfile.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.bonus.core.common.sysfile.model.SysFile;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface SysFileMapper extends BaseMapper<SysFile> {
}

View File

@ -0,0 +1,130 @@
package com.bonus.core.common.sysfile.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.time.LocalDateTime;
@ApiModel("文件")
public class SysFile extends Model<SysFile> {
private static final long serialVersionUID = 1L;
@TableId(
type = IdType.AUTO
)
@ApiModelProperty("文件编号")
private Long id;
@ApiModelProperty("文件名")
private String fileName;
@ApiModelProperty("原始文件名")
private String original;
@ApiModelProperty("存储桶名称")
private String bucketName;
@ApiModelProperty("文件类型")
private String type;
@ApiModelProperty("文件大小")
private Long fileSize;
@ApiModelProperty("创建者")
private String createUser;
@ApiModelProperty("创建时间")
private LocalDateTime createTime;
@ApiModelProperty("更新者")
private String updateUser;
@ApiModelProperty("更新时间")
private LocalDateTime updateTime;
@TableLogic
@ApiModelProperty("删除标记,1:已删除,0:正常")
private Integer delFlag;
public Long getId() {
return this.id;
}
public String getFileName() {
return this.fileName;
}
public String getOriginal() {
return this.original;
}
public String getBucketName() {
return this.bucketName;
}
public String getType() {
return this.type;
}
public Long getFileSize() {
return this.fileSize;
}
public String getCreateUser() {
return this.createUser;
}
public LocalDateTime getCreateTime() {
return this.createTime;
}
public String getUpdateUser() {
return this.updateUser;
}
public LocalDateTime getUpdateTime() {
return this.updateTime;
}
public Integer getDelFlag() {
return this.delFlag;
}
public void setId(final Long id) {
this.id = id;
}
public void setFileName(final String fileName) {
this.fileName = fileName;
}
public void setOriginal(final String original) {
this.original = original;
}
public void setBucketName(final String bucketName) {
this.bucketName = bucketName;
}
public void setType(final String type) {
this.type = type;
}
public void setFileSize(final Long fileSize) {
this.fileSize = fileSize;
}
public void setCreateUser(final String createUser) {
this.createUser = createUser;
}
public void setCreateTime(final LocalDateTime createTime) {
this.createTime = createTime;
}
public void setUpdateUser(final String updateUser) {
this.updateUser = updateUser;
}
public void setUpdateTime(final LocalDateTime updateTime) {
this.updateTime = updateTime;
}
public void setDelFlag(final Integer delFlag) {
this.delFlag = delFlag;
}
}

View File

@ -0,0 +1,12 @@
package com.bonus.core.common.sysfile.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.bonus.core.common.sysfile.model.SysFile;
import com.bonus.core.common.sysfile.vo.SysFileUploadVO;
import org.springframework.web.multipart.MultipartFile;
public interface SysFileService extends IService<SysFile> {
SysFileUploadVO uploadFile(MultipartFile file, String uploadKey);
}

View File

@ -0,0 +1,82 @@
package com.bonus.core.common.sysfile.service.impl;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.IdUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bonus.common.core.exception.ServiceException;
import com.bonus.core.common.enums.FileUploadSourceEnum;
import com.bonus.core.common.sysfile.mapper.SysFileMapper;
import com.bonus.core.common.sysfile.model.SysFile;
import com.bonus.core.common.sysfile.service.SysFileService;
import com.bonus.core.common.sysfile.vo.SysFileUploadVO;
import com.bonus.core.common.utils.TenantContextHolder;
import com.bonus.oss.OssProperties;
import com.bonus.oss.service.OssTemplate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
@Service
public class SysFileServiceImpl extends ServiceImpl<SysFileMapper, SysFile> implements SysFileService {
private static final Logger log = LoggerFactory.getLogger(SysFileServiceImpl.class);
@Resource
@Lazy
private OssProperties ossProperties;
@Resource
@Lazy
private OssTemplate minioTemplate;
@Override
public SysFileUploadVO uploadFile(MultipartFile file, String uploadKey) {
Long merchantId = TenantContextHolder.getTenantId();
String merchantIdString;
if (merchantId != null && merchantId != -1L && merchantId != 1L) {
merchantIdString = String.valueOf(merchantId);
} else {
merchantIdString = "unknown";
}
String fileName;
if (FileUploadSourceEnum.DEVICE_LOG.key().equalsIgnoreCase(uploadKey)) {
fileName = file.getOriginalFilename();
} else {
String var10000 = IdUtil.simpleUUID();
fileName = var10000 + "." + FileUtil.extName(file.getOriginalFilename());
}
String fileUrl = merchantIdString + "/" + uploadKey + "/" + fileName;
SysFileUploadVO result = new SysFileUploadVO();
String bucketName = this.ossProperties.getBucketName();
String fileNameUrl = "/" + bucketName + "/" + fileUrl;
result.setBucketName(bucketName);
result.setFileNameUrl(fileNameUrl);
result.setUrl(String.format("/admin/api/v1/sysfile/%s/%s", bucketName, fileUrl));
result.setOriginalFileName(file.getOriginalFilename());
try {
this.minioTemplate.putObject(bucketName, fileUrl, file.getInputStream());
this.fileLog(file, fileUrl);
return result;
} catch (Exception var11) {
log.error("***上传失败", var11);
throw new ServiceException("上传失败!!!");
}
}
private void fileLog(MultipartFile file, String fileName) {
SysFile sysFile = new SysFile();
String original = file.getOriginalFilename();
sysFile.setFileName(fileName);
sysFile.setOriginal(original);
sysFile.setFileSize(file.getSize());
sysFile.setType(FileUtil.extName(original));
sysFile.setBucketName(this.ossProperties.getBucketName());
sysFile.setCreateUser("");
this.save(sysFile);
}
}

View File

@ -0,0 +1,50 @@
package com.bonus.core.common.sysfile.vo;
import com.bonus.core.common.utils.SysUtil;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@ApiModel("文件上传")
public class SysFileUploadVO {
@ApiModelProperty("存储桶名称")
private String bucketName;
@ApiModelProperty("文件下载路径")
private String fileNameUrl;
@ApiModelProperty("请求路径")
private String url;
@ApiModelProperty("原始文件名")
private String originalFileName;
public String getFileNameUrl() {
return SysUtil.getCutFileUrl(this.fileNameUrl);
}
public String getBucketName() {
return this.bucketName;
}
public String getUrl() {
return this.url;
}
public String getOriginalFileName() {
return this.originalFileName;
}
public void setBucketName(final String bucketName) {
this.bucketName = bucketName;
}
public void setFileNameUrl(final String fileNameUrl) {
this.fileNameUrl = fileNameUrl;
}
public void setUrl(final String url) {
this.url = url;
}
public void setOriginalFileName(final String originalFileName) {
this.originalFileName = originalFileName;
}
}

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.bonus.core.common.sysfile.mapper.SysFileMapper">
</mapper>