From 18d0eaff5cdc2c6b230e8551bc8e7e5ab879cf6e Mon Sep 17 00:00:00 2001 From: MAC <1162714483@qq.com> Date: Fri, 29 Apr 2022 00:04:30 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat(=E6=96=87=E4=BB=B6=E8=A7=A3=E6=9E=90):?= =?UTF-8?q?=20=E8=A7=A3=E6=9E=90mp3=E6=A0=BC=E5=BC=8F=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 6 + .../com/qiwenshare/file/api/IFileService.java | 5 +- .../file/controller/FileController.java | 10 ++ .../com/qiwenshare/file/domain/Music.java | 59 ++++++++++ .../qiwenshare/file/mapper/MusicMapper.java | 13 +++ .../qiwenshare/file/service/FileService.java | 27 ++++- .../file/service/FiletransferService.java | 106 +++++++++++++++++- .../qiwenshare/file/vo/file/FileDetailVO.java | 53 +++++++++ .../qiwenshare/file/vo/file/FileListVo.java | 2 + src/main/resources/mapper/UserFileMapper.xml | 2 - 10 files changed, 277 insertions(+), 6 deletions(-) create mode 100644 src/main/java/com/qiwenshare/file/domain/Music.java create mode 100644 src/main/java/com/qiwenshare/file/mapper/MusicMapper.java create mode 100644 src/main/java/com/qiwenshare/file/vo/file/FileDetailVO.java diff --git a/pom.xml b/pom.xml index af45ce7..b0a76b9 100644 --- a/pom.xml +++ b/pom.xml @@ -122,6 +122,12 @@ commons-io 2.11.0 + + com.mpatric + mp3agic + 0.9.1 + + diff --git a/src/main/java/com/qiwenshare/file/api/IFileService.java b/src/main/java/com/qiwenshare/file/api/IFileService.java index 2bed764..d9766f2 100644 --- a/src/main/java/com/qiwenshare/file/api/IFileService.java +++ b/src/main/java/com/qiwenshare/file/api/IFileService.java @@ -2,14 +2,15 @@ package com.qiwenshare.file.api; import com.baomidou.mybatisplus.extension.service.IService; import com.qiwenshare.file.domain.FileBean; +import com.qiwenshare.file.vo.file.FileDetailVO; public interface IFileService extends IService { Long getFilePointCount(String fileId); void unzipFile(String userFileId, int unzipMode, String filePath); - public void updateFileDetail(String userFileId, String identifier, long fileSize, long modifyUserId); - + void updateFileDetail(String userFileId, String identifier, long fileSize, long modifyUserId); + FileDetailVO getFileDetail(String userFileId); } diff --git a/src/main/java/com/qiwenshare/file/controller/FileController.java b/src/main/java/com/qiwenshare/file/controller/FileController.java index c75cf6a..2e1c81f 100644 --- a/src/main/java/com/qiwenshare/file/controller/FileController.java +++ b/src/main/java/com/qiwenshare/file/controller/FileController.java @@ -24,6 +24,7 @@ import com.qiwenshare.file.dto.file.*; import com.qiwenshare.file.io.QiwenFile; import com.qiwenshare.file.util.QiwenFileUtil; import com.qiwenshare.file.util.TreeNode; +import com.qiwenshare.file.vo.file.FileDetailVO; import com.qiwenshare.file.vo.file.FileListVo; import com.qiwenshare.file.vo.file.SearchFileVO; import io.swagger.v3.oas.annotations.Operation; @@ -429,6 +430,15 @@ public class FileController { return RestResult.success().message("修改文件成功"); } + @Operation(summary = "查询文件详情", description = "查询文件详情", tags = {"file"}) + @RequestMapping(value = "/detail", method = RequestMethod.GET) + @ResponseBody + public RestResult queryFileDetail( + @Parameter(description = "用户文件Id", required = true) String userFileId){ + FileDetailVO vo = fileService.getFileDetail(userFileId); + return RestResult.success().data(vo); + } + diff --git a/src/main/java/com/qiwenshare/file/domain/Music.java b/src/main/java/com/qiwenshare/file/domain/Music.java new file mode 100644 index 0000000..3a24b4e --- /dev/null +++ b/src/main/java/com/qiwenshare/file/domain/Music.java @@ -0,0 +1,59 @@ +package com.qiwenshare.file.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import javax.persistence.*; + +/** + * @author MAC + * @version 1.0 + * @description: TODO + * @date 2022/4/27 23:44 + */ +@Data +@Table(name = "music") +@Entity +@TableName("music") +public class Music { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @TableId(type = IdType.AUTO) + @Column(columnDefinition="bigint(20)") + private String musicId; + @Column(columnDefinition = "bigint(20) comment '文件id'") + private String fileId; + private String track; + @Column + private String artist; + @Column + private String title; + @Column + private String album; + @Column + private String year; + @Column + private String genre; + @Column + private String comment; + @Column + private String lyrics; + @Column + private String composer; + @Column + private String publicer; + @Column + private String originalArtist; + @Column + private String albumArtist; + @Column + private String copyright; + @Column + private String url; + @Column + private String encoder; + @Column(columnDefinition = "mediumblob") + private String albumImage; +} diff --git a/src/main/java/com/qiwenshare/file/mapper/MusicMapper.java b/src/main/java/com/qiwenshare/file/mapper/MusicMapper.java new file mode 100644 index 0000000..eca53be --- /dev/null +++ b/src/main/java/com/qiwenshare/file/mapper/MusicMapper.java @@ -0,0 +1,13 @@ +package com.qiwenshare.file.mapper; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qiwenshare.file.domain.Image; +import com.qiwenshare.file.domain.Music; + +public interface MusicMapper extends BaseMapper { + + + + +} diff --git a/src/main/java/com/qiwenshare/file/service/FileService.java b/src/main/java/com/qiwenshare/file/service/FileService.java index 62ac69f..ad08101 100644 --- a/src/main/java/com/qiwenshare/file/service/FileService.java +++ b/src/main/java/com/qiwenshare/file/service/FileService.java @@ -1,7 +1,9 @@ package com.qiwenshare.file.service; +import cn.hutool.core.bean.BeanUtil; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.qiwenshare.common.exception.QiwenException; @@ -10,10 +12,15 @@ import com.qiwenshare.common.util.DateUtil; import com.qiwenshare.file.api.IFileService; import com.qiwenshare.file.component.AsyncTaskComp; import com.qiwenshare.file.domain.FileBean; +import com.qiwenshare.file.domain.Image; +import com.qiwenshare.file.domain.Music; import com.qiwenshare.file.domain.UserFile; import com.qiwenshare.file.mapper.FileMapper; +import com.qiwenshare.file.mapper.ImageMapper; +import com.qiwenshare.file.mapper.MusicMapper; import com.qiwenshare.file.mapper.UserFileMapper; import com.qiwenshare.file.util.QiwenFileUtil; +import com.qiwenshare.file.vo.file.FileDetailVO; import com.qiwenshare.ufop.factory.UFOPFactory; import com.qiwenshare.ufop.operation.download.Downloader; import com.qiwenshare.ufop.operation.download.domain.DownloadFile; @@ -50,6 +57,10 @@ public class FileService extends ServiceImpl implements IF @Resource AsyncTaskComp asyncTaskComp; + @Resource + MusicMapper musicMapper; + @Resource + ImageMapper imageMapper; @Override public Long getFilePointCount(String fileId) { @@ -107,7 +118,7 @@ public class FileService extends ServiceImpl implements IF } } - + @Override public void updateFileDetail(String userFileId, String identifier, long fileSize, long modifyUserId) { UserFile userFile = userFileMapper.selectById(userFileId); @@ -120,4 +131,18 @@ public class FileService extends ServiceImpl implements IF fileMapper.updateById(fileBean); } + @Override + public FileDetailVO getFileDetail(String userFileId) { + UserFile userFile = userFileMapper.selectById(userFileId); + FileBean fileBean = fileMapper.selectById(userFile.getFileId()); + Music music = musicMapper.selectOne(new QueryWrapper().eq("fileId", userFile.getFileId())); + Image image = imageMapper.selectOne(new QueryWrapper().eq("fileId", userFile.getFileId())); + FileDetailVO fileDetailVO = new FileDetailVO(); + BeanUtil.copyProperties(userFile, fileDetailVO); + BeanUtil.copyProperties(fileBean, fileDetailVO); + fileDetailVO.setMusic(music); + fileDetailVO.setImage(image); + return fileDetailVO; + } + } diff --git a/src/main/java/com/qiwenshare/file/service/FiletransferService.java b/src/main/java/com/qiwenshare/file/service/FiletransferService.java index 3dfd528..f4be1a3 100644 --- a/src/main/java/com/qiwenshare/file/service/FiletransferService.java +++ b/src/main/java/com/qiwenshare/file/service/FiletransferService.java @@ -1,8 +1,12 @@ package com.qiwenshare.file.service; +import cn.hutool.core.util.IdUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.mpatric.mp3agic.ID3v1; +import com.mpatric.mp3agic.ID3v2; +import com.mpatric.mp3agic.Mp3File; import com.qiwenshare.common.util.DateUtil; import com.qiwenshare.common.util.MimeUtils; import com.qiwenshare.common.util.security.JwtUser; @@ -22,6 +26,8 @@ import com.qiwenshare.ufop.constant.UploadFileStatusEnum; import com.qiwenshare.ufop.exception.operation.DownloadException; import com.qiwenshare.ufop.exception.operation.UploadException; import com.qiwenshare.ufop.factory.UFOPFactory; +import com.qiwenshare.ufop.operation.copy.Copier; +import com.qiwenshare.ufop.operation.copy.domain.CopyFile; import com.qiwenshare.ufop.operation.delete.Deleter; import com.qiwenshare.ufop.operation.delete.domain.DeleteFile; import com.qiwenshare.ufop.operation.download.Downloader; @@ -34,14 +40,18 @@ import com.qiwenshare.ufop.operation.upload.domain.UploadFileResult; import com.qiwenshare.ufop.util.UFOPUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import sun.nio.cs.ext.GBK; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.awt.image.BufferedImage; import java.io.*; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.util.Base64; import java.util.HashMap; import java.util.List; @@ -73,6 +83,8 @@ public class FiletransferService implements IFiletransferService { UploadTaskMapper uploadTaskMapper; @Resource ImageMapper imageMapper; + @Resource + MusicMapper musicMapper; @Resource PictureFileMapper pictureFileMapper; @@ -214,8 +226,89 @@ public class FiletransferService implements IFiletransferService { image.setFileId(fileBean.getFileId()); imageMapper.insert(image); } + if ("mp3".equalsIgnoreCase(uploadFileResult.getExtendName())) { + Downloader downloader = ufopFactory.getDownloader(uploadFileResult.getStorageType().getCode()); + DownloadFile downloadFile = new DownloadFile(); + downloadFile.setFileUrl(uploadFileResult.getFileUrl()); + InputStream inputStream = downloader.getInputStream(downloadFile); + File outFile = UFOPUtils.getTempFile(uploadFileResult.getFileUrl()); + if (!outFile.exists()) { + outFile.createNewFile(); + } + FileOutputStream fileOutputStream = new FileOutputStream(outFile); + IOUtils.copy(inputStream, fileOutputStream); + fileOutputStream.close(); + Mp3File mp3file = new Mp3File(outFile); + Music music = new Music(); + music.setMusicId(IdUtil.getSnowflakeNextIdStr()); + music.setFileId(fileBean.getFileId()); + if (mp3file.hasId3v1Tag()) { + ID3v1 id3v1Tag = mp3file.getId3v1Tag(); + music.setTrack(formatChatset(id3v1Tag.getTrack())); + music.setArtist(formatChatset(id3v1Tag.getTrack())); + music.setTitle(formatChatset(id3v1Tag.getTitle())); + music.setAlbum(formatChatset(id3v1Tag.getAlbum())); + music.setYear(formatChatset(id3v1Tag.getYear())); + music.setGenre(formatChatset(id3v1Tag.getGenre() + " (" + id3v1Tag.getGenreDescription() + ")")); + music.setComment(formatChatset(id3v1Tag.getComment())); + } + Mp3File mp3file2 = new Mp3File(outFile); + if (mp3file2.hasId3v2Tag()) { + ID3v2 id3v2Tag = mp3file2.getId3v2Tag(); + if (StringUtils.isEmpty(music.getTrack())) { + music.setTrack(formatChatset(id3v2Tag.getTrack())); + } + if (StringUtils.isEmpty(music.getArtist())) { + music.setArtist(formatChatset(id3v2Tag.getArtist())); + } + if (StringUtils.isEmpty(music.getTitle())) { + music.setTitle(formatChatset(id3v2Tag.getTitle())); + } + if (StringUtils.isEmpty(music.getAlbum())) { + music.setAlbum(formatChatset(id3v2Tag.getAlbum())); + } + if (StringUtils.isEmpty(music.getYear())) { + music.setYear(formatChatset(id3v2Tag.getYear())); + } + if (StringUtils.isEmpty(music.getGenre())) { + music.setGenre(formatChatset(id3v2Tag.getGenre() + " (" + id3v2Tag.getGenreDescription() + ")")); + } + if (StringUtils.isEmpty(music.getComment())) { + music.setComment(formatChatset(id3v2Tag.getComment())); + } + music.setLyrics(formatChatset(id3v2Tag.getLyrics())); + music.setComposer(formatChatset(id3v2Tag.getComposer())); + music.setPublicer(formatChatset(id3v2Tag.getPublisher())); + music.setOriginalArtist(formatChatset(id3v2Tag.getOriginalArtist())); + music.setAlbumArtist(formatChatset(id3v2Tag.getAlbumArtist())); + music.setCopyright(formatChatset(id3v2Tag.getCopyright())); + music.setUrl(formatChatset(id3v2Tag.getUrl())); + music.setEncoder(formatChatset(id3v2Tag.getEncoder())); + + byte[] albumImageData = id3v2Tag.getAlbumImage(); + + if (albumImageData != null) { + File outFile1 = UFOPUtils.getTempFile(uploadFileResult.getFileName() + ".png"); + if (!outFile1.exists()) { + outFile1.createNewFile(); + } + music.setAlbumImage(Base64.getEncoder().encodeToString(albumImageData)); +// FileOutputStream fileOutputStream1 = new FileOutputStream(outFile1); +// IOUtils.write(albumImageData, fileOutputStream1); +// Copier copier = ufopFactory.getCopier(); +// CopyFile copyFile = new CopyFile(); +// copyFile.setExtendName("png"); +// String fileUrl = copier.copy(new FileInputStream(outFile1), copyFile); +// music.setAlbumImageUrl(fileUrl); + + System.out.println("Have album image data, length: " + albumImageData.length + " bytes"); + System.out.println("Album image mime type: " + id3v2Tag.getAlbumImageMimeType()); + } + } + musicMapper.insert(music); + } } catch (Exception e) { - log.error("生成图片缩略图失败!"); + log.error("生成图片缩略图失败!", e); } } else if (UploadFileStatusEnum.UNCOMPLATE.equals(uploadFileResult.getStatus())) { @@ -244,6 +337,17 @@ public class FiletransferService implements IFiletransferService { } + private String formatChatset(String str) { + if (str == null) { + return ""; + } + if (java.nio.charset.Charset.forName("ISO-8859-1").newEncoder().canEncode(str)) { + byte[] bytes = str.getBytes(StandardCharsets.ISO_8859_1); + return new String(bytes, Charset.forName("GBK")); + } + return str; + } + @Override public void downloadFile(HttpServletResponse httpServletResponse, DownloadFileDTO downloadFileDTO) { UserFile userFile = userFileMapper.selectById(downloadFileDTO.getUserFileId()); diff --git a/src/main/java/com/qiwenshare/file/vo/file/FileDetailVO.java b/src/main/java/com/qiwenshare/file/vo/file/FileDetailVO.java new file mode 100644 index 0000000..d53eadf --- /dev/null +++ b/src/main/java/com/qiwenshare/file/vo/file/FileDetailVO.java @@ -0,0 +1,53 @@ +package com.qiwenshare.file.vo.file; + +import com.qiwenshare.file.domain.Image; +import com.qiwenshare.file.domain.Music; +import lombok.Data; + +/** + * @author MAC + * @version 1.0 + * @description: TODO + * @date 2022/4/28 23:45 + */ +@Data +public class FileDetailVO { + private String fileId; + + private String timeStampName; + + private String fileUrl; + + private Long fileSize; + + private Integer storageType; + + private Integer pointCount; + + private String identifier; + + private String userFileId; + + private Long userId; + + + private String fileName; + + private String filePath; + + private String extendName; + + private Integer isDir; + + private String uploadTime; + + private Integer deleteFlag; + + private String deleteTime; + + private String deleteBatchNum; + + private Image image; + + private Music music; +} diff --git a/src/main/java/com/qiwenshare/file/vo/file/FileListVo.java b/src/main/java/com/qiwenshare/file/vo/file/FileListVo.java index d640706..d9e906a 100644 --- a/src/main/java/com/qiwenshare/file/vo/file/FileListVo.java +++ b/src/main/java/com/qiwenshare/file/vo/file/FileListVo.java @@ -1,5 +1,6 @@ package com.qiwenshare.file.vo.file; +import com.qiwenshare.file.domain.Music; import lombok.Data; @Data @@ -41,4 +42,5 @@ public class FileListVo { private Integer imageWidth; private Integer imageHeight; + } diff --git a/src/main/resources/mapper/UserFileMapper.xml b/src/main/resources/mapper/UserFileMapper.xml index 6fb5840..ba348d1 100644 --- a/src/main/resources/mapper/UserFileMapper.xml +++ b/src/main/resources/mapper/UserFileMapper.xml @@ -6,8 +6,6 @@ - - + + UPDATE userfile SET filePath=REPLACE(filePath, #{param1}, #{param2})