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 +