AssetController.java 8.98 KB
Newer Older
liqin's avatar
liqin committed
1 2
package cn.wisenergy.chnmuseum.party.web.controller;

liqin's avatar
liqin committed
3
import cn.hutool.core.io.IoUtil;
liqin's avatar
liqin committed
4
import cn.hutool.core.util.RandomUtil;
liqin's avatar
liqin committed
5
import cn.hutool.core.util.ZipUtil;
liqin's avatar
liqin committed
6
import cn.wisenergy.chnmuseum.party.common.dfs.FastDFSUtils;
wzp's avatar
wzp committed
7 8 9
import cn.wisenergy.chnmuseum.party.common.log.MethodLog;
import cn.wisenergy.chnmuseum.party.common.log.OperModule;
import cn.wisenergy.chnmuseum.party.common.log.OperType;
liqin's avatar
liqin committed
10
import cn.wisenergy.chnmuseum.party.common.util.RSAUtils;
liqin's avatar
liqin committed
11
import cn.wisenergy.chnmuseum.party.common.video.VideoEncryptUtil;
liqin's avatar
liqin committed
12 13
import cn.wisenergy.chnmuseum.party.common.vo.GenericPageParam;
import cn.wisenergy.chnmuseum.party.model.Asset;
liqin's avatar
liqin committed
14 15
import cn.wisenergy.chnmuseum.party.model.TBoxOperation;
import cn.wisenergy.chnmuseum.party.model.TUser;
liqin's avatar
liqin committed
16
import cn.wisenergy.chnmuseum.party.service.AssetService;
liqin's avatar
liqin committed
17
import cn.wisenergy.chnmuseum.party.service.TBoxOperationService;
liqin's avatar
liqin committed
18 19
import cn.wisenergy.chnmuseum.party.web.controller.base.BaseController;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
liqin's avatar
liqin committed
20
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
liqin's avatar
liqin committed
21
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
liqin's avatar
liqin committed
22
import com.github.tobato.fastdfs.domain.fdfs.MetaData;
liqin's avatar
liqin committed
23 24 25 26 27 28
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
wzp's avatar
wzp committed
29
import org.apache.shiro.authz.annotation.RequiresAuthentication;
liqin's avatar
liqin committed
30
import org.springframework.http.HttpHeaders;
liqin's avatar
liqin committed
31
import org.springframework.http.MediaType;
liqin's avatar
liqin committed
32 33 34
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
liqin's avatar
liqin committed
35 36
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
liqin's avatar
liqin committed
37 38
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
liqin's avatar
liqin committed
39
import java.io.IOException;
liqin's avatar
liqin committed
40
import java.io.InputStream;
liqin's avatar
liqin committed
41
import java.net.URLEncoder;
liqin's avatar
liqin committed
42
import java.nio.charset.StandardCharsets;
liqin's avatar
liqin committed
43
import java.util.LinkedHashMap;
liqin's avatar
liqin committed
44
import java.util.List;
liqin's avatar
liqin committed
45
import java.util.Map;
liqin's avatar
liqin committed
46
import java.util.Set;
liqin's avatar
liqin committed
47 48 49 50 51 52 53 54 55 56 57 58

/**
 * <pre>
 * 文件资产 前端控制器
 * </pre>
 *
 * @author Danny Lee
 * @since 2021-04-06
 */
