FileUploadController.java 31.7 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.TimeUtils;
liqin's avatar
liqin committed
8 9
import cn.wisenergy.chnmuseum.party.common.vo.BatchUploadResVO;
import cn.wisenergy.chnmuseum.party.common.vo.ImageUploadResult;
liqin's avatar
liqin committed
10 11
import cn.wisenergy.chnmuseum.party.model.Asset;
import cn.wisenergy.chnmuseum.party.service.AssetService;
liqin's avatar
liqin committed
12
import cn.wisenergy.chnmuseum.party.web.controller.base.BaseController;
liqin's avatar
liqin committed
13
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
liqin's avatar
liqin committed
14 15
import com.github.tobato.fastdfs.domain.fdfs.FileInfo;
import com.github.tobato.fastdfs.domain.fdfs.MetaData;
liqin's avatar
liqin committed
16
import io.swagger.annotations.Api;
liqin's avatar
liqin committed
17 18 19 20 21 22
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;
import org.apache.commons.lang3.StringUtils;
wzp's avatar
wzp committed
23
import org.apache.shiro.authz.annotation.RequiresAuthentication;
liqin's avatar
liqin committed
24 25 26 27
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

liqin's avatar
liqin committed
28
import javax.annotation.Resource;
liqin's avatar
liqin committed
29
import java.io.IOException;
liqin's avatar
liqin committed
30
import java.time.LocalDateTime;
liqin's avatar
liqin committed
31
import java.util.*;
liqin's avatar
liqin committed
32 33 34 35 36 37 38 39 40 41 42 43

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

    private static final String[] IMAGE_TYPE = new String[]{"JPG", "JPEG", "PNG", "BMP", "WBMP"};
liqin's avatar
liqin committed
48
    private static final String[] AUDIO_TYPE = new String[]{"MP3", "AAC", "WMA", "FLAC", "RM", "OGG"};
liqin's avatar
liqin committed
49
    private static final String[] VIDEO_TYPE = new String[]{"MP4", "FLV"};
liqin's avatar
liqin committed
50
    private static final String[] DOC_TYPE = new String[]{"PDF", "DOC", "DOCX", "PPT", "PPTX", "XLS", "XLSX"};
liqin's avatar
liqin committed
51
    private static final String[] DATUM_TYPE = ArrayUtil.addAll(DOC_TYPE, IMAGE_TYPE, VIDEO_TYPE);
liqin's avatar
liqin committed
52

liqin's avatar
liqin committed
53 54 55 56 57
    @Resource
    private AssetService assetService;

    @ApiOperation(value = "根据文件ID刪除文件", notes = "根据文件ID刪除文件")
    @DeleteMapping(value = "/delete/{id}")
wzp's avatar
wzp committed
58
    @RequiresAuthentication  //@RequiresPermissions("file:delete")
liqin's avatar
liqin committed
59
    public Map<String, Object> delete(@PathVariable(value = "id") String id) {
liqin's avatar
liqin committed
60 61 62 63 64
        final Asset asset = assetService.getById(id);
        if (asset != null) {
            final String fileUrl = asset.getFileUrl();
            FastDFSUtils.deleteFile(fileUrl);
            this.assetService.removeById(id);
liqin's avatar
liqin committed
65 66
            return getSuccessResult();

liqin's avatar
liqin committed
67
        }
liqin's avatar
liqin committed
68
        return getFailResult();
liqin's avatar
liqin committed
69
    }
liqin's avatar
liqin committed
70

liqin's avatar
liqin committed
71
    @ApiImplicitParams({
liqin's avatar
liqin committed
72
            @ApiImplicitParam(name = "file", value = "资料", paramType = "form", dataType = "__file", collectionFormat = "array", allowMultiple = true)
liqin's avatar
liqin committed
73
    })
