From 9ef06d2f5af4bc71e9e261f5f796fadc207ef486 Mon Sep 17 00:00:00 2001
From: cover <98329722+nanshaws@users.noreply.github.com>
Date: Fri, 15 Mar 2024 00:37:08 +0800
Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86minio=EF=BC=8C?=
=?UTF-8?q?=E7=94=A8=E6=9D=A5=E4=BF=9D=E5=AD=98=E6=AD=8C=E6=9B=B2=EF=BC=8C?=
=?UTF-8?q?=E5=B9=B6=E6=B5=8B=E8=AF=95=E4=B8=8B=E8=BD=BD=E5=92=8C=E6=92=AD?=
=?UTF-8?q?=E6=94=BE=E5=8A=9F=E8=83=BD=E6=88=90=E5=8A=9F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
增加了minio,用来保存歌曲,并测试下载和播放功能成功
---
music-server/pom.xml | 24 ++++++
.../com/example/yin/config/MinioConfig.java | 27 +++++++
.../controller/FileDownloadController.java | 46 +++++++-----
.../yin/controller/MinioController.java | 47 ++++++++++++
.../yin/controller/MinioUploadController.java | 74 +++++++++++++++++++
.../yin/controller/SongController.java | 1 +
.../yin/service/impl/SongServiceImpl.java | 17 +++--
.../main/resources/application-dev.properties | 10 +++
8 files changed, 221 insertions(+), 25 deletions(-)
create mode 100644 music-server/src/main/java/com/example/yin/config/MinioConfig.java
create mode 100644 music-server/src/main/java/com/example/yin/controller/MinioController.java
create mode 100644 music-server/src/main/java/com/example/yin/controller/MinioUploadController.java
diff --git a/music-server/pom.xml b/music-server/pom.xml
index 1d2c2112..c19af6a5 100644
--- a/music-server/pom.xml
+++ b/music-server/pom.xml
@@ -123,6 +123,30 @@
commons-pool2
2.11.1
+
+ io.minio
+ minio
+ 8.3.0
+
+
+
+ me.tongfei
+ progressbar
+ 0.5.3
+
+
+
+ com.squareup.okhttp3
+ okhttp
+ 4.8.1
+
+
+
+ commons-io
+ commons-io
+ 2.8.0
+
+
diff --git a/music-server/src/main/java/com/example/yin/config/MinioConfig.java b/music-server/src/main/java/com/example/yin/config/MinioConfig.java
new file mode 100644
index 00000000..896b4fab
--- /dev/null
+++ b/music-server/src/main/java/com/example/yin/config/MinioConfig.java
@@ -0,0 +1,27 @@
+package com.example.yin.config;
+
+import io.minio.MinioClient;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class MinioConfig {
+
+ @Value("${minio.endpoint}")
+ private String minioEndpoint;
+
+ @Value("${minio.access-key}")
+ private String minioAccessKey;
+
+ @Value("${minio.secret-key}")
+ private String minioSecretKey;
+
+ @Bean
+ public MinioClient minioClient() {
+ return MinioClient.builder()
+ .endpoint(minioEndpoint)
+ .credentials(minioAccessKey, minioSecretKey)
+ .build();
+ }
+}
diff --git a/music-server/src/main/java/com/example/yin/controller/FileDownloadController.java b/music-server/src/main/java/com/example/yin/controller/FileDownloadController.java
index e49cf422..131a14f8 100644
--- a/music-server/src/main/java/com/example/yin/controller/FileDownloadController.java
+++ b/music-server/src/main/java/com/example/yin/controller/FileDownloadController.java
@@ -1,5 +1,10 @@
package com.example.yin.controller;
+import io.minio.GetObjectArgs;
+import io.minio.MinioClient;
+import io.minio.errors.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.ByteArrayResource;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.FileSystemResource;
@@ -13,27 +18,44 @@
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
+import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
+import java.io.InputStream;
import java.nio.file.Files;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
@Controller
@RequestMapping("/download")
public class FileDownloadController {
+ @Autowired
+ private MinioClient minioClient;
+ @Value("${minio.bucket-name}")
+ private String bucketName;
+
@GetMapping("/{fileName}")
- public ResponseEntity downloadFile(@PathVariable String fileName, HttpServletRequest request) {
- // 加载文件作为资源
- String filePath = System.getProperty("user.dir") + System.getProperty("file.separator") + "song\\"+fileName;
- File file=new File(filePath);
+ public ResponseEntity downloadFile(@PathVariable String fileName, HttpServletRequest request) throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
+
+ GetObjectArgs args = GetObjectArgs.builder()
+ .bucket(bucketName)
+ .object(fileName)
+ .build();
+ InputStream inputStream = minioClient.getObject(args);
- byte[] musicBytes = getMusicBytesFromFileName(file);
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+ byte[] buffer = new byte[1024];
+ int bytesRead;
+ while ((bytesRead = inputStream.read(buffer)) != -1) {
+ outputStream.write(buffer, 0, bytesRead);
+ }
+ byte[] musicBytes = outputStream.toByteArray();
// 创建一个ByteArrayResource对象,用于包装字节数组
ByteArrayResource resource = new ByteArrayResource(musicBytes);
// 构建响应头
HttpHeaders headers = new HttpHeaders();
headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + fileName);
-
// 返回一个 ResponseEntity 对象
return ResponseEntity.ok()
.headers(headers)
@@ -42,14 +64,4 @@ public ResponseEntity downloadFile(@PathVariable String fileName, Http
.body(resource);
}
- // 这个方法需要根据你的实际情况来获取音乐文件的字节数组
- private byte[] getMusicBytesFromFileName(File file) {
- try {
- return Files.readAllBytes(file.toPath());
- } catch (IOException e) {
- e.printStackTrace();
- // 如果发生异常,你可以返回一个空数组或者其他适当的错误处理
- return new byte[0];
- }
- }
-}
+ }
diff --git a/music-server/src/main/java/com/example/yin/controller/MinioController.java b/music-server/src/main/java/com/example/yin/controller/MinioController.java
new file mode 100644
index 00000000..c7f4be92
--- /dev/null
+++ b/music-server/src/main/java/com/example/yin/controller/MinioController.java
@@ -0,0 +1,47 @@
+package com.example.yin.controller;
+
+import io.minio.GetObjectArgs;
+import io.minio.MinioClient;
+import org.apache.commons.io.IOUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.*;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.client.RestTemplate;
+
+import java.io.InputStream;
+
+
+@Controller
+public class MinioController {
+ @Value("${minio.bucket-name}")
+ private String bucketName;
+ @Autowired
+ private MinioClient minioClient;
+ @GetMapping("/user01/{fileName:.+}")
+ public ResponseEntity getMusic(@PathVariable String fileName) {
+ try {
+ GetObjectArgs args = GetObjectArgs.builder()
+ .bucket(bucketName)
+ .object(fileName)
+ .build();
+ InputStream inputStream = minioClient.getObject(args);
+
+ // 将文件内容读取为字节数组
+ byte[] bytes = IOUtils.toByteArray(inputStream);
+
+ // 设置响应头,指示浏览器如何处理响应内容
+ HttpHeaders headers = new HttpHeaders();
+ headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
+ headers.setContentDispositionFormData("attachment", fileName); // 如果需要下载文件,可以使用此头部
+
+ // 返回字节数组作为响应
+ return new ResponseEntity<>(bytes, headers, HttpStatus.OK);
+ } catch (Exception e) {
+ e.printStackTrace();
+ return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
+ }
+ }
+}
diff --git a/music-server/src/main/java/com/example/yin/controller/MinioUploadController.java b/music-server/src/main/java/com/example/yin/controller/MinioUploadController.java
new file mode 100644
index 00000000..34520109
--- /dev/null
+++ b/music-server/src/main/java/com/example/yin/controller/MinioUploadController.java
@@ -0,0 +1,74 @@
+package com.example.yin.controller;
+
+import io.minio.MinioClient;
+import io.minio.PutObjectArgs;
+import io.minio.errors.MinioException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.stereotype.Service;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.util.Properties;
+
+@Service
+public class MinioUploadController {
+
+ private static MinioClient minioClient;
+ private static String bucketName;
+
+ public static void init(){
+ Properties properties = new Properties();
+ try {
+ // 使用类加载器获取资源文件的输入流
+ InputStream inputStream = MinioUploadController.class.getClassLoader().getResourceAsStream("application-dev.properties");
+ if (inputStream != null) {
+ properties.load(inputStream);
+ String minioEndpoint = properties.getProperty("minio.endpoint");
+ String minioAccessKey = properties.getProperty("minio.access-key");
+ String minioSecretKey = properties.getProperty("minio.secret-key");
+ String minioBucketName = properties.getProperty("minio.bucket-name");
+ bucketName = minioBucketName;
+ minioClient = MinioClient.builder()
+ .endpoint(minioEndpoint)
+ .credentials(minioAccessKey, minioSecretKey)
+ .build();
+ }
+ }catch (Exception e){
+ System.out.println(e);
+ }
+ }
+
+ public static String uploadFile(MultipartFile file) {
+ try {
+ init();
+ InputStream inputStream = file.getInputStream();
+ minioClient.putObject(
+ PutObjectArgs.builder()
+ .bucket(bucketName)
+ .object(file.getOriginalFilename())
+ .stream(inputStream, inputStream.available(), -1)
+ .contentType(file.getContentType())
+ .build()
+ );
+ return "File uploaded successfully!";
+ } catch (MinioException | IOException | NoSuchAlgorithmException | InvalidKeyException e) {
+ e.printStackTrace();
+ return "Error uploading file to MinIO: " + e.getMessage();
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+}
diff --git a/music-server/src/main/java/com/example/yin/controller/SongController.java b/music-server/src/main/java/com/example/yin/controller/SongController.java
index 31d83953..ab9d6c51 100755
--- a/music-server/src/main/java/com/example/yin/controller/SongController.java
+++ b/music-server/src/main/java/com/example/yin/controller/SongController.java
@@ -92,4 +92,5 @@ public R updateSongPic(@RequestParam("file") MultipartFile urlFile, @RequestPara
public R updateSongUrl(@RequestParam("file") MultipartFile urlFile, @RequestParam("id") int id) {
return songService.updateSongUrl(urlFile, id);
}
+
}
diff --git a/music-server/src/main/java/com/example/yin/service/impl/SongServiceImpl.java b/music-server/src/main/java/com/example/yin/service/impl/SongServiceImpl.java
index 0f14a1d5..9224683c 100755
--- a/music-server/src/main/java/com/example/yin/service/impl/SongServiceImpl.java
+++ b/music-server/src/main/java/com/example/yin/service/impl/SongServiceImpl.java
@@ -3,12 +3,15 @@
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.yin.common.R;
+import com.example.yin.controller.MinioUploadController;
import com.example.yin.mapper.SongMapper;
import com.example.yin.model.domain.Song;
import com.example.yin.model.request.SongRequest;
import com.example.yin.service.SongService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
@@ -28,6 +31,9 @@ public class SongServiceImpl extends ServiceImpl implements So
@Autowired
private SongMapper songMapper;
+ @Value("${minio.bucket-name}")
+ private String bucketName;
+
@Override
public R allSong() {
return R.success(null, songMapper.selectList(null));
@@ -40,14 +46,9 @@ public R addSong(SongRequest addSongRequest, MultipartFile lrcfile,MultipartFile
String pic = "/img/songPic/tubiao.jpg";
String fileName = mpfile.getOriginalFilename();
String filePath = System.getProperty("user.dir") + System.getProperty("file.separator") + "song";
- File file1 = new File(filePath);
- if (!file1.exists()) {
- if (!file1.mkdir()) {
- return R.fatal("创建文件失败");
- }
- }
+ String s = MinioUploadController.uploadFile(mpfile);
File dest = new File(filePath + System.getProperty("file.separator") + fileName);
- String storeUrlPath = "/song/" + fileName;
+ String storeUrlPath = "/"+bucketName+"/" + fileName;
try {
mpfile.transferTo(dest);
} catch (IOException e) {
@@ -68,7 +69,7 @@ public R addSong(SongRequest addSongRequest, MultipartFile lrcfile,MultipartFile
throw new RuntimeException(e);
}
}
- if (songMapper.insert(song) > 0) {
+ if (s.equals("File uploaded successfully!")&&songMapper.insert(song) > 0) {
return R.success("上传成功", storeUrlPath);
} else {
return R.error("上传失败");
diff --git a/music-server/src/main/resources/application-dev.properties b/music-server/src/main/resources/application-dev.properties
index 0932a6a5..0fc30c69 100644
--- a/music-server/src/main/resources/application-dev.properties
+++ b/music-server/src/main/resources/application-dev.properties
@@ -2,3 +2,13 @@ spring.datasource.url=jdbc:mysql://localhost:3306/tp_music?useSSL=false&allowPub
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
+
+minio.endpoint=http://localhost:9000
+minio.access-key=root
+minio.secret-key=123456789
+minio.bucket-name=user01
+# ????????
+spring.servlet.multipart.max-file-size= 50MB
+# ????????????
+spring.servlet.multipart.max-request-size= 50MB
+