@Slf4j
@RestController
@RequestMapping("/asset")
liqin's avatar
liqin committed
59
@Api(tags = {"视频文件汇出接口"})
liqin's avatar
liqin committed
60 61
public class AssetController extends BaseController {

liqin's avatar
liqin committed
62 63
    private static final String BASE_STRING = "1234567890abcdef";

liqin's avatar
liqin committed
64 65 66
    @Resource
    private AssetService assetService;

liqin's avatar
liqin committed
67 68 69
    @Resource
    private TBoxOperationService tBoxOperationService;

liqin's avatar
liqin committed
70 71 72 73 74 75 76 77
    @ApiImplicitParams(value = {
            @ApiImplicitParam(name = "_index", value = "分页起始偏移量", paramType = "query", dataType = "Integer"),
            @ApiImplicitParam(name = "_size", value = "返回条数", paramType = "query", dataType = "Integer"),
            @ApiImplicitParam(name = "nameOrCode", value = "视频文件名", paramType = "query", dataType = "String"),
            @ApiImplicitParam(name = "videoContentCatId", value = "视频内容分类ID", paramType = "query", dataType = "String"),
            @ApiImplicitParam(name = "videoContentCopyrightOwnerId", value = "视频内容版权方ID", paramType = "query", dataType = "String")
    })
    @PostMapping("/getPageList")
wzp's avatar
wzp committed
78
    @RequiresAuthentication  //@RequiresPermissions("asset:page")
liqin's avatar
liqin committed
79
    @ApiOperation(value = "获取视频汇出分页列表", notes = "获取视频汇出分页列表")
wzp's avatar
wzp committed
80
    @MethodLog(operModule = OperModule.VIDEOREMIT, operType = OperType.SELECT)
liqin's avatar
liqin committed
81 82 83 84 85 86 87 88 89 90 91 92 93 94
    public Map<String, Object> getAssetPageList(GenericPageParam genericPageParam,
                                                @RequestParam(value = "videoContentCatId", required = false) String videoContentCatId,
                                                @RequestParam(value = "videoContentCopyrightOwnerId", required = false) String videoContentCopyrightOwnerId) {
        LambdaQueryWrapper<Asset> ew = new LambdaQueryWrapper<>();
        // 对名称或编码模糊查询
        if (StringUtils.isNotBlank(genericPageParam.getNameOrCode())) {
            ew.like(Asset::getFileName, genericPageParam.getNameOrCode());
        }
        // 设置排序规则
        ew.orderByDesc(Asset::getCreateTime);
        Page<Asset> page = this.assetService.pageByConditions(getPage(), videoContentCatId, videoContentCopyrightOwnerId);
        return getResult(page);
    }

liqin's avatar
liqin committed
95
    @ApiOperation(value = "获取视频文件详情", notes = "获取视频文件详情")
liqin's avatar
liqin committed
96 97 98 99
    @ApiImplicitParams({
            @ApiImplicitParam(name = "id", value = "标识ID", dataType = "String", paramType = "path")
    })
    @GetMapping("/get/{id}")
wzp's avatar
wzp committed
100
    @RequiresAuthentication  //@RequiresPermissions("asset:get:id")
wzp's avatar
wzp committed
101
    @MethodLog(operModule = OperModule.VIDEOREMIT, operType = OperType.SELECT)
liqin's avatar
liqin committed
102 103 104 105 106
    public Map<String, Object> getById(@PathVariable("id") String id) {
        Asset asset = assetService.getById(id);
        return getResult(asset);
    }

liqin's avatar
liqin committed
107
    @ApiOperation(value = "视频文件汇出POST", notes = "视频文件汇出POST")
liqin's avatar
liqin committed
108
    @ApiImplicitParams({
liqin's avatar
liqin committed
109
            @ApiImplicitParam(name = "idList", value = "视频文件标识ID集合", dataType = "String", paramType = "query")
liqin's avatar
liqin committed
110
    })
liqin's avatar
liqin committed
111
    @PostMapping("/download")
liqin's avatar
liqin committed
112
    @RequiresAuthentication
wzp's avatar
wzp committed
113
    @MethodLog(operModule = OperModule.VIDEOREMIT, operType = OperType.VIDEO_EXPORT)
liqin's avatar
liqin committed
114
    public void download(@RequestParam("idList") List<String> idList, HttpServletResponse response) throws IOException {
liqin's avatar
liqin committed
115 116
        response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
        response.addHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + URLEncoder.encode("video.zip", "UTF-8"));
liqin's avatar
liqin committed
117

liqin's avatar
liqin committed
118 119
        final Map<String, InputStream> map = new LinkedHashMap<>(idList.size() + 1);
        final List<Asset> assetList = assetService.listByIds(idList);
liqin's avatar
liqin committed
120
        final String cipher = RandomUtil.randomString(BASE_STRING, 16);
liqin's avatar
liqin committed
121 122
        for (final Asset asset : assetList) {
            final String fileUrl = asset.getFileUrl();
liqin's avatar
liqin committed
123
            ByteArrayOutputStream byteOutputStream = new ByteArrayOutputStream();
liqin's avatar
liqin committed
124 125 126
            FastDFSUtils.downloadFile(fileUrl, byteOutputStream);
            final Set<MetaData> fileMetaData = FastDFSUtils.getFileMetaData(fileUrl);
            String fileName = fileMetaData.stream().filter(x -> "MD5".equals(x.getName())).map(MetaData::getValue).findFirst().get() + ".chnmuseum";
liqin's avatar
liqin committed
127
            map.put(fileName, VideoEncryptUtil.encrypt(new ByteArrayInputStream(byteOutputStream.toByteArray()), cipher));
liqin's avatar
liqin committed
128
        }
liqin's avatar
liqin committed
129 130 131
        final TUser user = getcurUser();
        final TBoxOperation tBoxOperation = this.tBoxOperationService.getOne(Wrappers.<TBoxOperation>lambdaQuery().eq(TBoxOperation::getOrganId, user.getOrgId()));
        map.put("cipher.txt", IoUtil.toStream(RSAUtils.encrypt(cipher, tBoxOperation.getPublicKey()), StandardCharsets.UTF_8));
liqin's avatar
liqin committed
132

liqin's avatar
liqin committed
133 134 135 136
        ServletOutputStream outputStream = response.getOutputStream();
        String[] paths = map.keySet().toArray(new String[0]);
        InputStream[] ins = map.values().toArray(new InputStream[0]);
        ZipUtil.zip(outputStream, paths, ins);
liqin's avatar
liqin committed
137 138
    }

