@ -1,6 +1,9 @@
package com.ruoyi.system.service.impl ;
import cn.hutool.core.convert.Convert ;
import cn.hutool.core.util.ObjectUtil ;
import cn.hutool.http.HttpException ;
import cn.hutool.http.HttpUtil ;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper ;
import com.baomidou.mybatisplus.core.toolkit.Wrappers ;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page ;
@ -8,10 +11,13 @@ import com.ruoyi.common.constant.CacheNames;
import com.ruoyi.common.core.domain.PageQuery ;
import com.ruoyi.common.core.page.TableDataInfo ;
import com.ruoyi.common.exception.ServiceException ;
import com.ruoyi.common.utils.BeanCopyUtils ;
import com.ruoyi.common.utils.StringUtils ;
import com.ruoyi.common.utils.file.FileUtils ;
import com.ruoyi.common.utils.spring.SpringUtils ;
import com.ruoyi.oss.core.OssClient ;
import com.ruoyi.oss.entity.UploadResult ;
import com.ruoyi.oss.enumd.AccessPolicyType ;
import com.ruoyi.oss.factory.OssFactory ;
import com.ruoyi.system.domain.SysOss ;
import com.ruoyi.system.domain.bo.SysOssBo ;
@ -20,14 +26,17 @@ import com.ruoyi.system.mapper.SysOssMapper;
import com.ruoyi.system.service.ISysOssService ;
import lombok.RequiredArgsConstructor ;
import org.springframework.cache.annotation.Cacheable ;
import org.springframework.http.MediaType ;
import org.springframework.stereotype.Service ;
import org.springframework.web.multipart.MultipartFile ;
import javax.servlet.http.HttpServletResponse ;
import java.io.IOException ;
import java.util.ArrayList ;
import java.util.Collection ;
import java.util.List ;
import java.util.Map ;
import java.util.stream.Collectors ;
/**
* 文件上传 服务层实现
@ -44,6 +53,8 @@ public class SysOssServiceImpl implements ISysOssService {
public TableDataInfo < SysOssVo > queryPageList ( SysOssBo bo , PageQuery pageQuery ) {
LambdaQueryWrapper < SysOss > lqw = buildQueryWrapper ( bo ) ;
Page < SysOssVo > result = baseMapper . selectVoPage ( pageQuery . build ( ) , lqw ) ;
List < SysOssVo > filterResult = result . getRecords ( ) . stream ( ) . map ( this : : matchingUrl ) . collect ( Collectors . toList ( ) ) ;
result . setRecords ( filterResult ) ;
return TableDataInfo . build ( result ) ;
}
@ -53,7 +64,7 @@ public class SysOssServiceImpl implements ISysOssService {
for ( Long id : ossIds ) {
SysOssVo vo = SpringUtils . getAopProxy ( this ) . getById ( id ) ;
if ( ObjectUtil . isNotNull ( vo ) ) {
list . add ( vo ) ;
list . add ( this . matchingUrl ( vo ) ) ;
}
}
return list ;
@ -80,7 +91,28 @@ public class SysOssServiceImpl implements ISysOssService {
}
@Override
public SysOss up load( MultipartFile file ) {
public void down load( Long ossId , HttpServletResponse response ) throws IOException {
SysOssVo sysOss = this . matchingUrl ( SpringUtils . getAopProxy ( this ) . getById ( ossId ) ) ;
if ( ObjectUtil . isNull ( sysOss ) ) {
throw new ServiceException ( " 文件数据不存在! " ) ;
}
FileUtils . setAttachmentResponseHeader ( response , sysOss . getOriginalName ( ) ) ;
response . setContentType ( MediaType . APPLICATION_OCTET_STREAM_VALUE + " ; charset=UTF-8 " ) ;
long data ;
try {
data = HttpUtil . download ( sysOss . getUrl ( ) , response . getOutputStream ( ) , false ) ;
} catch ( HttpException e ) {
if ( e . getMessage ( ) . contains ( " 403 " ) ) {
throw new ServiceException ( " 无读取权限, 请在对应的OSS开启'公有读'权限! " ) ;
} else {
throw new ServiceException ( e . getMessage ( ) ) ;
}
}
response . setContentLength ( Convert . toInt ( data ) ) ;
}
@Override
public SysOssVo upload ( MultipartFile file ) {
String originalfileName = file . getOriginalFilename ( ) ;
String suffix = StringUtils . substring ( originalfileName , originalfileName . lastIndexOf ( " . " ) , originalfileName . length ( ) ) ;
OssClient storage = OssFactory . instance ( ) ;
@ -98,7 +130,9 @@ public class SysOssServiceImpl implements ISysOssService {
oss . setOriginalName ( originalfileName ) ;
oss . setService ( storage . getConfigKey ( ) ) ;
baseMapper . insert ( oss ) ;
return oss ;
SysOssVo sysOssVo = new SysOssVo ( ) ;
BeanCopyUtils . copy ( oss , sysOssVo ) ;
return this . matchingUrl ( sysOssVo ) ;
}
@Override
@ -114,4 +148,18 @@ public class SysOssServiceImpl implements ISysOssService {
return baseMapper . deleteBatchIds ( ids ) > 0 ;
}
/**
* 匹配Url
*
* @param oss OSS对象
* @return oss 匹配Url的OSS对象
*/
private SysOssVo matchingUrl ( SysOssVo oss ) {
OssClient storage = OssFactory . instance ( oss . getService ( ) ) ;
// 仅修改桶类型为 private 的URL, 临时URL时长为120s
if ( AccessPolicyType . PRIVATE = = storage . getAccessPolicy ( ) ) {
oss . setUrl ( storage . getPrivateUrl ( oss . getFileName ( ) , 120 ) ) ;
}
return oss ;
}
}