FileUploadController.java 32.8 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 com.github.tobato.fastdfs.exception.FdfsServerException;
liqin's avatar
liqin committed
17
import io.swagger.annotations.Api;
liqin's avatar
liqin committed
18 19 20 21 22 23
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
24
import org.apache.shiro.authz.annotation.RequiresAuthentication;
liqin's avatar
liqin committed
25
import org.springframework.context.annotation.Scope;
liqin's avatar
liqin committed
26 27 28 29
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

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

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

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

liqin's avatar
liqin committed
56 57 58 59 60
    @Resource
    private AssetService assetService;

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

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

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

liqin's avatar
liqin committed
116 117
            String extName = FilenameUtils.getExtension(originalFilename);
            boolean anyMatch = Arrays.stream(DATUM_TYPE).anyMatch(s -> Objects.equals(s, extName.toUpperCase()));
liqin's avatar
liqin committed
118
            if (anyMatch) {
liqin's avatar
liqin committed
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 145 146 147 148 149 150 151
                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
152
                }
liqin's avatar
liqin committed
153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170

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

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

        if (failureCount > 0) {
            return getFailResult(batchUploadResVO);
        }
liqin's avatar
liqin committed
214
        return getResult(batchUploadResVO);
liqin's avatar
liqin committed
215 216 217
    }

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

liqin's avatar
liqin committed
234 235 236 237
        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
238 239 240 241 242
        ImageUploadResult imageUploadResult = new ImageUploadResult();
        imageUploadResult.setFileName(fileName);
        imageUploadResult.setFileExtName(extension);
        imageUploadResult.setFileSize(uploadFile.getSize());
        imageUploadResult.setUrl(url);
liqin's avatar
liqin committed
243
        return getResult(imageUploadResult);
liqin's avatar
liqin committed
244 245
    }

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

liqin's avatar
liqin committed
269 270 271 272
    @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
273
    @RequiresAuthentication  //@RequiresPermissions("audio:upload")
liqin's avatar
liqin committed
274
    @ApiOperation(value = "多音频上传", notes = "多音频上传")
liqin's avatar
liqin committed
275
    public Map<String, Object> uploadAudio(@RequestPart(value = "file", required = false) MultipartFile[] files) throws IOException {
wzp's avatar
wzp committed
276
        if (files == null || files.length == 0) {
liqin's avatar
liqin committed
277
            return getFailResult("没有文件可供上传");
liqin's avatar
liqin committed
278 279 280
        }
        final boolean existChineseAudio = Arrays.stream(files).anyMatch(s -> Objects.requireNonNull(s.getOriginalFilename()).contains("汉语"));
        if (!existChineseAudio) {
liqin's avatar
liqin committed
281
            return getFailResult("必须包含汉语音频");
liqin's avatar
liqin committed
282
        }
liqin's avatar
liqin committed
283
        if (files.length > 5) {
liqin's avatar
liqin committed
284
            return getFailResult("一种语言只能对应一个文件,只能上传包含5种语言的音频");
liqin's avatar
liqin committed
285
        }
liqin's avatar
liqin committed
286 287 288 289 290

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

liqin's avatar
liqin committed
291
        Set<Asset> fileList = new LinkedHashSet<>();
liqin's avatar
liqin committed
292 293 294 295 296 297 298 299 300 301 302 303
        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
304
                handleList.add(handleResult);
liqin's avatar
liqin committed
305 306
                continue;
            }
liqin's avatar
liqin committed
307 308 309 310
            if (file.getSize() == 0L) {
                handleResult.setFileName("");
                handleResult.setFileUrl("");
                handleResult.setHandleResult(HANDLE_STATUS_ENUM.FAILURE.getName());
liqin's avatar
liqin committed
311
                handleResult.setDescription("文件" + originalFilename + "大小为0");
liqin's avatar
liqin committed
312
                failureCount++;
liqin's avatar
liqin committed
313
                handleList.add(handleResult);
liqin's avatar
liqin committed
314 315
                continue;
            }
liqin's avatar
liqin committed
316

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

                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
371 372 373
                successCount++;
            } else {
                handleResult.setFileUrl("");
liqin's avatar
liqin committed
374 375 376
                handleResult.setFileType(FileTypeEnum.AUDIO.getName());
                handleResult.setHandleResult(HANDLE_STATUS_ENUM.FAILURE.getName());
                handleResult.setDescription("文件" + originalFilename + "格式不支持");
liqin's avatar
liqin committed
377 378 379 380 381 382 383 384 385 386 387
                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
388
        batchUploadResVO.setFileList(fileList);
liqin's avatar
liqin committed
389
        return getResult(batchUploadResVO);
liqin's avatar
liqin committed
390 391
    }

liqin's avatar
liqin committed
392
    @ApiImplicitParams({
liqin's avatar
liqin committed
393
            @ApiImplicitParam(name = "file", value = "视频文件", paramType = "form", dataType = "__file", collectionFormat = "array", allowMultiple = true, required = true)
liqin's avatar
liqin committed
394
    })
