package cn.lili.controller.common;
|
|
import cn.hutool.core.text.CharSequenceUtil;
|
import cn.hutool.core.util.StrUtil;
|
import cn.lili.cache.Cache;
|
import cn.lili.common.enums.ResultCode;
|
import cn.lili.common.enums.ResultUtil;
|
import cn.lili.common.exception.ServiceException;
|
import cn.lili.common.security.AuthUser;
|
import cn.lili.common.security.context.UserContext;
|
import cn.lili.common.security.enums.UserEnums;
|
import cn.lili.common.utils.Base64DecodeMultipartFile;
|
import cn.lili.common.utils.CommonUtil;
|
import cn.lili.common.vo.ResultMessage;
|
import cn.lili.modules.file.entity.File;
|
import cn.lili.modules.file.plugin.FilePluginFactory;
|
import cn.lili.modules.file.service.FileService;
|
import cn.lili.modules.system.entity.dos.Setting;
|
import cn.lili.modules.system.entity.enums.SettingEnum;
|
import cn.lili.modules.system.service.SettingService;
|
import io.swagger.annotations.Api;
|
import io.swagger.annotations.ApiOperation;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.multipart.MultipartFile;
|
|
import java.io.InputStream;
|
import java.util.Objects;
|
|
/**
|
* 文件上传接口
|
*
|
* @author Chopper
|
* @since 2020/11/26 15:41
|
*/
|
@Slf4j
|
@RestController
|
@Api(tags = "文件上传接口")
|
@RequestMapping("/common/common/upload")
|
public class UploadController {
|
|
@Autowired
|
private FileService fileService;
|
@Autowired
|
private SettingService settingService;
|
@Autowired
|
private FilePluginFactory filePluginFactory;
|
@Autowired
|
private Cache cache;
|
|
@ApiOperation(value = "文件上传")
|
@PostMapping(value = "/file")
|
public ResultMessage<Object> upload(MultipartFile file,
|
String base64,
|
@RequestHeader String accessToken, @RequestParam String directoryPath) {
|
|
if(StrUtil.isBlank(directoryPath)){
|
directoryPath = "default";
|
}
|
|
AuthUser authUser = UserContext.getAuthUser(cache, accessToken);
|
//如果用户未登录,则无法上传图片
|
if (authUser == null) {
|
throw new ServiceException(ResultCode.USER_AUTHORITY_ERROR);
|
}
|
if (file == null) {
|
throw new ServiceException(ResultCode.FILE_NOT_EXIST_ERROR);
|
}
|
Setting setting = settingService.get(SettingEnum.OSS_SETTING.name());
|
if (setting == null || CharSequenceUtil.isBlank(setting.getSettingValue())) {
|
throw new ServiceException(ResultCode.OSS_NOT_EXIST);
|
}
|
if (CharSequenceUtil.isEmpty(file.getContentType())) {
|
throw new ServiceException(ResultCode.IMAGE_FILE_EXT_ERROR);
|
}
|
|
|
if (!CharSequenceUtil.containsAny(Objects.requireNonNull(file.getContentType()).toLowerCase(), "image", "video")) {
|
throw new ServiceException(ResultCode.FILE_TYPE_NOT_SUPPORT);
|
}
|
|
if (CharSequenceUtil.isNotBlank(base64)) {
|
//base64上传
|
file = Base64DecodeMultipartFile.base64Convert(base64);
|
}
|
String result;
|
String fileKey = CommonUtil.rename(Objects.requireNonNull(file.getOriginalFilename()));
|
File newFile = new File();
|
try {
|
InputStream inputStream = file.getInputStream();
|
//上传至第三方云服务或服务器
|
String scene = UserContext.getCurrentUser().getRole().name();
|
if (StrUtil.equalsAny(UserContext.getCurrentUser().getRole().name(), UserEnums.MEMBER.name(), UserEnums.STORE.name(), UserEnums.SEAT.name())) {
|
scene = scene + "/" + authUser.getId();
|
}
|
fileKey = scene + "/" + directoryPath + "/" + fileKey;
|
//上传至第三方云服务或服务器
|
result = filePluginFactory.filePlugin().inputStreamUpload(inputStream, fileKey);
|
//保存数据信息至数据库
|
newFile.setName(file.getOriginalFilename());
|
newFile.setFileSize(file.getSize());
|
newFile.setFileType(file.getContentType());
|
newFile.setFileKey(fileKey);
|
newFile.setUrl(result);
|
newFile.setCreateBy(authUser.getUsername());
|
newFile.setUserEnums(authUser.getRole().name());
|
//如果是店铺,则记录店铺id
|
if (authUser.getRole().equals(UserEnums.STORE)) {
|
newFile.setOwnerId(authUser.getStoreId());
|
newFile.setOwnerName(authUser.getStoreName());
|
} else {
|
newFile.setOwnerId(authUser.getId());
|
newFile.setOwnerName(authUser.getNickName());
|
}
|
|
//存储文件目录
|
if (StrUtil.isNotEmpty(directoryPath)) {
|
if (directoryPath.indexOf("/") > 0) {
|
newFile.setFileDirectoryId(directoryPath.substring(directoryPath.lastIndexOf("/") + 1));
|
} else {
|
newFile.setFileDirectoryId(directoryPath);
|
}
|
}
|
fileService.save(newFile);
|
} catch (Exception e) {
|
log.error("文件上传失败", e);
|
throw new ServiceException(ResultCode.OSS_EXCEPTION_ERROR);
|
}
|
return ResultUtil.data(result);
|
}
|
}
|