liqin's avatar
liqin committed
139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170
    @ApiOperation(value = "视频文件汇出GET", notes = "视频文件汇出GET")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "idList", value = "视频文件标识ID集合", dataType = "String", paramType = "query")
    })
    @GetMapping("/download")
    @RequiresAuthentication
    @MethodLog(operModule = OperModule.VIDEOREMIT, operType = OperType.VIDEO_EXPORT)
    public void downloadByGet(@RequestParam("idList") List<String> idList, HttpServletResponse response) throws IOException {
        response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
        response.addHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + URLEncoder.encode("file.zip", "UTF-8"));

        final Map<String, InputStream> map = new LinkedHashMap<>(idList.size() + 1);
        final List<Asset> assetList = assetService.listByIds(idList);
        final String cipher = RandomUtil.randomString(BASE_STRING, 16);
        for (final Asset asset : assetList) {
            final String fileUrl = asset.getFileUrl();
            ByteArrayOutputStream byteOutputStream = new ByteArrayOutputStream();
            FastDFSUtils.downloadFile(fileUrl, byteOutputStream);
            final Set<MetaData> fileMetaData = FastDFSUtils.getFileMetaData(fileUrl);
            //String fileName = fileMetaData.stream().filter(x -> "MD5".equals(x.getName())).map(MetaData::getValue).findFirst().get() + ".chnmuseum";
            map.put(asset.getFileName(), new ByteArrayInputStream(byteOutputStream.toByteArray()));
        }
        final TUser user = getcurUser();
        final TBoxOperation tBoxOperation = this.tBoxOperationService.getOne(Wrappers.<TBoxOperation>lambdaQuery().eq(TBoxOperation::getOrganId, user.getOrgId()));
        map.put("cipher.txt", IoUtil.toStream(RSAUtils.encrypt(cipher, tBoxOperation.getPublicKey()), StandardCharsets.UTF_8));

        ServletOutputStream outputStream = response.getOutputStream();
        String[] paths = map.keySet().toArray(new String[0]);
        InputStream[] ins = map.values().toArray(new InputStream[0]);
        ZipUtil.zip(outputStream, paths, ins);
    }

liqin's avatar
liqin committed
171 172
}