liqin's avatar
liqin committed
395
    @PostMapping(value = "/video/content/upload", headers = "content-type=multipart/form-data", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
wzp's avatar
wzp committed
396
    @RequiresAuthentication  //@RequiresPermissions("file:video:content:upload")
liqin's avatar
liqin committed
397
    @ApiOperation(value = "展板视频上传", notes = "展板视频上传")
liqin's avatar
liqin committed
398
    public Map<String, Object> uploadContentVideo(@RequestPart("file") MultipartFile[] files) throws Exception {
liqin's avatar
liqin committed
399
        if (files == null || files.length == 0) {
liqin's avatar
liqin committed
400
            return getFailResult("没有文件可供上传");
liqin's avatar
liqin committed
401
        }
liqin's avatar
liqin committed
402 403 404 405 406 407 408 409
        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
410
        final boolean matchChinese = Arrays.stream(files).anyMatch(s -> Objects.requireNonNull(s.getOriginalFilename()).contains("汉语"));
liqin's avatar
liqin committed
411
        if (!matchChinese) {
liqin's avatar
liqin committed
412
            return getFailResult("文件必须包含汉语视频");
liqin's avatar
liqin committed
413
        }
liqin's avatar
liqin committed
414
        if (files.length > 5) {
liqin's avatar
liqin committed
415
            return getFailResult("一种语言只能对应一个文件,只能上传包含5种语言的视频");
liqin's avatar
liqin committed
416
        }
liqin's avatar
liqin committed
417 418 419 420 421

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

liqin's avatar
liqin committed
422
        Set<Asset> fileList = new LinkedHashSet<>();
liqin's avatar
liqin committed
423 424 425 426 427 428 429 430 431 432 433 434
        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
435
                handleList.add(handleResult);
liqin's avatar
liqin committed
436 437
                continue;
            }
liqin's avatar
liqin committed
438 439 440 441
            if (file.getSize() == 0L) {
                handleResult.setFileName("");
                handleResult.setFileUrl("");
                handleResult.setHandleResult(HANDLE_STATUS_ENUM.FAILURE.getName());
liqin's avatar
liqin committed
442
                handleResult.setDescription("文件" + originalFilename + "大小为0");
liqin's avatar
liqin committed
443
                failureCount++;
liqin's avatar
liqin committed
444
                handleList.add(handleResult);
liqin's avatar
liqin committed
445 446
                continue;
            }
liqin's avatar
liqin committed
447

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

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

liqin's avatar
liqin committed
547
        Set<Asset> fileList = new LinkedHashSet<>();
liqin's avatar
liqin committed
548 549 550 551 552 553 554 555 556 557 558 559
        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
560
                handleList.add(handleResult);
liqin's avatar
liqin committed
561 562
                continue;
            }
liqin's avatar
liqin committed
563 564 565 566
            if (file.getSize() == 0L) {
                handleResult.setFileName("");
                handleResult.setFileUrl("");
                handleResult.setHandleResult(HANDLE_STATUS_ENUM.FAILURE.getName());
liqin's avatar
liqin committed
567
                handleResult.setDescription("文件" + originalFilename + "大小为0");
liqin's avatar
liqin committed
568
                failureCount++;
liqin's avatar
liqin committed
569
                handleList.add(handleResult);
liqin's avatar
liqin committed
570 571
                continue;
            }
liqin's avatar
liqin committed
572 573 574 575 576 577 578 579 580 581

            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
582
                final int crc32 = fileInfo.getCrc32();
liqin's avatar
liqin committed
583
                final Asset one = this.assetService.getOne(Wrappers.<Asset>lambdaQuery().eq(Asset::getCrc32, (long) crc32));
liqin's avatar
liqin committed
584

liqin's avatar
liqin committed
585 586 587 588 589 590 591 592 593
                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
594
                        .crc32((long) crc32)
liqin's avatar
liqin committed
595
                        .build();
liqin's avatar
liqin committed
596 597 598
                if (one != null) {
                    FastDFSUtils.deleteFile(fileUrl);
                    asset.setFileUrl(one.getFileUrl());
liqin's avatar
liqin committed
599
                    asset.setCrc32(null);
liqin's avatar
liqin committed
600
                }
liqin's avatar
liqin committed
601 602 603 604 605 606
                this.assetService.save(asset);
                fileList.add(asset);

                handleResult.setFileUrl(fileUrl);
                handleResult.setFileName(originalFilename);
                handleResult.setFileType(FileTypeEnum.VIDEO.getName());
liqin's avatar
liqin committed
607 608
                handleResult.setHandleResult(HANDLE_STATUS_ENUM.SUCCESS.getName());
                handleResult.setDescription("");
liqin's avatar
liqin committed
609 610 611
                successCount++;
            } else {
                handleResult.setFileUrl("");
liqin's avatar
liqin committed
612 613
                handleResult.setHandleResult("上传失败");
                handleResult.setDescription("文件" + originalFilename + "格式不支持");
liqin's avatar
liqin committed
614 615 616 617 618 619 620 621 622 623 624
                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
625
        batchUploadResVO.setFileList(fileList);
liqin's avatar
liqin committed
626
        return getResult(batchUploadResVO);
liqin's avatar
liqin committed
627 628 629
    }

}