package cn.stylefeng.guns.sys.modular.rest.service; import cn.hutool.core.codec.Base64; import cn.hutool.core.io.IoUtil; import cn.stylefeng.guns.base.auth.context.LoginContextHolder; import cn.stylefeng.guns.base.auth.model.LoginUser; import cn.stylefeng.guns.base.consts.ConstantsContext; import cn.stylefeng.guns.sys.core.constant.DefaultAvatar; import cn.stylefeng.guns.sys.core.exception.enums.BizExceptionEnum; import cn.stylefeng.guns.sys.modular.rest.entity.RestFileInfo; import cn.stylefeng.guns.sys.modular.rest.entity.RestUser; import cn.stylefeng.guns.sys.modular.rest.mapper.RestFileInfoMapper; import cn.stylefeng.roses.core.util.ToolUtil; import cn.stylefeng.roses.kernel.model.exception.ServiceException; import cn.stylefeng.roses.kernel.model.exception.enums.CoreExceptionEnum; import com.baomidou.mybatisplus.core.toolkit.IdWorker; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.math.BigDecimal; /** *

* 文件信息表 * 服务实现类 *

* * @author stylefeng * @since 2018-12-07 */ @Service @Slf4j public class RestFileInfoService extends ServiceImpl { @Resource private RestUserService restUserService; /** * 更新头像 * * @author fengshuonan * @Date 2018/11/10 4:10 PM */ @Transactional(rollbackFor = Exception.class) public void updateAvatar(String fileId) { LoginUser currentUser = LoginContextHolder.getContext().getUser(); if (currentUser == null) { throw new ServiceException(CoreExceptionEnum.NO_CURRENT_USER); } RestUser user = restUserService.getById(currentUser.getId()); //更新用户的头像 user.setAvatar(fileId); restUserService.updateById(user); } /** * 预览当前用户头像 * * @author fengshuonan * @Date 2019-05-04 17:04 */ public byte[] previewAvatar() { //获取当前用户 LoginUser currentUser = LoginContextHolder.getContext().getUser(); if (currentUser == null) { throw new ServiceException(CoreExceptionEnum.NO_CURRENT_USER); } //获取当前用户的头像id RestUser user = restUserService.getById(currentUser.getId()); String avatarFileId = user.getAvatar(); try { //返回头像id的字节流 return getFileBytes(avatarFileId); } catch (Exception e) { //返回默认头像 return Base64.decode(DefaultAvatar.BASE_64_AVATAR); } } /** * 获取文件流 * * @author fengshuonan * @Date 2019-05-04 17:04 */ public byte[] getFileBytes(String fileId) { if (ToolUtil.isEmpty(fileId)) { throw new ServiceException(BizExceptionEnum.FILE_NOT_FOUND); } RestFileInfo fileInfo = this.getById(fileId); if (fileInfo == null) { throw new ServiceException(BizExceptionEnum.FILE_NOT_FOUND); } else { try { String filePath = fileInfo.getFilePath(); return IoUtil.readBytes(new FileInputStream(filePath)); } catch (FileNotFoundException e) { log.error("文件未找到,id为:" + fileId, e); throw new ServiceException(BizExceptionEnum.FILE_NOT_FOUND); } } } /** * 上传文件 * * @author fengshuonan * @Date 2019-05-04 17:18 */ public String uploadFile(MultipartFile file) { //生成文件的唯一id String fileId = IdWorker.getIdStr(); //获取文件后缀 String fileSuffix = ToolUtil.getFileSuffix(file.getOriginalFilename()); //获取文件原始名称 String originalFilename = file.getOriginalFilename(); //生成文件的最终名称 String finalName = fileId + "." + ToolUtil.getFileSuffix(originalFilename); try { //保存文件到指定目录 String fileSavePath = ConstantsContext.getFileUploadPath(); File newFile = new File(fileSavePath + finalName); file.transferTo(newFile); //保存文件信息 RestFileInfo fileInfo = new RestFileInfo(); fileInfo.setFileId(fileId); fileInfo.setFileName(originalFilename); fileInfo.setFileSuffix(fileSuffix); fileInfo.setFilePath(fileSavePath + finalName); fileInfo.setFinalName(finalName); //计算文件大小kb long kb = new BigDecimal(file.getSize()) .divide(BigDecimal.valueOf(1024)) .setScale(0, BigDecimal.ROUND_HALF_UP).longValue(); fileInfo.setFileSizeKb(kb); this.save(fileInfo); } catch (Exception e) { log.error("上传文件错误!", e); throw new ServiceException(BizExceptionEnum.UPLOAD_ERROR); } return fileId; } }