package org.dromara.system.controller.system;
|
|
|
import cn.dev33.satoken.annotation.SaCheckPermission;
|
import cn.dev33.satoken.annotation.SaIgnore;
|
import cn.hutool.core.util.ObjectUtil;
|
import cn.hutool.json.JSONArray;
|
import com.baomidou.mybatisplus.core.conditions.Wrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.fasterxml.jackson.databind.SerializationFeature;
|
import lombok.extern.slf4j.Slf4j;
|
import org.dromara.common.core.constant.CacheNames;
|
import org.dromara.common.core.domain.R;
|
import org.dromara.common.core.utils.StringUtils;
|
import org.dromara.common.core.utils.file.FileUtils;
|
import org.dromara.common.core.validate.QueryGroup;
|
import org.dromara.common.oss.entity.SynchronousRequest;
|
import org.dromara.common.oss.entity.VideoRequest;
|
import org.dromara.common.redis.utils.CacheUtils;
|
import org.dromara.common.web.core.BaseController;
|
import org.dromara.common.log.annotation.Log;
|
import org.dromara.common.log.enums.BusinessType;
|
import org.dromara.common.mybatis.core.page.PageQuery;
|
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
import org.dromara.system.domain.SysOss;
|
import org.dromara.system.domain.bo.SysOssBo;
|
import org.dromara.system.domain.properties.Boundary;
|
import org.dromara.system.domain.properties.FtpConfig;
|
import org.dromara.system.domain.vo.SysOssUploadVo;
|
import org.dromara.system.domain.vo.SysOssVo;
|
import org.dromara.system.mapper.SysOssMapper;
|
import org.dromara.system.service.ISysOssService;
|
import jakarta.servlet.http.HttpServletResponse;
|
import jakarta.validation.constraints.NotEmpty;
|
import lombok.RequiredArgsConstructor;
|
import org.dromara.system.uitil.FTPUtil;
|
import org.dromara.system.uitil.FtpApche;
|
import org.dromara.system.uitil.HttpUtils;
|
import org.dromara.system.uitil.PasswordUtil;
|
import org.springframework.http.MediaType;
|
import org.springframework.validation.annotation.Validated;
|
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.multipart.MultipartFile;
|
|
import java.io.IOException;
|
import java.util.Arrays;
|
import java.util.HashMap;
|
import java.util.List;
|
import java.util.concurrent.TimeUnit;
|
|
/**
|
* 文件上传 控制层
|
*
|
* @author Lion Li
|
*/
|
@Slf4j
|
@SaIgnore
|
@Validated
|
@RequiredArgsConstructor
|
@RestController
|
@RequestMapping("/resource/oss")
|
public class SysOssController extends BaseController {
|
|
private final FtpConfig ftpConfig;
|
private final Boundary boundary;
|
private final ISysOssService ossService;
|
private final SysOssMapper ossMapper;
|
|
/**
|
* 查询OSS对象存储列表
|
*/
|
@SaCheckPermission("system:oss:list")
|
@GetMapping("/list")
|
public TableDataInfo<SysOssVo> list(@Validated(QueryGroup.class) SysOssBo bo, PageQuery pageQuery) {
|
return ossService.queryPageList(bo, pageQuery);
|
}
|
|
/**
|
* 查询OSS对象基于id串
|
*
|
* @param ossIds OSS对象ID串
|
*/
|
@SaCheckPermission("system:oss:list")
|
@GetMapping("/listByIds/{ossIds}")
|
public R<List<SysOssVo>> listByIds(@NotEmpty(message = "主键不能为空")
|
@PathVariable Long[] ossIds) {
|
List<SysOssVo> list = ossService.listByIds(Arrays.asList(ossIds));
|
return R.ok(list);
|
}
|
|
// /**
|
// * 上传OSS对象存储 视频专网
|
// *
|
// * @param file 文件
|
// */
|
// @SaCheckPermission("system:oss:upload")
|
// @Log(title = "OSS对象存储", businessType = BusinessType.INSERT)
|
// @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
|
// public R<SysOssUploadVo> upload(@RequestPart("file") MultipartFile file) throws IOException {
|
//
|
// if (ObjectUtil.isNull(file)) {
|
// return R.fail("上传文件不能为空");
|
// }
|
// SysOssVo oss = ossService.upload(file);
|
//
|
// SysOssUploadVo uploadVo = new SysOssUploadVo();
|
// uploadVo.setUrl(oss.getUrl());
|
// uploadVo.setFileName(oss.getOriginalName());
|
// uploadVo.setOssId(oss.getOssId().toString());
|
// uploadVo.setPassword(oss.getPassword());
|
//
|
// return R.ok(uploadVo);
|
// }
|
|
/**
|
* 上传OSS对象存储 互联网
|
*
|
* @param file 文件
|
*/
|
@SaCheckPermission("system:oss:upload")
|
@Log(title = "OSS对象存储", businessType = BusinessType.INSERT)
|
@PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
|
public R<String> upload(@RequestPart("file") MultipartFile file) throws IOException {
|
String originalfileName = file.getOriginalFilename();
|
long l = System.currentTimeMillis();
|
String password = PasswordUtil.randomPassword(6);
|
String suffix = StringUtils.substring(originalfileName, originalfileName.lastIndexOf("."), originalfileName.length());
|
FtpApche.uploadFile(ftpConfig, file, password + String.valueOf(l) + suffix);
|
return R.ok(password);
|
}
|
|
private String post(VideoRequest request) throws IOException {
|
HashMap<String, String> headers = new HashMap<>(3);
|
String requestUrl = boundary.getChief() + "/resource/synchronization/uploadTwo";
|
ObjectMapper objectMapper = new ObjectMapper();
|
objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
|
headers.put("content-type", "application/json");
|
// 发送post请求
|
String resultData = HttpUtils.sendPostRequest2(requestUrl, request);
|
// 并接收返回结果
|
System.out.println(resultData);
|
return resultData;
|
}
|
|
/**
|
* 下载OSS对象
|
*
|
* @param ossId OSS对象ID
|
*/
|
@SaCheckPermission("system:oss:download")
|
@GetMapping("/download/{ossId}/{password}")
|
public R<String> download(@PathVariable Long ossId, @PathVariable String password, HttpServletResponse response) throws IOException {
|
if (String.valueOf(ossId).equals("12345678")) {
|
SysOssVo sysOssVo = ossMapper.selectVoOne(new LambdaQueryWrapper<SysOss>()
|
.eq(SysOss::getPassword, password));
|
if (sysOssVo == null) {
|
return R.fail("提取码错误!");
|
}
|
ossService.download(sysOssVo.getOssId(), response);
|
} else {
|
SysOss oss = ossMapper.selectById(ossId);
|
|
if (!oss.getPassword().equals(password)) {
|
return R.fail("提取码错误!");
|
}
|
ossService.download(ossId, response);
|
}
|
|
|
return R.ok();
|
}
|
|
/**
|
* 删除OSS对象存储
|
*
|
* @param ossIds OSS对象ID串
|
*/
|
@SaCheckPermission("system:oss:remove")
|
@Log(title = "OSS对象存储", businessType = BusinessType.DELETE)
|
@DeleteMapping("/{ossIds}/{password}")
|
public R<Void> remove(@NotEmpty(message = "主键不能为空")
|
@PathVariable Long[] ossIds,
|
@PathVariable String password) throws Exception {
|
return ossService.deleteWithValidByIds(List.of(ossIds), true, password) ? R.ok() : R.fail("提取码错误!");
|
}
|
|
/**
|
* 查看OSS对象存储临时密码
|
*
|
* @param ossId OSS对象ID
|
*/
|
@SaCheckPermission("system:oss:view")
|
@GetMapping("/{ossId}")
|
public R<String> view(@PathVariable Long ossId) {
|
return ossService.viewPasswordById(ossId);
|
}
|
|
// /**
|
// * 订阅队列(监听)
|
// *
|
// * @param queueName 队列名
|
// */
|
// @GetMapping("/subscribe")
|
// public R<Void> subscribe(String queueName) {
|
// log.info("通道: {} 监听中......", queueName);
|
// // 项目初始化设置一次即可
|
// QueueUtils.subscribeBlockingQueue(queueName, (String ossId) -> {
|
// // 观察接收时间
|
// log.info("通道: {}, 收到数据: {}", queueName, ossId);
|
//// ossMapper.deleteById(Long.valueOf(ossId));
|
// });
|
// return R.ok("操作成功");
|
// }
|
|
|
}
|