liqin's avatar
liqin committed
74
    @PostMapping(value = "/datum/upload", headers = "content-type=multipart/form-data", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
liqin's avatar
liqin committed
75
    @ApiOperation(value = "展板资料上传", notes = "展板资料上传")
liqin's avatar
liqin committed
76
    public Map<String, Object> uploadFile(@RequestPart(value = "file", required = false) MultipartFile[] files) throws IOException {
liqin's avatar
liqin committed
77 78
        if (files == null || files.length == 0) {
            return getFailResult("没有文件可供上传");
liqin's avatar
liqin committed
79 80 81 82 83
        }
        int successCount = 0;
        int failureCount = 0;
        List<BatchUploadResVO.HandleResult> handleList = new ArrayList<>();

liqin's avatar
liqin committed
84
        Set<Asset> datumUrlList = new LinkedHashSet<>();
liqin's avatar
liqin committed
85 86 87 88 89 90 91 92 93 94 95
        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
96
                handleList.add(handleResult);
liqin's avatar
liqin committed
97 98
                continue;
            }
liqin's avatar
liqin committed
99 100 101 102
            if (file.getSize() == 0L) {
                handleResult.setFileName("");
                handleResult.setFileUrl("");
                handleResult.setHandleResult(HANDLE_STATUS_ENUM.FAILURE.getName());
liqin's avatar
liqin committed
103
                handleResult.setDescription("文件" + originalFilename + "大小为0");
liqin's avatar
liqin committed
104
                failureCount++;
liqin's avatar
liqin committed
105
                handleList.add(handleResult);
liqin's avatar
liqin committed
106 107
                continue;
            }
liqin's avatar
liqin committed
108

liqin's avatar
liqin committed
109 110
            String extName = FilenameUtils.getExtension(originalFilename);
            boolean anyMatch = Arrays.stream(DATUM_TYPE).anyMatch(s -> Objects.equals(s, extName.toUpperCase()));
liqin's avatar
liqin committed
111
            if (anyMatch) {
liqin's avatar
liqin committed
112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
                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));
                if (Arrays.stream(VIDEO_TYPE).anyMatch(s -> Objects.equals(s, extName.toUpperCase()))) {
                    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);
                } else if (Arrays.stream(AUDIO_TYPE).anyMatch(s -> Objects.equals(s, extName.toUpperCase()))) {
                    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);
                } else if (Arrays.stream(IMAGE_TYPE).anyMatch(s -> Objects.equals(s, extName.toUpperCase()))) {
                    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);
                } else if (Arrays.stream(DOC_TYPE).anyMatch(s -> Objects.equals(s, extName.toUpperCase()))) {
                    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
145
                }
liqin's avatar
liqin committed
146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163

                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
164
                final FileInfo fileInfo = FastDFSUtils.getFileInfo(fileUrl);
liqin's avatar
liqin committed
165
                final int crc32 = fileInfo.getCrc32();
liqin's avatar
liqin committed
166 167
                final Asset one = this.assetService.getOne(Wrappers.<Asset>lambdaQuery().eq(Asset::getCrc32, (long) crc32));

liqin's avatar
liqin committed
168
                final LocalDateTime createTime = TimeUtils.getDateTimeOfTimestamp(fileInfo.getCreateTime() * 1000);
liqin's avatar
liqin committed
169 170 171
                asset.setFileSize(fileInfo.getFileSize());
                asset.setFileUrl(fileUrl);
                asset.setFileCat(FileCatEnum.EXHIBITION_BOARD_DATUM.name());
liqin's avatar
liqin committed
172
                asset.setLanguage(language);
liqin's avatar
liqin committed
173
                asset.setCrc32((long) crc32);
wzp's avatar
wzp committed
174
                asset.setDeleted(false);
liqin's avatar
liqin committed
175 176
                asset.setCreateTime(createTime);
                asset.setUpdateTime(createTime);
liqin's avatar
liqin committed
177 178 179
                if (one != null) {
                    FastDFSUtils.deleteFile(fileUrl);
                    asset.setFileUrl(one.getFileUrl());
liqin's avatar
liqin committed
180
                    asset.setCrc32(null);
liqin's avatar
liqin committed
181
                }
liqin's avatar
liqin committed
182 183 184 185 186 187 188
                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
