FileUploadController.java 37 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.util.ArrayUtil;
liqin's avatar
liqin committed
4
import cn.wisenergy.chnmuseum.party.common.dfs.FastDFSUtils;
liqin's avatar
liqin committed
5
import cn.wisenergy.chnmuseum.party.common.enums.*;
liqin's avatar
liqin committed
6
import cn.wisenergy.chnmuseum.party.common.mvc.InterfaceException;
liqin's avatar
liqin committed
7
import cn.wisenergy.chnmuseum.party.common.util.LCSUtil;
liqin's avatar
liqin committed
8
import cn.wisenergy.chnmuseum.party.common.util.TimeUtils;
liqin's avatar
liqin committed
9
import cn.wisenergy.chnmuseum.party.common.video.VideoEncryptUtil;
liqin's avatar
liqin committed
10 11
import cn.wisenergy.chnmuseum.party.common.vo.BatchUploadResVO;
import cn.wisenergy.chnmuseum.party.common.vo.ImageUploadResult;
liqin's avatar
liqin committed
12 13
import cn.wisenergy.chnmuseum.party.model.Asset;
import cn.wisenergy.chnmuseum.party.service.AssetService;
liqin's avatar
liqin committed
14
import cn.wisenergy.chnmuseum.party.web.controller.base.BaseController;
liqin's avatar
liqin committed
15
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
liqin's avatar
liqin committed
16 17
import com.github.tobato.fastdfs.domain.fdfs.FileInfo;
import com.github.tobato.fastdfs.domain.fdfs.MetaData;
liqin's avatar
liqin committed
18
import com.github.tobato.fastdfs.exception.FdfsServerException;
liqin's avatar
liqin committed
19
import io.swagger.annotations.Api;
liqin's avatar
liqin committed
20 21 22 23 24
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FilenameUtils;
liqin's avatar
liqin committed
25
import org.apache.commons.io.IOUtils;
liqin's avatar
liqin committed
26
import org.apache.commons.lang3.StringUtils;
wzp's avatar
wzp committed
27
import org.apache.shiro.authz.annotation.RequiresAuthentication;
liqin's avatar
liqin committed
28
import org.springframework.context.annotation.Scope;
liqin's avatar
liqin committed
29 30 31 32
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

liqin's avatar
liqin committed
33
import javax.annotation.Resource;
liqin's avatar
liqin committed
34 35
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
liqin's avatar
liqin committed
36
import java.io.IOException;
liqin's avatar
liqin committed
37
import java.time.LocalDateTime;
liqin's avatar
liqin committed
38
import java.util.*;
liqin's avatar
liqin committed
39 40 41 42 43 44 45 46 47 48 49 50

/**
 * <p>
 * 文件上传 前端控制器
 * </p>
 *
 * @author Danny Lee
 * @since 2021-03-16
 */
@Slf4j
@RestController
@RequestMapping("/file")
liqin's avatar
liqin committed
51
@Api(tags = {"文件上传接口"})
liqin's avatar
liqin committed
52
@Scope("prototype")
liqin's avatar
liqin committed
53
public class FileUploadController extends BaseController {
liqin's avatar
liqin committed
54 55

    private static final String[] IMAGE_TYPE = new String[]{"JPG", "JPEG", "PNG", "BMP", "WBMP"};
liqin's avatar
liqin committed
56
    private static final String[] AUDIO_TYPE = new String[]{"MP3", "AAC", "WMA", "FLAC", "RM", "OGG"};
liqin's avatar
liqin committed
57
    private static final String[] VIDEO_TYPE = new String[]{"MP4", "FLV", "MPEG", "MPG", "MOV"};
liqin's avatar
liqin committed
58
    private static final String[] DOC_TYPE = new String[]{"PDF", "DOC", "DOCX", "PPT", "PPTX"};
liqin's avatar
liqin committed
59 60 61 62
    private static final char[] SPLITTER_CHAR_2 = new char[]{'@', '#'};
    private static final char[] SPLITTER_CHAR_3 = new char[]{'@', '#', '$'};
    private static final char[] SPLITTER_CHAR_4 = new char[]{'@', '#', '$', '%'};
    private static final char[] SPLITTER_CHAR_5 = new char[]{'@', '#', '$', '%', '&'};
liqin's avatar
liqin committed
63
    private static final String[] DATUM_TYPE = ArrayUtil.addAll(DOC_TYPE, IMAGE_TYPE, VIDEO_TYPE);
liqin's avatar
liqin committed
64

liqin's avatar
liqin committed
65 66 67 68 69
    @Resource
    private AssetService assetService;

