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})