189 190 191
                successCount++;
            } else {
                handleResult.setFileUrl("");
liqin's avatar
liqin committed
192
                handleResult.setDescription("文件" + originalFilename + "格式不支持");
liqin's avatar
liqin committed
193 194 195 196 197 198 199 200 201 202
                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
203
        batchUploadResVO.setFileList(datumUrlList);
liqin's avatar
liqin committed
204 205 206 207

        if (failureCount > 0) {
            return getFailResult(batchUploadResVO);
        }
liqin's avatar
liqin committed
208
        return getResult(batchUploadResVO);
liqin's avatar
liqin committed
209 210 211
    }

    @PostMapping(value = "/image/upload", headers = "content-type=multipart/form-data", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
wzp's avatar
wzp committed
212
    @RequiresAuthentication  //@RequiresPermissions("file:image:upload")
liqin's avatar
liqin committed
213
    @ApiOperation(value = "单图片上传(封面/缩略图)", notes = "单图片上传(封面/缩略图)")
liqin's avatar
liqin committed
214
    public Map<String, Object> uploadImage(@RequestParam(value = "file") MultipartFile uploadFile) throws Exception {
liqin's avatar
liqin committed
215 216
        if (uploadFile == null) {
            return getFailResult("没有文件可供上传");
liqin's avatar
liqin committed
217 218 219 220
        }
        String fileName = uploadFile.getOriginalFilename();
        String extension = FilenameUtils.getExtension(fileName);
        if (StringUtils.isBlank(extension)) {
wzp's avatar
wzp committed
221
            throw new InterfaceException(RESPONSE_CODE_ENUM.SERVER_ERROR.getResultCode(), "文件格式不支持");
liqin's avatar
liqin committed
222 223 224
        }
        boolean anyMatch = Arrays.stream(IMAGE_TYPE).anyMatch(s -> Objects.equals(s, extension.toUpperCase()));
        if (!anyMatch) {
wzp's avatar
wzp committed
225
            throw new InterfaceException(RESPONSE_CODE_ENUM.SERVER_ERROR.getResultCode(), "文件格式不支持");
liqin's avatar
liqin committed
226 227
        }

liqin's avatar
liqin committed
228 229 230 231
        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
232 233 234 235 236
        ImageUploadResult imageUploadResult = new ImageUploadResult();
        imageUploadResult.setFileName(fileName);
        imageUploadResult.setFileExtName(extension);
        imageUploadResult.setFileSize(uploadFile.getSize());
        imageUploadResult.setUrl(url);
liqin's avatar
liqin committed
237
        return getResult(imageUploadResult);
liqin's avatar
liqin committed
238 239
    }

240
    @PostMapping(value = "/upload/allType", headers = "content-type=multipart/form-data", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
wzp's avatar
wzp committed
241
    @RequiresAuthentication  //@RequiresPermissions("file:upload:allType")
242
    @ApiOperation(value = "单文件上传(不限格式)", notes = "单文件上传(不限格式)")
liqin's avatar
liqin committed
243
    public Map<String, Object> uploadAllType(@RequestParam(value = "file") MultipartFile uploadFile) throws Exception {
liqin's avatar
liqin committed
244 245
        if (uploadFile == null) {
            return getFailResult("没有文件可供上传");
246 247 248 249 250 251
        }
        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
252 253 254
        final Set<MetaData> metaDataSet = new HashSet<>();
        metaDataSet.add(new MetaData("fileName", fileName));
        String url = FastDFSUtils.uploadFile(uploadFile.getInputStream(), uploadFile.getSize(), fileName, metaDataSet);
255 256 257 258 259
        ImageUploadResult imageUploadResult = new ImageUploadResult();
        imageUploadResult.setFileName(fileName);
        imageUploadResult.setFileExtName(extension);
        imageUploadResult.setFileSize(uploadFile.getSize());
        imageUploadResult.setUrl(url);
liqin's avatar
liqin committed
260
        return getResult(imageUploadResult);
261 262
    }

liqin's avatar
liqin committed
263 264 265 266
    @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
267
    @RequiresAuthentication  //@RequiresPermissions("audio:upload")
liqin's avatar
liqin committed
268
    @ApiOperation(value = "多音频上传", notes = "多音频上传")
liqin's avatar
liqin committed
269
    public Map<String, Object> uploadAudio(@RequestPart(value = "file", required = false) MultipartFile[] files) throws IOException {
wzp's avatar
wzp committed
270
        if (files == null || files.length == 0) {
liqin's avatar
liqin committed
271
            return getFailResult("没有文件可供上传");
liqin's avatar
liqin committed
272 273 274
        }
        final boolean existChineseAudio = Arrays.stream(files).anyMatch(s -> Objects.requireNonNull(s.getOriginalFilename()).contains("汉语"));
        if (!existChineseAudio) {
wzp's avatar
wzp committed
275
            throw new InterfaceException(RESPONSE_CODE_ENUM.SERVER_ERROR.getResultCode(), "必须包含汉语音频");
liqin's avatar
liqin committed
276 277 278 279 280 281
        }

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

liqin's avatar
liqin committed
282
        Set<Asset> fileList = new LinkedHashSet<>();
liqin's avatar
liqin committed
283 284 285 286 287 288 289 290 291 292 293 294
        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
295
                handleList.add(handleResult);
liqin's avatar
liqin committed
296 297
                continue;
            }
liqin's avatar
liqin committed
298 299 300 301
            if (file.getSize() == 0L) {
                handleResult.setFileName("");
                handleResult.setFileUrl("");
                handleResult.setHandleResult(HANDLE_STATUS_ENUM.FAILURE.getName());
liqin's avatar
liqin committed
302
                handleResult.setDescription("文件" + originalFilename + "大小为0");
liqin's avatar
liqin committed
303
                failureCount++;
liqin's avatar
liqin committed
304
                handleList.add(handleResult);
liqin's avatar
liqin committed
305 306
                continue;
            }
liqin's avatar
liqin committed
307

liqin's avatar
liqin committed
308 309
            String extName = FilenameUtils.getExtension(originalFilename);
            boolean anyMatch = Arrays.stream(AUDIO_TYPE).anyMatch(s -> Objects.equals(s, extName.toUpperCase()));
liqin's avatar
liqin committed
310
            if (anyMatch) {
liqin's avatar
liqin committed
311 312 313 314 315
                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
316 317
                    metaDataSet.add(new MetaData("language", LanguageEnum.ZH.name()));
                    language = LanguageEnum.ZH.name();
liqin's avatar
liqin committed
318
                } else if (originalFilename.contains("英语")) {
liqin's avatar
liqin committed
319 320
                    metaDataSet.add(new MetaData("language", LanguageEnum.EN.name()));
                    language = LanguageEnum.EN.name();
liqin's avatar
liqin committed
321
                } else if (originalFilename.contains("蒙语")) {
liqin's avatar
liqin committed
322 323
                    metaDataSet.add(new MetaData("language", LanguageEnum.MN.name()));
                    language = LanguageEnum.MN.name();
liqin's avatar
liqin committed
324
                } else if (originalFilename.contains("藏语")) {
liqin's avatar
liqin committed
325 326
                    metaDataSet.add(new MetaData("language", LanguageEnum.BO.name()));
                    language = LanguageEnum.BO.name();
liqin's avatar
liqin committed
327
                } else if (originalFilename.contains("维吾尔语")) {
liqin's avatar
liqin committed
328 329
                    metaDataSet.add(new MetaData("language", LanguageEnum.UYG.name()));
                    language = LanguageEnum.UYG.name();
liqin's avatar
liqin committed
330 331 332
                }
                String fileUrl = FastDFSUtils.uploadFile(file.getInputStream(), file.getSize(), originalFilename, metaDataSet);
                final FileInfo fileInfo = FastDFSUtils.getFileInfo(fileUrl);
liqin's avatar
liqin committed
333
                final int crc32 = fileInfo.getCrc32();
liqin's avatar
liqin committed
334
                final Asset one = this.assetService.getOne(Wrappers.<Asset>lambdaQuery().eq(Asset::getCrc32, (long) crc32));
liqin's avatar
liqin committed
335
                final LocalDateTime createTime = TimeUtils.getDateTimeOfTimestamp(fileInfo.getCreateTime() * 1000);
liqin's avatar
liqin committed
336 337 338 339 340 341 342 343 344
                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
345
                        .crc32((long) crc32)
wzp's avatar
wzp committed
346
                        .deleted(false)
liqin's avatar
liqin committed
347 348 349
                        .createTime(createTime)
                        .updateTime(createTime)
                        .build();
liqin's avatar
liqin committed
350 351 352
                if (one != null) {
                    FastDFSUtils.deleteFile(fileUrl);
                    asset.setFileUrl(one.getFileUrl());
liqin's avatar
liqin committed
353
                    asset.setCrc32(null);
liqin's avatar
liqin committed
354
                }
liqin's avatar
liqin committed
355
                this.assetService.save(asset);
liqin's avatar
liqin committed
356
                fileList.add(asset);
liqin's avatar
liqin committed
357 358 359 360 361 362

                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
363 364 365
                successCount++;
            } else {
                handleResult.setFileUrl("");
liqin's avatar
liqin committed
366 367 368
                handleResult.setFileType(FileTypeEnum.AUDIO.getName());
                handleResult.setHandleResult(HANDLE_STATUS_ENUM.FAILURE.getName());
                handleResult.setDescription("文件" + originalFilename + "格式不支持");
liqin's avatar
liqin committed
369 370 371 372 373 374 375 376 377 378 379
                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
380
        batchUploadResVO.setFileList(fileList);
liqin's avatar
liqin committed
381
        return getResult(batchUploadResVO);
liqin's avatar
liqin committed
382 383
    }

liqin's avatar
liqin committed
384
    @ApiImplicitParams({
liqin's avatar
liqin committed
385
            @ApiImplicitParam(name = "file", value = "视频文件", paramType = "form", dataType = "__file", collectionFormat = "array", allowMultiple = true, required = true)
liqin's avatar
liqin committed
386
    })
liqin's avatar
liqin committed
387
    @PostMapping(value = "/video/content/upload", headers = "content-type=multipart/form-data", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
wzp's avatar
wzp committed
388
    @RequiresAuthentication  //@RequiresPermissions("file:video:content:upload")
liqin's avatar
liqin committed
389
    @ApiOperation(value = "展板视频上传", notes = "展板视频上传")
liqin's avatar
liqin committed
390
    public Map<String, Object> uploadContentVideo(@RequestPart("file") MultipartFile[] files) throws Exception {
liqin's avatar
liqin committed
391
        if (files == null || files.length == 0) {
liqin's avatar
liqin committed
392
            return getFailResult("没有文件可供上传");
liqin's avatar
liqin committed
393
        }
liqin's avatar
liqin committed
394
        final boolean matchChinese = Arrays.stream(files).anyMatch(s -> Objects.requireNonNull(s.getOriginalFilename()).contains("汉语"));
liqin's avatar
liqin committed
395
        if (!matchChinese) {
liqin's avatar
liqin committed
396
            throw new InterfaceException(RESPONSE_CODE_ENUM.SERVER_ERROR.getResultCode(), "文件必须包含汉语视频");
liqin's avatar
liqin committed
397 398 399 400 401 402
        }

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

liqin's avatar
liqin committed
403
        Set<Asset> fileList = new LinkedHashSet<>();
liqin's avatar
liqin committed
404 405 406 407 408 409 410 411 412 413 414 415
        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
416
                handleList.add(handleResult);
liqin's avatar
liqin committed
417 418
                continue;
            }
liqin's avatar
liqin committed
419 420 421 422
            if (file.getSize() == 0L) {
                handleResult.setFileName("");
                handleResult.setFileUrl("");
                handleResult.setHandleResult(HANDLE_STATUS_ENUM.FAILURE.getName());
liqin's avatar
liqin committed
423
                handleResult.setDescription("文件" + originalFilename + "大小为0");
liqin's avatar
liqin committed
424
                failureCount++;
liqin's avatar
liqin committed
425
                handleList.add(handleResult);
liqin's avatar
liqin committed
426 427
                continue;
            }
liqin's avatar
liqin committed
428

liqin's avatar
liqin committed
429 430
            String extName = FilenameUtils.getExtension(originalFilename);
            boolean anyMatch = Arrays.stream(VIDEO_TYPE).anyMatch(s -> Objects.equals(s, extName.toUpperCase()));
liqin's avatar
liqin committed
431
            if (anyMatch) {
liqin's avatar
liqin committed
432 433 434 435 436
                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
437 438
                    metaDataSet.add(new MetaData("language", LanguageEnum.ZH.name()));
                    language = LanguageEnum.ZH.name();
liqin's avatar
liqin committed
439
                } else if (originalFilename.contains("英语")) {
liqin's avatar
liqin committed
440 441
                    metaDataSet.add(new MetaData("language", LanguageEnum.EN.name()));
                    language = LanguageEnum.EN.name();
liqin's avatar
liqin committed
442
                } else if (originalFilename.contains("蒙语")) {
liqin's avatar
liqin committed
443 444
                    metaDataSet.add(new MetaData("language", LanguageEnum.MN.name()));
                    language = LanguageEnum.MN.name();
liqin's avatar
liqin committed
445
                } else if (originalFilename.contains("藏语")) {
liqin's avatar
liqin committed
446 447
                    metaDataSet.add(new MetaData("language", LanguageEnum.BO.name()));
                    language = LanguageEnum.BO.name();
liqin's avatar
liqin committed
448
                } else if (originalFilename.contains("维吾尔语")) {
liqin's avatar
liqin committed
449 450
                    metaDataSet.add(new MetaData("language", LanguageEnum.UYG.name()));
                    language = LanguageEnum.UYG.name();
liqin's avatar
liqin committed
451 452 453 454
                }
                String 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();
liqin's avatar
liqin committed
455 456
                final FileInfo fileInfo = FastDFSUtils.getFileInfo(fileUrl);
                final int crc32 = fileInfo.getCrc32();
liqin's avatar
liqin committed
457
                final Asset one = this.assetService.getOne(Wrappers.<Asset>lambdaQuery().eq(Asset::getCrc32, (long) crc32));
liqin's avatar
liqin committed
458
                final LocalDateTime createTime = TimeUtils.getDateTimeOfTimestamp(fileInfo.getCreateTime() * 1000);
liqin's avatar
liqin committed
459 460 461 462
                final long fileSize = fileInfo.getFileSize();
                final Asset asset = Asset.builder()
                        .fileName(originalFilename)
                        .fileExtName(extName)
liqin's avatar
liqin committed
463
                        .fileType(FileTypeEnum.VIDEO.name())
liqin's avatar
liqin committed
464 465 466 467 468
                        .fileSize(fileSize)
                        .fileUrl(fileUrl)
                        .fileCat(FileCatEnum.VIDEO_CONTENT.name())
                        .language(language)
                        .md5(md5)
wzp's avatar
wzp committed
469
                        .deleted(false)
liqin's avatar
liqin committed
470
                        .crc32((long) crc32)
liqin's avatar
liqin committed
471 472 473
                        .createTime(createTime)
                        .updateTime(createTime)
                        .build();
liqin's avatar
liqin committed
474 475 476
                if (one != null) {
                    FastDFSUtils.deleteFile(fileUrl);
                    asset.setFileUrl(one.getFileUrl());
liqin's avatar
liqin committed
477
                    asset.setCrc32(null);
liqin's avatar
liqin committed
478
                }
liqin's avatar
liqin committed
479 480 481 482 483 484 485
                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
486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510
                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
511
    @RequiresAuthentication  //@RequiresPermissions("file:video:upload")
liqin's avatar
liqin committed
512 513 514
    @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
515
            return getFailResult("没有文件可供上传");
liqin's avatar
liqin committed
516 517 518 519 520 521
        }

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

liqin's avatar
liqin committed
522
        Set<Asset> fileList = new LinkedHashSet<>();
liqin's avatar
liqin committed
523 524 525 526 527 528 529 530 531 532 533 534
        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
535
                handleList.add(handleResult);
liqin's avatar
liqin committed
536 537
                continue;
            }