    @ApiOperation(value = "根据文件ID刪除文件", notes = "根据文件ID刪除文件")
    @DeleteMapping(value = "/delete/{id}")
wzp's avatar
wzp committed
70
    @RequiresAuthentication  //@RequiresPermissions("file:delete")
liqin's avatar
liqin committed
71
    public Map<String, Object> delete(@PathVariable(value = "id") String id) {
liqin's avatar
liqin committed
72 73 74
        final Asset asset = assetService.getById(id);
        if (asset != null) {
            final String fileUrl = asset.getFileUrl();
liqin's avatar
liqin committed
75 76 77 78 79 80
            try {
                FastDFSUtils.deleteFile(fileUrl);
            } catch (FdfsServerException e) {
                this.assetService.removeById(id);
                return getResult("文件被已删除");
            }
liqin's avatar
liqin committed
81
            this.assetService.removeById(id);
liqin's avatar
liqin committed
82
            return getSuccessResult();
liqin's avatar
liqin committed
83
        }
liqin's avatar
liqin committed
84
        return getResult("文件被已删除");
liqin's avatar
liqin committed
85
    }
liqin's avatar
liqin committed
86

liqin's avatar
liqin committed
87
    @ApiImplicitParams({
liqin's avatar
liqin committed
88
            @ApiImplicitParam(name = "file", value = "资料", paramType = "form", dataType = "__file", collectionFormat = "array", allowMultiple = true)
liqin's avatar
liqin committed
89
    })
liqin's avatar
liqin committed
90
    @PostMapping(value = "/datum/upload", headers = "content-type=multipart/form-data", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
liqin's avatar
liqin committed
91
    @ApiOperation(value = "展板资料上传", notes = "展板资料上传")
liqin's avatar
liqin committed
92
    public Map<String, Object> uploadFile(@RequestPart(value = "file", required = false) MultipartFile[] files) throws IOException {
liqin's avatar
liqin committed
93 94
        if (files == null || files.length == 0) {
            return getFailResult("没有文件可供上传");
liqin's avatar
liqin committed
95 96 97 98 99
        }
        int successCount = 0;
        int failureCount = 0;
        List<BatchUploadResVO.HandleResult> handleList = new ArrayList<>();

liqin's avatar
liqin committed
100
        Set<Asset> datumUrlList = new LinkedHashSet<>();
liqin's avatar
liqin committed
101 102 103 104 105 106 107 108 109 110 111
        for (MultipartFile file : files) {
            // 当前维度表下线结果
            BatchUploadResVO.HandleResult handleResult = new BatchUploadResVO.HandleResult();
            // 原始文件名
            String originalFilename = file.getOriginalFilename();
            if (StringUtils.isBlank(originalFilename)) {
                handleResult.setFileName("");
                handleResult.setFileUrl("");
                handleResult.setHandleResult(HANDLE_STATUS_ENUM.FAILURE.getName());
                handleResult.setDescription("文件名为空");
                failureCount++;
liqin's avatar
liqin committed
112
                handleList.add(handleResult);
liqin's avatar
liqin committed
113 114
                continue;
            }
liqin's avatar
liqin committed
115 116 117 118
            if (file.getSize() == 0L) {
                handleResult.setFileName("");
                handleResult.setFileUrl("");
                handleResult.setHandleResult(HANDLE_STATUS_ENUM.FAILURE.getName());
liqin's avatar
liqin committed
119
                handleResult.setDescription("文件" + originalFilename + "大小为0");
liqin's avatar
liqin committed
120
                failureCount++;
liqin's avatar
liqin committed
121
                handleList.add(handleResult);
liqin's avatar
liqin committed
122 123
                continue;
            }
liqin's avatar
liqin committed
124

liqin's avatar
liqin committed
125
            String extName = FilenameUtils.getExtension(originalFilename);
liqin's avatar
liqin committed
126 127
            String finalExtName = extName;
            boolean anyMatch = Arrays.stream(DATUM_TYPE).anyMatch(s -> Objects.equals(s, finalExtName.toUpperCase()));
liqin's avatar
liqin committed
128
            if (anyMatch) {
liqin's avatar
liqin committed
129
                if ("MPEG".equals(extName.toUpperCase()) || "MOV".equals(extName.toUpperCase())) {
liqin's avatar
liqin committed
130 131 132
                    extName = "mp4";
                    originalFilename = FilenameUtils.getBaseName(originalFilename) + "." + extName;
                }
liqin's avatar
liqin committed
133 134 135 136 137 138 139 140 141
                final Asset asset = Asset.builder()
                        .fileName(originalFilename)
                        .fileExtName(extName)
                        .fileCat(FileCatEnum.EXHIBITION_BOARD_DATUM.name())
                        .build();

                String fileUrl = null;
                final Set<MetaData> metaDataSet = new HashSet<>();
                metaDataSet.add(new MetaData("fileName", originalFilename));
liqin's avatar
liqin committed
142
                if (Arrays.stream(VIDEO_TYPE).anyMatch(s -> Objects.equals(s, finalExtName.toUpperCase()))) {
liqin's avatar
liqin committed
143 144 145 146 147 148 149
                    metaDataSet.add(new MetaData("fileType", FileTypeEnum.VIDEO.name()));
                    handleResult.setFileType(FileTypeEnum.VIDEO.name());
                    asset.setFileType(FileTypeEnum.VIDEO.name());
                    fileUrl = FastDFSUtils.uploadVideo(file.getInputStream(), file.getSize(), originalFilename, metaDataSet);
                    final Set<MetaData> fileMetaData = FastDFSUtils.getFileMetaData(fileUrl);
                    String md5 = fileMetaData.stream().filter(x -> "MD5".equals(x.getName())).map(MetaData::getValue).findFirst().get();
                    asset.setMd5(md5);
liqin's avatar
liqin committed
150
                } else if (Arrays.stream(AUDIO_TYPE).anyMatch(s -> Objects.equals(s, finalExtName.toUpperCase()))) {
liqin's avatar
liqin committed
151 152 153 154
                    metaDataSet.add(new MetaData("fileType", FileTypeEnum.AUDIO.name()));
                    handleResult.setFileType(FileTypeEnum.AUDIO.name());
                    asset.setFileType(FileTypeEnum.AUDIO.name());
                    fileUrl = FastDFSUtils.uploadFile(file.getInputStream(), file.getSize(), originalFilename, metaDataSet);
liqin's avatar
liqin committed
155
                } else if (Arrays.stream(IMAGE_TYPE).anyMatch(s -> Objects.equals(s, finalExtName.toUpperCase()))) {
liqin's avatar
liqin committed
156 157 158 159 160
                    metaDataSet.add(new MetaData("fileType", FileTypeEnum.IMAGE.name()));
                    handleResult.setFileType(FileTypeEnum.IMAGE.name());
                    asset.setFileType(FileTypeEnum.IMAGE.name());
                    fileUrl = FastDFSUtils.uploadFile(file.getInputStream(), file.getSize(), originalFilename, metaDataSet);
                    asset.setThumbnail(fileUrl);
liqin's avatar
liqin committed
161
                } else if (Arrays.stream(DOC_TYPE).anyMatch(s -> Objects.equals(s, finalExtName.toUpperCase()))) {
liqin's avatar
liqin committed
162 163 164 165
                    metaDataSet.add(new MetaData("fileType", FileTypeEnum.DOCUMENT.name()));
                    handleResult.setFileType(FileTypeEnum.DOCUMENT.name());
                    asset.setFileType(FileTypeEnum.DOCUMENT.name());
                    fileUrl = FastDFSUtils.uploadFile(file.getInputStream(), file.getSize(), originalFilename, metaDataSet);
liqin's avatar
liqin committed
166
                }
liqin's avatar
liqin committed
167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184

                String language = null;
                if (originalFilename.contains("汉语")) {
                    metaDataSet.add(new MetaData("language", LanguageEnum.ZH.name()));
                    language = LanguageEnum.ZH.name();
                } else if (originalFilename.contains("英语")) {
                    metaDataSet.add(new MetaData("language", LanguageEnum.EN.name()));
                    language = LanguageEnum.EN.name();
                } else if (originalFilename.contains("蒙语")) {
                    metaDataSet.add(new MetaData("language", LanguageEnum.MN.name()));
                    language = LanguageEnum.MN.name();
                } else if (originalFilename.contains("藏语")) {
                    metaDataSet.add(new MetaData("language", LanguageEnum.BO.name()));
                    language = LanguageEnum.BO.name();
                } else if (originalFilename.contains("维吾尔语")) {
                    metaDataSet.add(new MetaData("language", LanguageEnum.UYG.name()));
                    language = LanguageEnum.UYG.name();
                }
liqin's avatar
liqin committed
185
                final FileInfo fileInfo = FastDFSUtils.getFileInfo(fileUrl);
liqin's avatar
liqin committed
186
                final int crc32 = fileInfo.getCrc32();
liqin's avatar
liqin committed
187
                final Asset one = this.assetService.getOne(Wrappers.<Asset>lambdaQuery().eq(Asset::getCrc32, (long) crc32).last(" limit 1"));
liqin's avatar
liqin committed
188

liqin's avatar
liqin committed
189
                final LocalDateTime createTime = TimeUtils.getDateTimeOfTimestamp(fileInfo.getCreateTime() * 1000);
liqin's avatar
liqin committed
190 191 192
                asset.setFileSize(fileInfo.getFileSize());
                asset.setFileUrl(fileUrl);
                asset.setFileCat(FileCatEnum.EXHIBITION_BOARD_DATUM.name());
liqin's avatar
liqin committed
193
                asset.setLanguage(language);
liqin's avatar
liqin committed
194
                asset.setCrc32((long) crc32);
liqin's avatar
liqin committed
195 196
                asset.setCreateTime(createTime);
                asset.setUpdateTime(createTime);
liqin's avatar
liqin committed
197 198 199 200
                if (one != null) {
                    FastDFSUtils.deleteFile(fileUrl);
                    asset.setFileUrl(one.getFileUrl());
                }
liqin's avatar
liqin committed
201 202 203 204 205 206 207
                this.assetService.save(asset);
                datumUrlList.add(asset);

                handleResult.setFileUrl(fileUrl);
                handleResult.setFileName(originalFilename);
                handleResult.setHandleResult(HANDLE_STATUS_ENUM.SUCCESS.getName());
                handleResult.setDescription("");
liqin's avatar
liqin committed
208 209 210
                successCount++;
            } else {
                handleResult.setFileUrl("");
liqin's avatar
liqin committed
211
                handleResult.setDescription("文件" + originalFilename + "格式不支持");
liqin's avatar
liqin committed
212 213 214 215 216 217 218 219 220 221
                failureCount++;
            }
            // 设置处理的业务表信息
            handleList.add(handleResult);
        }
        BatchUploadResVO batchUploadResVO = new BatchUploadResVO();
        batchUploadResVO.setFailureCount(failureCount);
        batchUploadResVO.setSuccessCount(successCount);
        batchUploadResVO.setTotal(files.length);
        batchUploadResVO.setHandleList(handleList);
liqin's avatar
liqin committed
222
        batchUploadResVO.setFileList(datumUrlList);
liqin's avatar
liqin committed
223 224 225 226

        if (failureCount > 0) {
            return getFailResult(batchUploadResVO);
        }
liqin's avatar
liqin committed
227
        return getResult(batchUploadResVO);
liqin's avatar
liqin committed
228 229 230
    }

    @PostMapping(value = "/image/upload", headers = "content-type=multipart/form-data", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
wzp's avatar
wzp committed
231
    @RequiresAuthentication  //@RequiresPermissions("file:image:upload")
liqin's avatar
liqin committed
232
    @ApiOperation(value = "单图片上传(封面/缩略图)", notes = "单图片上传(封面/缩略图)")
liqin's avatar
liqin committed
233
    public Map<String, Object> uploadImage(@RequestParam(value = "file") MultipartFile uploadFile) throws Exception {
liqin's avatar
liqin committed
234 235
        if (uploadFile == null) {
            return getFailResult("没有文件可供上传");
liqin's avatar
liqin committed
236 237 238 239
        }
        String fileName = uploadFile.getOriginalFilename();
        String extension = FilenameUtils.getExtension(fileName);
        if (StringUtils.isBlank(extension)) {
wzp's avatar
wzp committed
240
            throw new InterfaceException(RESPONSE_CODE_ENUM.SERVER_ERROR.getResultCode(), "文件格式不支持");
liqin's avatar
liqin committed
241 242 243
        }
        boolean anyMatch = Arrays.stream(IMAGE_TYPE).anyMatch(s -> Objects.equals(s, extension.toUpperCase()));
        if (!anyMatch) {
wzp's avatar
wzp committed
244
            throw new InterfaceException(RESPONSE_CODE_ENUM.SERVER_ERROR.getResultCode(), "文件格式不支持");
liqin's avatar
liqin committed
245 246
        }

liqin's avatar
liqin committed
247 248 249 250
        final Set<MetaData> metaDataSet = new HashSet<>();
        metaDataSet.add(new MetaData("fileName", fileName));
        metaDataSet.add(new MetaData("fileType", FileTypeEnum.IMAGE.name()));
        String url = FastDFSUtils.uploadFile(uploadFile.getInputStream(), uploadFile.getSize(), fileName, metaDataSet);
liqin's avatar
liqin committed
251 252 253 254 255
        ImageUploadResult imageUploadResult = new ImageUploadResult();
        imageUploadResult.setFileName(fileName);
        imageUploadResult.setFileExtName(extension);
        imageUploadResult.setFileSize(uploadFile.getSize());
        imageUploadResult.setUrl(url);
liqin's avatar
liqin committed
256
        return getResult(imageUploadResult);
liqin's avatar
liqin committed
257 258
    }

259
    @PostMapping(value = "/upload/allType", headers = "content-type=multipart/form-data", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
wzp's avatar
wzp committed
260
    @RequiresAuthentication  //@RequiresPermissions("file:upload:allType")
261
    @ApiOperation(value = "单文件上传(不限格式)", notes = "单文件上传(不限格式)")
liqin's avatar
liqin committed
262
    public Map<String, Object> uploadAllType(@RequestParam(value = "file") MultipartFile uploadFile) throws Exception {
liqin's avatar
liqin committed
263 264
        if (uploadFile == null) {
            return getFailResult("没有文件可供上传");
265 266 267 268 269 270
        }
        String fileName = uploadFile.getOriginalFilename();
        String extension = FilenameUtils.getExtension(fileName);
        if (StringUtils.isBlank(extension)) {
            throw new InterfaceException(RESPONSE_CODE_ENUM.SERVER_ERROR.getResultCode(), "文件格式不支持");
        }
liqin's avatar
liqin committed
271 272 273
        final Set<MetaData> metaDataSet = new HashSet<>();
        metaDataSet.add(new MetaData("fileName", fileName));
        String url = FastDFSUtils.uploadFile(uploadFile.getInputStream(), uploadFile.getSize(), fileName, metaDataSet);
274 275 276 277 278
        ImageUploadResult imageUploadResult = new ImageUploadResult();
        imageUploadResult.setFileName(fileName);
        imageUploadResult.setFileExtName(extension);
        imageUploadResult.setFileSize(uploadFile.getSize());
        imageUploadResult.setUrl(url);
liqin's avatar
liqin committed
279
        return getResult(imageUploadResult);
280 281
    }

liqin's avatar
liqin committed
282 283 284 285
    @ApiImplicitParams({
            @ApiImplicitParam(name = "file", value = "音频文件", paramType = "form", dataType = "__file", collectionFormat = "array", allowMultiple = true)
    })
    @PostMapping(value = "/audio/upload", headers = "content-type=multipart/form-data", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
wzp's avatar
wzp committed
286
    @RequiresAuthentication  //@RequiresPermissions("audio:upload")
liqin's avatar
liqin committed
287
    @ApiOperation(value = "多音频上传", notes = "多音频上传")
liqin's avatar
liqin committed
288
    public Map<String, Object> uploadAudio(@RequestPart(value = "file", required = false) MultipartFile[] files) throws IOException {
wzp's avatar
wzp committed
289
        if (files == null || files.length == 0) {
liqin's avatar
liqin committed
290
            return getFailResult("没有文件可供上传");
liqin's avatar
liqin committed
291 292 293
        }
        final boolean existChineseAudio = Arrays.stream(files).anyMatch(s -> Objects.requireNonNull(s.getOriginalFilename()).contains("汉语"));
        if (!existChineseAudio) {
liqin's avatar
liqin committed
294
            return getFailResult("必须包含汉语音频");
liqin's avatar
liqin committed
295
        }
liqin's avatar
liqin committed
296
        if (files.length > 5) {
liqin's avatar
liqin committed
297
            return getFailResult("一种语言只能对应一个文件,只能上传包含5种语言的音频");
liqin's avatar
liqin committed
298
        }
liqin's avatar
liqin committed
299 300 301 302 303

        int successCount = 0;
        int failureCount = 0;
        List<BatchUploadResVO.HandleResult> handleList = new ArrayList<>();

liqin's avatar
liqin committed
304
        Set<Asset> fileList = new LinkedHashSet<>();
liqin's avatar
liqin committed
305 306 307 308 309 310 311 312 313 314 315 316
        for (MultipartFile file : files) {
            // 当前维度表下线结果
            BatchUploadResVO.HandleResult handleResult = new BatchUploadResVO.HandleResult();
            // 原始文件名
            String originalFilename = file.getOriginalFilename();
            if (StringUtils.isBlank(originalFilename)) {
                handleResult.setFileName("");
                handleResult.setFileType(FileTypeEnum.AUDIO.getName());
                handleResult.setFileUrl("");
                handleResult.setHandleResult(HANDLE_STATUS_ENUM.FAILURE.getName());
                handleResult.setDescription("文件名为空");
                failureCount++;
liqin's avatar
liqin committed
317
                handleList.add(handleResult);
liqin's avatar
liqin committed
318 319
                continue;
            }
liqin's avatar
liqin committed
320 321 322 323
            if (file.getSize() == 0L) {
                handleResult.setFileName("");
                handleResult.setFileUrl("");
                handleResult.setHandleResult(HANDLE_STATUS_ENUM.FAILURE.getName());
liqin's avatar
liqin committed
324
                handleResult.setDescription("文件" + originalFilename + "大小为0");
liqin's avatar
liqin committed
325
                failureCount++;
liqin's avatar
liqin committed
326
                handleList.add(handleResult);
liqin's avatar
liqin committed
327 328
                continue;
            }
liqin's avatar
liqin committed
329

liqin's avatar
liqin committed
330 331
            String extName = FilenameUtils.getExtension(originalFilename);
            boolean anyMatch = Arrays.stream(AUDIO_TYPE).anyMatch(s -> Objects.equals(s, extName.toUpperCase()));
liqin's avatar
liqin committed
332
            if (anyMatch) {
liqin's avatar
liqin committed
333 334 335 336 337
                String language = null;
                final Set<MetaData> metaDataSet = new HashSet<>();
                metaDataSet.add(new MetaData("fileName", originalFilename));
                metaDataSet.add(new MetaData("fileType", FileTypeEnum.AUDIO.name()));
                if (originalFilename.contains("汉语")) {
liqin's avatar
liqin committed
338 339
                    metaDataSet.add(new MetaData("language", LanguageEnum.ZH.name()));
                    language = LanguageEnum.ZH.name();
liqin's avatar
liqin committed
340
                } else if (originalFilename.contains("英语")) {
liqin's avatar
liqin committed
341 342
                    metaDataSet.add(new MetaData("language", LanguageEnum.EN.name()));
                    language = LanguageEnum.EN.name();
liqin's avatar
liqin committed
343
                } else if (originalFilename.contains("蒙语")) {
liqin's avatar
liqin committed
344 345
                    metaDataSet.add(new MetaData("language", LanguageEnum.MN.name()));
                    language = LanguageEnum.MN.name();
liqin's avatar
liqin committed
346
                } else if (originalFilename.contains("藏语")) {
liqin's avatar
liqin committed
347 348
                    metaDataSet.add(new MetaData("language", LanguageEnum.BO.name()));
                    language = LanguageEnum.BO.name();
liqin's avatar
liqin committed
349
                } else if (originalFilename.contains("维吾尔语")) {
liqin's avatar
liqin committed
350 351
                    metaDataSet.add(new MetaData("language", LanguageEnum.UYG.name()));
                    language = LanguageEnum.UYG.name();
liqin's avatar
liqin committed
352 353 354
                }
                String fileUrl = FastDFSUtils.uploadFile(file.getInputStream(), file.getSize(), originalFilename, metaDataSet);
                final FileInfo fileInfo = FastDFSUtils.getFileInfo(fileUrl);
liqin's avatar
liqin committed
355
                final int crc32 = fileInfo.getCrc32();
liqin's avatar
liqin committed
356
                final Asset one = this.assetService.getOne(Wrappers.<Asset>lambdaQuery().eq(Asset::getCrc32, (long) crc32).last(" limit 1"));
liqin's avatar
liqin committed
357
                final LocalDateTime createTime = TimeUtils.getDateTimeOfTimestamp(fileInfo.getCreateTime() * 1000);
liqin's avatar
liqin committed
358 359 360 361 362 363 364 365 366
                final long fileSize = fileInfo.getFileSize();
                final Asset asset = Asset.builder()
                        .fileName(originalFilename)
                        .fileExtName(extName)
                        .fileType(FileTypeEnum.AUDIO.name())
                        .fileUrl(fileUrl)
                        .fileSize(fileSize)
                        .fileCat(FileCatEnum.EXHIBITION_BOARD_AUDIO.name())
                        .language(language)
liqin's avatar
liqin committed
367
                        .crc32((long) crc32)
liqin's avatar
liqin committed
368 369 370
                        .createTime(createTime)
                        .updateTime(createTime)
                        .build();
liqin's avatar
liqin committed
371 372 373 374
                if (one != null) {
                    FastDFSUtils.deleteFile(fileUrl);
                    asset.setFileUrl(one.getFileUrl());
                }
liqin's avatar
liqin committed
375
                this.assetService.save(asset);
liqin's avatar
liqin committed
376
                fileList.add(asset);
liqin's avatar
liqin committed
377 378 379 380 381 382

                handleResult.setFileUrl(fileUrl);
                handleResult.setFileName(originalFilename);
                handleResult.setFileType(FileTypeEnum.AUDIO.getName());
                handleResult.setHandleResult(HANDLE_STATUS_ENUM.SUCCESS.getName());
                handleResult.setDescription("");
liqin's avatar
liqin committed
383 384 385
                successCount++;
            } else {
                handleResult.setFileUrl("");
liqin's avatar
liqin committed
386 387 388
                handleResult.setFileType(FileTypeEnum.AUDIO.getName());
                handleResult.setHandleResult(HANDLE_STATUS_ENUM.FAILURE.getName());
                handleResult.setDescription("文件" + originalFilename + "格式不支持");
liqin's avatar
liqin committed
389 390 391 392 393 394 395 396 397 398 399
                failureCount++;
            }
            // 设置处理的业务表信息
            handleList.add(handleResult);
        }

        BatchUploadResVO batchUploadResVO = new BatchUploadResVO();
        batchUploadResVO.setFailureCount(failureCount);
        batchUploadResVO.setSuccessCount(successCount);
        batchUploadResVO.setTotal(files.length);
        batchUploadResVO.setHandleList(handleList);
liqin's avatar
liqin committed
400
        batchUploadResVO.setFileList(fileList);
liqin's avatar
liqin committed
401
        return getResult(batchUploadResVO);
liqin's avatar
liqin committed
402 403
    }

liqin's avatar
liqin committed
404
    @ApiImplicitParams({
liqin's avatar
liqin committed
405
            @ApiImplicitParam(name = "file", value = "视频文件", paramType = "form", dataType = "__file", collectionFormat = "array", allowMultiple = true, required = true)
liqin's avatar
liqin committed
406
    })
liqin's avatar
liqin committed
407
    @PostMapping(value = "/video/content/upload", headers = "content-type=multipart/form-data", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
wzp's avatar
wzp committed
408
    @RequiresAuthentication  //@RequiresPermissions("file:video:content:upload")
liqin's avatar
liqin committed
409
    @ApiOperation(value = "展板视频上传", notes = "展板视频上传")
liqin's avatar
liqin committed
410
    public Map<String, Object> uploadContentVideo(@RequestPart("file") MultipartFile[] files) throws Exception {
liqin's avatar
liqin committed
411
        if (files == null || files.length == 0) {
liqin's avatar
liqin committed
412
            return getFailResult("没有文件可供上传");
liqin's avatar
liqin committed
413
        }
liqin's avatar
liqin committed
414 415 416 417 418 419 420
        if (files.length == 1) {
            String extName = FilenameUtils.getExtension(files[0].getOriginalFilename());
            boolean anyMatch = Arrays.stream(VIDEO_TYPE).anyMatch(s -> Objects.equals(s, extName.toUpperCase()));
            if (!anyMatch) {
                return getFailResult("目前仅支持" + String.join("、", VIDEO_TYPE) + "格式");
            }
        }
liqin's avatar
liqin committed
421
        final boolean matchChinese = Arrays.stream(files).anyMatch(s -> Objects.requireNonNull(s.getOriginalFilename()).contains("汉语"));
liqin's avatar
liqin committed
422
        if (!matchChinese) {
liqin's avatar
liqin committed
423
            return getFailResult("文件必须包含汉语视频");
liqin's avatar
liqin committed
424
        }
liqin's avatar
liqin committed
425
        if (files.length > 5) {
liqin's avatar
liqin committed
426
            return getFailResult("一种语言只能对应一个文件,只能上传包含5种语言的视频");
liqin's avatar
liqin committed
427
        }
liqin's avatar
liqin committed
428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470
        String videoContentName = null;
        String text;
        LCSUtil strie = null;
        final String[] fileBaseNameArray = Arrays.stream(files).map(x -> FilenameUtils.getBaseName(x.getOriginalFilename())).toArray(String[]::new);
        switch (fileBaseNameArray.length) {
            case 1:
                videoContentName = fileBaseNameArray[0];
                break;
            case 2:
                text = fileBaseNameArray[0] + SPLITTER_CHAR_2[0] + fileBaseNameArray[1] + SPLITTER_CHAR_2[1];
                strie = new LCSUtil(text, SPLITTER_CHAR_2);
                break;
            case 3:
                text = fileBaseNameArray[0] + SPLITTER_CHAR_3[0] + fileBaseNameArray[1] + SPLITTER_CHAR_3[1] + fileBaseNameArray[2] + SPLITTER_CHAR_3[2];
                strie = new LCSUtil(text, SPLITTER_CHAR_3);
                break;
            case 4:
                text = fileBaseNameArray[0] + SPLITTER_CHAR_4[0] + fileBaseNameArray[1] + SPLITTER_CHAR_4[1] + fileBaseNameArray[2] + SPLITTER_CHAR_4[2] + fileBaseNameArray[3] + SPLITTER_CHAR_4[3];
                strie = new LCSUtil(text, SPLITTER_CHAR_4);
                break;
            case 5:
                text = fileBaseNameArray[0] + SPLITTER_CHAR_5[0] + fileBaseNameArray[1] + SPLITTER_CHAR_5[1] + fileBaseNameArray[2] + SPLITTER_CHAR_5[2] + fileBaseNameArray[3] + SPLITTER_CHAR_5[3] + fileBaseNameArray[4] + SPLITTER_CHAR_5[4];
                strie = new LCSUtil(text, SPLITTER_CHAR_5);
                break;
            default:
                break;
        }
        if (strie != null) {
            strie.buildSuffixTree();
            videoContentName = strie.findLCS();
            if (StringUtils.isBlank(videoContentName)) {
                return getFailResult("请修改你的文件名并保持前缀一致后再上传");
            } else {
                videoContentName = StringUtils.removeEnd(videoContentName.trim(), "{");
                videoContentName = StringUtils.removeEnd(videoContentName.trim(), "[");
                videoContentName = StringUtils.removeEnd(videoContentName.trim(), "【");
                videoContentName = StringUtils.removeEnd(videoContentName.trim(), "(");
                videoContentName = StringUtils.removeEnd(videoContentName.trim(), "(");
                videoContentName = StringUtils.removeEnd(videoContentName.trim(), "-");
                videoContentName = StringUtils.removeEnd(videoContentName.trim(), "_");
                videoContentName = StringUtils.removeEnd(videoContentName.trim(), "之");
            }
        }
liqin's avatar
liqin committed
471 472 473 474 475

        int successCount = 0;
        int failureCount = 0;
        List<BatchUploadResVO.HandleResult> handleList = new ArrayList<>();

liqin's avatar
liqin committed
476
        Set<Asset> fileList = new LinkedHashSet<>();
liqin's avatar
liqin committed
477 478 479 480 481 482 483 484 485 486 487 488
        for (MultipartFile file : files) {
            // 当前维度表下线结果
            BatchUploadResVO.HandleResult handleResult = new BatchUploadResVO.HandleResult();
            // 原始文件名
            String originalFilename = file.getOriginalFilename();
            if (StringUtils.isBlank(originalFilename)) {
                handleResult.setFileName("");
                handleResult.setFileType(FileTypeEnum.VIDEO.getName());
                handleResult.setFileUrl("");
                handleResult.setHandleResult(HANDLE_STATUS_ENUM.FAILURE.getName());
                handleResult.setDescription("文件名为空");
                failureCount++;
liqin's avatar
liqin committed
489
                handleList.add(handleResult);
liqin's avatar
liqin committed
490 491
                continue;
            }
liqin's avatar
liqin committed
492 493 494 495
            if (file.getSize() == 0L) {
                handleResult.setFileName("");
                handleResult.setFileUrl("");
                handleResult.setHandleResult(HANDLE_STATUS_ENUM.FAILURE.getName());
liqin's avatar
liqin committed
496
                handleResult.setDescription("文件" + originalFilename + "大小为0");
liqin's avatar
liqin committed
497
                failureCount++;
liqin's avatar
liqin committed
498
                handleList.add(handleResult);
liqin's avatar
liqin committed
499 500
                continue;
            }
liqin's avatar
liqin committed
501 502

            final String baseName = FilenameUtils.getBaseName(originalFilename);
liqin's avatar
liqin committed
503
            String extName = FilenameUtils.getExtension(originalFilename);
liqin's avatar
liqin committed
504 505
            String finalExtName = extName;
            boolean anyMatch = Arrays.stream(VIDEO_TYPE).anyMatch(s -> Objects.equals(s, finalExtName.toUpperCase()));
liqin's avatar
liqin committed
506
            if (anyMatch) {
liqin's avatar
liqin committed
507
                if ("MPEG".equals(extName.toUpperCase()) || "MOV".equals(extName.toUpperCase())) {
liqin's avatar
liqin committed
508
                    extName = "mp4";
liqin's avatar
liqin committed
509
                    originalFilename = baseName + "." + extName;
liqin's avatar
liqin committed
510
                }
liqin's avatar
liqin committed
511 512 513 514 515
                String language = null;
                final Set<MetaData> metaDataSet = new HashSet<>();
                metaDataSet.add(new MetaData("fileName", originalFilename));
                metaDataSet.add(new MetaData("fileType", FileTypeEnum.VIDEO.name()));
                if (originalFilename.contains("汉语")) {
liqin's avatar
liqin committed
516 517
                    metaDataSet.add(new MetaData("language", LanguageEnum.ZH.name()));
                    language = LanguageEnum.ZH.name();
liqin's avatar
liqin committed
518
                } else if (originalFilename.contains("英语")) {
liqin's avatar
liqin committed
519 520
                    metaDataSet.add(new MetaData("language", LanguageEnum.EN.name()));
                    language = LanguageEnum.EN.name();
liqin's avatar
liqin committed
521
                } else if (originalFilename.contains("蒙语")) {
liqin's avatar
liqin committed
522 523
                    metaDataSet.add(new MetaData("language", LanguageEnum.MN.name()));
                    language = LanguageEnum.MN.name();
liqin's avatar
liqin committed
524
                } else if (originalFilename.contains("藏语")) {
liqin's avatar
liqin committed
525 526
                    metaDataSet.add(new MetaData("language", LanguageEnum.BO.name()));
                    language = LanguageEnum.BO.name();
liqin's avatar
liqin committed
527
                } else if (originalFilename.contains("维吾尔语")) {
liqin's avatar
liqin committed
528 529
                    metaDataSet.add(new MetaData("language", LanguageEnum.UYG.name()));
                    language = LanguageEnum.UYG.name();
liqin's avatar
liqin committed
530
                }
liqin's avatar
liqin committed
531 532 533 534 535 536
                final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
                IOUtils.copy(file.getInputStream(), byteArrayOutputStream);
                final String fileUrl = FastDFSUtils.uploadVideo(new ByteArrayInputStream(byteArrayOutputStream.toByteArray()), file.getSize(), originalFilename, metaDataSet);
                metaDataSet.add(new MetaData("fileName", baseName + ".chnmuseum"));
                final String fileUrlCrypto = FastDFSUtils.uploadVideo(VideoEncryptUtil.encrypt(new ByteArrayInputStream(byteArrayOutputStream.toByteArray()), VideoEncryptUtil.cipher), file.getSize(), baseName + ".chnmuseum", metaDataSet);
                final Set<MetaData> fileMetaData = FastDFSUtils.getFileMetaData(fileUrlCrypto);
liqin's avatar
liqin committed
537
                String md5 = fileMetaData.stream().filter(x -> "MD5".equals(x.getName())).map(MetaData::getValue).findFirst().get();
liqin's avatar
liqin committed
538

liqin's avatar
liqin committed
539 540
                final FileInfo fileInfo = FastDFSUtils.getFileInfo(fileUrl);
                final int crc32 = fileInfo.getCrc32();
liqin's avatar
liqin committed
541
                final Asset one = this.assetService.getOne(Wrappers.<Asset>lambdaQuery().eq(Asset::getCrc32, (long) crc32).last(" limit 1"));
liqin's avatar
liqin committed
542
                final LocalDateTime createTime = TimeUtils.getDateTimeOfTimestamp(fileInfo.getCreateTime() * 1000);
liqin's avatar
liqin committed
543 544 545
                final long fileSize = fileInfo.getFileSize();
                final Asset asset = Asset.builder()
                        .fileName(originalFilename)
liqin's avatar
liqin committed
546
                        .fileNameCrypto(baseName + ".chnmuseum")
liqin's avatar
liqin committed
547
                        .fileExtName(extName)
liqin's avatar
liqin committed
548
                        .fileType(FileTypeEnum.VIDEO.name())
liqin's avatar
liqin committed
549 550
                        .fileSize(fileSize)
                        .fileUrl(fileUrl)
liqin's avatar
liqin committed
551
                        .fileUrlCrypto(fileUrlCrypto)
liqin's avatar
liqin committed
552 553 554
                        .fileCat(FileCatEnum.VIDEO_CONTENT.name())
                        .language(language)
                        .md5(md5)
liqin's avatar
liqin committed
555
                        .crc32((long) crc32)
liqin's avatar
liqin committed
556
                        .videoContentName(videoContentName)
liqin's avatar
liqin committed
557 558 559
                        .createTime(createTime)
                        .updateTime(createTime)
                        .build();
liqin's avatar
liqin committed
560 561 562 563
                if (one != null) {
                    FastDFSUtils.deleteFile(fileUrl);
                    asset.setFileUrl(one.getFileUrl());
                }
liqin's avatar
liqin committed
564 565 566 567 568 569 570
                this.assetService.save(asset);
                fileList.add(asset);

                handleResult.setFileUrl(fileUrl);
                handleResult.setFileName(originalFilename);
                handleResult.setFileType(FileTypeEnum.VIDEO.getName());
                handleResult.setHandleResult(HANDLE_STATUS_ENUM.SUCCESS.getName());
liqin's avatar
liqin committed
571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595
                handleResult.setDescription("");
                successCount++;
            } else {
                handleResult.setFileUrl("");
                handleResult.setHandleResult("上传失败");
                handleResult.setDescription("文件" + originalFilename + "格式不支持");
                failureCount++;
            }
            // 设置处理的业务表信息
            handleList.add(handleResult);
        }

        BatchUploadResVO batchUploadResVO = new BatchUploadResVO();
        batchUploadResVO.setFailureCount(failureCount);
        batchUploadResVO.setSuccessCount(successCount);
        batchUploadResVO.setTotal(files.length);
        batchUploadResVO.setHandleList(handleList);
        batchUploadResVO.setFileList(fileList);
        return getResult(batchUploadResVO);
    }

    @ApiImplicitParams({
            @ApiImplicitParam(name = "file", value = "视频文件", paramType = "form", dataType = "__file", collectionFormat = "array", allowMultiple = true, required = true)
    })
    @PostMapping(value = "/video/upload", headers = "content-type=multipart/form-data", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
wzp's avatar
wzp committed
596
    @RequiresAuthentication  //@RequiresPermissions("file:video:upload")
liqin's avatar
liqin committed
597 598 599
    @ApiOperation(value = "多视频上传", notes = "多视频上传")
    public Map<String, Object> uploadVideo(@RequestPart("file") MultipartFile[] files) throws IOException {
        if (files == null || files.length == 0) {
liqin's avatar
liqin committed
600
            return getFailResult("没有文件可供上传");
liqin's avatar
liqin committed
601
        }
liqin's avatar
liqin committed
602 603 604 605 606 607 608
        if (files.length == 1) {
            String extName = FilenameUtils.getExtension(files[0].getOriginalFilename());
            boolean anyMatch = Arrays.stream(VIDEO_TYPE).anyMatch(s -> Objects.equals(s, extName.toUpperCase()));
            if (!anyMatch) {
                return getFailResult("目前仅支持" + String.join("、", VIDEO_TYPE) + "格式");
            }
        }
liqin's avatar
liqin committed
609 610 611 612 613

        int successCount = 0;
        int failureCount = 0;
        List<BatchUploadResVO.HandleResult> handleList = new ArrayList<>();

liqin's avatar
liqin committed
614
        Set<Asset> fileList = new LinkedHashSet<>();
liqin's avatar
liqin committed
615 616 617 618 619 620 621 622 623 624 625 626
        for (MultipartFile file : files) {
            // 当前维度表下线结果
            BatchUploadResVO.HandleResult handleResult = new BatchUploadResVO.HandleResult();
            // 原始文件名
            String originalFilename = file.getOriginalFilename();
            if (StringUtils.isBlank(originalFilename)) {
                handleResult.setFileName("");
                handleResult.setFileType(FileTypeEnum.VIDEO.getName());
                handleResult.setFileUrl("");
                handleResult.setHandleResult(HANDLE_STATUS_ENUM.FAILURE.getName());
                handleResult.setDescription("文件名为空");
                failureCount++;
liqin's avatar
liqin committed
627
                handleList.add(handleResult);
liqin's avatar
liqin committed
628 629
                continue;
            }
liqin's avatar
liqin committed
630 631 632 633
            if (file.getSize() == 0L) {
                handleResult.setFileName("");
                handleResult.setFileUrl("");
                handleResult.setHandleResult(HANDLE_STATUS_ENUM.FAILURE.getName());
liqin's avatar
liqin committed
634
                handleResult.setDescription("文件" + originalFilename + "大小为0");
liqin's avatar
liqin committed
635
                failureCount++;
liqin's avatar
liqin committed
636
                handleList.add(handleResult);
liqin's avatar
liqin committed
637 638
                continue;
            }
liqin's avatar
liqin committed
639 640

            String extName = FilenameUtils.getExtension(originalFilename);
liqin's avatar
liqin committed
641 642
            String finalExtName = extName;
            boolean anyMatch = Arrays.stream(VIDEO_TYPE).anyMatch(s -> Objects.equals(s, finalExtName.toUpperCase()));
liqin's avatar
liqin committed
643
            if (anyMatch) {
liqin's avatar
liqin committed
644
                if ("MPEG".equals(extName.toUpperCase()) || "MOV".equals(extName.toUpperCase())) {
liqin's avatar
liqin committed
645 646 647
                    extName = "mp4";
                    originalFilename = FilenameUtils.getBaseName(originalFilename) + "." + extName;
                }
liqin's avatar
liqin committed
648 649 650
                final Set<MetaData> metaDataSet = new HashSet<>();
                metaDataSet.add(new MetaData("fileName", originalFilename));
                metaDataSet.add(new MetaData("fileType", FileTypeEnum.VIDEO.name()));
liqin's avatar
liqin committed
651
                final String fileUrl = FastDFSUtils.uploadFile(file.getInputStream(), file.getSize(), originalFilename, metaDataSet);
liqin's avatar
liqin committed
652 653 654 655 656
                final FileInfo fileInfo = FastDFSUtils.getFileInfo(fileUrl);
                final Asset asset = Asset.builder()
                        .fileName(originalFilename)
                        .fileExtName(extName)
                        .fileType(FileTypeEnum.VIDEO.name())
liqin's avatar
liqin committed
657
                        .fileSize(fileInfo.getFileSize())
liqin's avatar
liqin committed
658 659
                        .fileUrl(fileUrl)
                        .fileCat(FileCatEnum.VIEWING_INTERACTION.name())
liqin's avatar
liqin committed
660
                        .crc32((long) fileInfo.getCrc32())
liqin's avatar
liqin committed
661 662 663 664 665 666 667
                        .build();
                this.assetService.save(asset);
                fileList.add(asset);

                handleResult.setFileUrl(fileUrl);
                handleResult.setFileName(originalFilename);
                handleResult.setFileType(FileTypeEnum.VIDEO.getName());
liqin's avatar
liqin committed
668 669
                handleResult.setHandleResult(HANDLE_STATUS_ENUM.SUCCESS.getName());
                handleResult.setDescription("");
liqin's avatar
liqin committed
670 671 672
                successCount++;
            } else {
                handleResult.setFileUrl("");
liqin's avatar
liqin committed
673 674
                handleResult.setHandleResult("上传失败");
                handleResult.setDescription("文件" + originalFilename + "格式不支持");
liqin's avatar
liqin committed
675 676 677 678 679 680 681 682 683 684 685
                failureCount++;
            }
            // 设置处理的业务表信息
            handleList.add(handleResult);
        }

        BatchUploadResVO batchUploadResVO = new BatchUploadResVO();
        batchUploadResVO.setFailureCount(failureCount);
        batchUploadResVO.setSuccessCount(successCount);
        batchUploadResVO.setTotal(files.length);
        batchUploadResVO.setHandleList(handleList);
liqin's avatar
liqin committed
686
        batchUploadResVO.setFileList(fileList);
liqin's avatar
liqin committed
687
        return getResult(batchUploadResVO);
liqin's avatar
liqin committed
688 689 690
    }

}