package com.ruoyi.web.controller.system; import cn.dev33.satoken.annotation.SaCheckPermission; import cn.hutool.core.convert.Convert; import cn.hutool.core.util.ObjectUtil; import cn.hutool.http.HttpException; import cn.hutool.http.HttpUtil; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.validate.QueryGroup; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.file.FileUtils; import com.ruoyi.system.domain.SysOss; import com.ruoyi.system.domain.bo.SysOssBo; import com.ruoyi.system.domain.vo.SysOssVo; import com.ruoyi.system.service.ISysOssService; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameters; import io.swagger.v3.oas.annotations.enums.ParameterIn; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.springframework.http.MediaType; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import javax.validation.constraints.NotEmpty; import java.io.IOException; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 文件上传 控制层 * * @author Lion Li */ @Validated @Tag(name ="对象存储控制器", description = "对象存储管理") @RequiredArgsConstructor @RestController @RequestMapping("/system/oss") public class SysOssController extends BaseController { private final ISysOssService iSysOssService; /** * 查询OSS对象存储列表 */ @SaCheckPermission("system:oss:list") @GetMapping("/list") public TableDataInfo list(@Validated(QueryGroup.class) SysOssBo bo, PageQuery pageQuery) { return iSysOssService.queryPageList(bo, pageQuery); } /** * 查询OSS对象基于id串 */ @SaCheckPermission("system:oss:list") @GetMapping("/listByIds/{ossIds}") public R> listByIds(@Parameter(name = "OSS对象ID串") @NotEmpty(message = "主键不能为空") @PathVariable Long[] ossIds) { List list = iSysOssService.listByIds(Arrays.asList(ossIds)); return R.ok(list); } /** * 上传OSS对象存储 */ @Parameters({ @Parameter(name = "file", description = "文件", in = ParameterIn.QUERY, required = true) }) @SaCheckPermission("system:oss:upload") @Log(title = "OSS对象存储", businessType = BusinessType.INSERT) @PostMapping("/upload") public R> upload(@RequestPart("file") MultipartFile file) { if (ObjectUtil.isNull(file)) { throw new ServiceException("上传文件不能为空"); } SysOss oss = iSysOssService.upload(file); Map map = new HashMap<>(2); map.put("url", oss.getUrl()); map.put("fileName", oss.getOriginalName()); map.put("ossId", oss.getOssId().toString()); return R.ok(map); } @SaCheckPermission("system:oss:download") @GetMapping("/download/{ossId}") public void download(@Parameter(name = "OSS对象ID") @PathVariable Long ossId, HttpServletResponse response) throws IOException { SysOss sysOss = iSysOssService.getById(ossId); if (ObjectUtil.isNull(sysOss)) { throw new ServiceException("文件数据不存在!"); } response.reset(); 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)); } /** * 删除OSS对象存储 */ @SaCheckPermission("system:oss:remove") @Log(title = "OSS对象存储", businessType = BusinessType.DELETE) @DeleteMapping("/{ossIds}") public R remove(@Parameter(name = "OSS对象ID串") @NotEmpty(message = "主键不能为空") @PathVariable Long[] ossIds) { return toAjax(iSysOssService.deleteWithValidByIds(Arrays.asList(ossIds), true) ? 1 : 0); } }