liqin's avatar
liqin committed
538 539 540 541
            if (file.getSize() == 0L) {
                handleResult.setFileName("");
                handleResult.setFileUrl("");
                handleResult.setHandleResult(HANDLE_STATUS_ENUM.FAILURE.getName());
liqin's avatar
liqin committed
542
                handleResult.setDescription("文件" + originalFilename + "大小为0");
liqin's avatar
liqin committed
543
                failureCount++;
liqin's avatar
liqin committed
544
                handleList.add(handleResult);
liqin's avatar
liqin committed
545 546
                continue;
            }
liqin's avatar
liqin committed
547 548 549 550 551 552 553 554 555 556

            String extName = FilenameUtils.getExtension(originalFilename);
            boolean anyMatch = Arrays.stream(VIDEO_TYPE).anyMatch(s -> Objects.equals(s, extName.toUpperCase()));
            if (anyMatch) {
                String language = null;
                final Set<MetaData> metaDataSet = new HashSet<>();
                metaDataSet.add(new MetaData("fileName", originalFilename));
                metaDataSet.add(new MetaData("fileType", FileTypeEnum.VIDEO.name()));
                String fileUrl = FastDFSUtils.uploadFile(file.getInputStream(), file.getSize(), originalFilename, metaDataSet);
                final FileInfo fileInfo = FastDFSUtils.getFileInfo(fileUrl);
liqin's avatar
liqin committed
557
                final int crc32 = fileInfo.getCrc32();
liqin's avatar
liqin committed
558
                final Asset one = this.assetService.getOne(Wrappers.<Asset>lambdaQuery().eq(Asset::getCrc32, (long) crc32));
liqin's avatar
liqin committed
559

liqin's avatar
liqin committed
560 561 562 563 564 565 566 567 568
                final long fileSize = fileInfo.getFileSize();
                final Asset asset = Asset.builder()
                        .fileName(originalFilename)
                        .fileExtName(extName)
                        .fileType(FileTypeEnum.VIDEO.name())
                        .fileSize(fileSize)
                        .fileUrl(fileUrl)
                        .fileCat(FileCatEnum.VIEWING_INTERACTION.name())
                        .language(language)
liqin's avatar
liqin committed
569
                        .crc32((long) crc32)
wzp's avatar
wzp committed
570
                        .deleted(false)
liqin's avatar
liqin committed
571
                        .build();
liqin's avatar
liqin committed
572 573 574
                if (one != null) {
                    FastDFSUtils.deleteFile(fileUrl);
                    asset.setFileUrl(one.getFileUrl());
liqin's avatar
liqin committed
575
                    asset.setCrc32(null);
liqin's avatar
liqin committed
576
                }
liqin's avatar
liqin committed
577 578 579 580 581 582
                this.assetService.save(asset);
                fileList.add(asset);

                handleResult.setFileUrl(fileUrl);
                handleResult.setFileName(originalFilename);
                handleResult.setFileType(FileTypeEnum.VIDEO.getName());
liqin's avatar
liqin committed
583 584
                handleResult.setHandleResult(HANDLE_STATUS_ENUM.SUCCESS.getName());
                handleResult.setDescription("");
liqin's avatar
liqin committed
585 586 587
                successCount++;
            } else {
                handleResult.setFileUrl("");
liqin's avatar
liqin committed
588 589
                handleResult.setHandleResult("上传失败");
                handleResult.setDescription("文件" + originalFilename + "格式不支持");
liqin's avatar
liqin committed
590 591 592 593 594 595 596 597 598 599 600
                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
601
        batchUploadResVO.setFileList(fileList);
liqin's avatar
liqin committed
602
        return getResult(batchUploadResVO);
liqin's avatar
liqin committed
603 604 605
    }

}