bac28589 by chentao

新增阿里云vod功能

1 parent 81e626a2
......@@ -66,6 +66,19 @@ public class UpgradeController extends BaseController {
}
}
@GetMapping("/v2/list")
public R<String> list_v2() {
try {
ResourceVo resourceVo = service.list();
ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(resourceVo);
return R.ok(MessageUtils.message("system.success"),EncryptUtils.encryptByAes(json));
}
catch(Exception e){
return R.fail();
}
}
@GetMapping("/list1")
public R<ResourceVo> list1() {
try {
......
......@@ -2,7 +2,11 @@ package com.lego.web.controller.system;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import com.aliyun.vod.upload.impl.UploadVideoImpl;
import com.aliyun.vod.upload.req.UploadStreamRequest;
import com.aliyun.vod.upload.resp.UploadStreamResponse;
import com.lego.common.annotation.Log;
import com.lego.common.core.controller.BaseController;
import com.lego.common.core.domain.PageQuery;
......@@ -10,10 +14,16 @@ import com.lego.common.core.domain.R;
import com.lego.common.core.page.TableDataInfo;
import com.lego.common.core.validate.QueryGroup;
import com.lego.common.enums.BusinessType;
import com.lego.common.utils.EncryptUtils;
import com.lego.common.utils.StringUtils;
import com.lego.oss.config.AppConfig;
import com.lego.system.domain.SysOss;
import com.lego.system.domain.bo.SysOssBo;
import com.lego.system.domain.vo.SysOssVo;
import com.lego.system.mapper.SysOssMapper;
import com.lego.system.service.ISysOssService;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
......@@ -21,7 +31,11 @@ import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.NotEmpty;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
......@@ -39,6 +53,9 @@ import java.util.Map;
public class SysOssController extends BaseController {
private final ISysOssService iSysOssService;
private final SysOssMapper baseMapper;
@Autowired
public AppConfig config;
/**
* 查询OSS对象存储列表
......@@ -83,6 +100,79 @@ public class SysOssController extends BaseController {
}
/**
* 同步Oss至阿里云
*
*/
@GetMapping("/sync")
public R<String> sync() {
List<SysOssVo> list = iSysOssService.list();
String accessKeyId = config.getAliyunAccessKeyId();
String accessKeySecret = config.getAliyunAccessKeySecret();
for(SysOssVo vo : list){
if(StringUtils.isBlank(vo.getVideoId())) {
if (".mp4".equals(vo.getFileSuffix()) || ".avi".equals(vo.getFileSuffix()) || ".mov".equals(vo.getFileSuffix()) || ".flv".equals(vo.getFileSuffix())) {
try {
InputStream inputStream = new URL(vo.getUrl()).openStream();
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
byte[] data = new byte[1024];
int nRead;
while ((nRead = inputStream.read(data, 0, data.length)) != -1) {
buffer.write(data, 0, nRead);
}
buffer.flush();
byte[] byteArray = EncryptUtils.decryptByAes(buffer.toByteArray());
UploadStreamRequest request = new UploadStreamRequest(accessKeyId, accessKeySecret, vo.getOriginalName(), vo.getFileName(), new ByteArrayInputStream(byteArray));
/* 是否使用默认水印(可选),指定模板组ID时,根据模板组配置确定是否使用默认水印*/
//request.setShowWaterMark(true);
/* 自定义消息回调设置,参数说明参考文档 https://help.aliyun.com/document_detail/86952.html#UserData */
//request.setUserData(""{\"Extend\":{\"test\":\"www\",\"localId\":\"xxxx\"},\"MessageCallback\":{\"CallbackURL\":\"http://test.test.com\"}}"");
/* 视频分类ID(可选) */
//request.setCateId(0);
/* 视频标签,多个用逗号分隔(可选) */
//request.setTags("标签1,标签2");
/* 视频描述(可选) */
//request.setDescription("视频描述");
/* 封面图片(可选) */
//request.setCoverURL("http://cover.sample.com/sample.jpg");
/* 模板组ID(可选) */
//request.setTemplateGroupId("8c4792cbc8694e7084fd5330e56a33d");
/* 工作流ID(可选) */
//request.setWorkflowId("d4430d07361f0*be1339577859b0177b");
/* 存储区域(可选) */
//request.setStorageLocation("in-201703232118266-5sejdln9o.oss-cn-shanghai.aliyuncs.com");
/* 开启默认上传进度回调 */
// request.setPrintProgress(true);
/* 设置自定义上传进度回调 (必须继承 VoDProgressListener) */
// request.setProgressListener(new PutObjectProgressListener());
/* 设置应用ID*/
//request.setAppId("app-1000000");
/* 点播服务接入点 */
//request.setApiRegionId("cn-shanghai");
/* ECS部署区域*/
// request.setEcsRegionId("cn-shanghai");
UploadVideoImpl uploader = new UploadVideoImpl();
UploadStreamResponse response = uploader.uploadStream(request);
System.out.print("RequestId=" + response.getRequestId() + "\n"); //请求视频点播服务的请求ID
if (response.isSuccess()) {
System.out.print("VideoId=" + response.getVideoId() + "\n");
vo.setVideoId(response.getVideoId());
SysOss sysOss = BeanUtil.toBean(vo, SysOss.class);
baseMapper.updateById(sysOss);
} else { //如果设置回调URL无效,不影响视频上传,可以返回VideoId同时会返回错误码。其他情况上传失败时,VideoId为空,此时需要根据返回错误码分析具体错误原因
System.out.print("VideoId=" + response.getVideoId() + "\n");
System.out.print("ErrorCode=" + response.getCode() + "\n");
System.out.print("ErrorMessage=" + response.getMessage() + "\n");
}
} catch (Exception e) {
}
}
}
}
return R.ok("同步媒体问题至阿里云成功");
}
/**
* 下载OSS对象
*
* @param ossId OSS对象ID
......
#阿里云视频点播
#账号AK信息请填写(必选)
aliyun.accessKeyId = LTAI5tSKG2FKxnev2SKDt47a
#账号AK信息请填写(必选)
aliyun.accessKeySecret = XR5umvk9RKyW1HB1nAiJEaiXfskgiU
#点播服务接入区域
aliyun.regionId = cn-shanghai
......@@ -11,6 +11,10 @@
<artifactId>lego-oss</artifactId>
<properties>
<!-- fastjson -->
<fastjson.version>1.2.70</fastjson.version>
</properties>
<description>
OSS对象存储模块
</description>
......@@ -28,6 +32,38 @@
<artifactId>aws-java-sdk-s3</artifactId>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.5.1</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-vod</artifactId>
<version>2.15.11</version>
</dependency>
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.10.2</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-vod-upload</artifactId>
<version>1.4.14</version>
</dependency>
<!-- fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.3.4</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
......
package com.lego.oss.config;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
/**
* @author chentao
* @date 2026-04-16
*/
@Data
@Configuration
@PropertySource(value = "classpath:application.properties", encoding = "UTF-8")
public class AppConfig {
@Value("${aliyun.accessKeyId}")
private String aliyunAccessKeyId;
@Value("${aliyun.accessKeySecret}")
private String aliyunAccessKeySecret;
@Value("${aliyun.regionId}")
private String aliyunRegionId;
}
......@@ -47,4 +47,9 @@ public class SysOss extends BaseEntity {
*/
private String service;
/**
* 阿里云videoId
*/
private String videoId;
}
......
......@@ -54,5 +54,9 @@ public class SysOssVo {
*/
private String service;
/**
* 阿里云videoId
*/
private String videoId;
}
......
......@@ -37,4 +37,6 @@ public interface ISysOssService {
void delete(Long ossId);
List<SysOssVo> list();
}
......
......@@ -3,7 +3,6 @@ package com.lego.system.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
......@@ -42,7 +41,6 @@ import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.stream.Collectors;
......@@ -68,6 +66,12 @@ public class SysOssServiceImpl implements ISysOssService, OssService {
return TableDataInfo.build(result);
}
@Override
public List<SysOssVo> list() {
List<SysOssVo> list = baseMapper.selectVoList(Wrappers.<SysOss>lambdaQuery());
return list;
}
private void repUrl(List<SysOssVo> list) {
String baseUrl = configService.getConfigValue("sys.oss.baseUrl");
for (SysOssVo vo : list) {
......@@ -113,7 +117,12 @@ public class SysOssServiceImpl implements ISysOssService, OssService {
SysOssVo vo = SpringUtils.getAopProxy(this).getById(id);
if (ObjectUtil.isNotNull(vo)) {
try {
if(StringUtils.isBlank(vo.getVideoId())){
list.add(this.matchingUrl(vo).getUrl());
}
else{
list.add(vo.getVideoId());
}
} catch (Exception ignored) {
// 如果oss异常无法连接则将数据直接返回
list.add(vo.getUrl());
......@@ -124,9 +133,11 @@ public class SysOssServiceImpl implements ISysOssService, OssService {
List<String> repList = new ArrayList<>();
for (String url : list) {
if (StrUtil.isNotBlank(url) && StrUtil.isNotBlank(baseUrl)) {
if(url.contains("http")) {
repList.add(url.replace("127.0.0.1:9000", baseUrl));
}
}
}
return String.join(StringUtils.SEPARATOR, repList);
}
......@@ -210,7 +221,11 @@ public class SysOssServiceImpl implements ISysOssService, OssService {
OssClient storage = OssFactory.instance();
UploadResult uploadResult;
try {
if(".pdf".equals(suffix) || ".mp4".equals(suffix) || ".json".equals(suffix) || ".ldr".equals(suffix)) {
if(".mov".equals(suffix) || ".mp4".equals(suffix) || ".flv".equals(suffix) || ".avi".equals(suffix)) {
byte[] encryptBytes = EncryptUtils.encryptByAes(file.getBytes());
uploadResult = storage.uploadSuffix(encryptBytes, suffix, file.getContentType());
}
else if(".pdf".equals(suffix) || ".json".equals(suffix) || ".ldr".equals(suffix)) {
byte[] encryptBytes = EncryptUtils.encryptByAes(file.getBytes());
uploadResult = storage.uploadSuffix(encryptBytes, suffix, file.getContentType());
}
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!