package com.fjhx.file.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fjhx.file.entity.*;
import com.fjhx.file.mapper.FileInfoMapper;
import com.fjhx.file.service.FileInfoService;
import com.obs.services.ObsClient;
import com.obs.services.model.PostSignatureRequest;
import com.obs.services.model.PostSignatureResponse;
import com.ruoyi.common.constant.BaseSourceConstant;
import com.ruoyi.common.core.domain.BaseIdPo;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.wrapper.IWrapper;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.io.File;
import java.util.*;
import java.util.stream.Collectors;
/**
*
* 文件表 服务实现类
*
*
* @author zlj
* @since 2023-03-14
*/
@Service
public class FileInfoServiceImpl extends ServiceImpl implements FileInfoService {
@Value("${obs.ak}")
private String ak;
@Value("${obs.sk}")
private String sk;
@Value("${obs.endPoint}")
private String endPoint;
@Value("${obs.url}")
private String url;
@Value("${obs.bucketName}")
private String bucketName;
@Value("${spring.profiles.active}")
private String active;
@Value("${ruoyi.name}")
private String name;
@Override
public SingVo getSing(SingDto dto) {
String fileName = dto.getFileName();
if (fileName.length() > 100) {
throw new ServiceException("文件名过长,请缩短后重试!!!");
}
SingVo singVo = new SingVo();
// 文件后缀名
String suffix = FileUtil.getSuffix(dto.getFileName());
// 文件路径
String objectKey = new StringJoiner("/")
.add(name)
.add(active)
.add(DateUtil.format(new Date(), "yyyy/MM/dd"))
.add(IdUtil.fastSimpleUUID() + (ObjectUtil.isEmpty(suffix) ? "" : "." + suffix))
.toString();
ObsClient obsClient = null;
try {
// 获取oss链接客户端
obsClient = getObsClient();
// 指定签名有效期为10秒
long currentTimeMillis = System.currentTimeMillis() + 1000 * 10;
// 获取签名
PostSignatureRequest request = new PostSignatureRequest(currentTimeMillis, bucketName, objectKey);
PostSignatureResponse temporarySignature = obsClient.createPostSignature(request);
// 封装签名
Map body = new LinkedHashMap<>();
body.put("policy", temporarySignature.getPolicy());
body.put("AccessKeyId", ak);
body.put("signature", temporarySignature.getSignature());
body.put("key", objectKey);
singVo.setUploadBody(body);
} catch (Exception e) {
throw new ServiceException("获取签名失败");
} finally {
IoUtil.close(obsClient);
}
// 保存文件
FileInfo fileInfo = new FileInfo();
fileInfo.setFileUrl(objectKey);
fileInfo.setFileName(dto.getFileName());
save(fileInfo);
// 封装文件信息
singVo.setUploadUrl("https://" + bucketName + "." + endPoint);
singVo.setId(fileInfo.getId());
singVo.setFileName(dto.getFileName());
singVo.setFileUrl(url + objectKey);
return singVo;
}
@DS(BaseSourceConstant.BASE)
@Override
public Map> getList(FileInfoSelectDto dto) {
if (ObjectUtil.isEmpty(dto.getBusinessIdList())) {
return new HashMap<>();
}
IWrapper