Spring Boot音乐服务器项目-上传音乐模块

项目结构图

相较于上次新增集中在这些地方:


🚀 上传音乐的核心流程

  1. 前端投递:用户填写歌手名 + 选择MP3文件

  2. 后端接收/music/upload 接口化身音乐快递员

  3. 安全验证:先查用户是否“持证上岗”(登录态)

  4. 仓库选址:把音乐存到服务器的“音乐保险柜”(暂时就是存在自己的电脑)

  5. 数据库登记:给音乐办张“身份证”(标题、歌手、存储路径等)


⭐接口预览设计:

请求: { post, /music/upload {singer,MultipartFilefile}, }

响应: { "status":0, "message":"上传成功!", "data":true }

🔍 技术揭秘:关键代码与骚操作

⚙️ 1. 接口设计:音乐快递签收单

实体类:新建Music类
import lombok.Data;@Datapublic class Music {private int id;private String title;private String singer;private String url;private String time;private int userid;
}
Controller层:MusicController
@RestController
@RequestMapping("/music")
public class MusicController {@Value("${music.local.path}")private String SAVE_PATH;@Resourceprivate MusicMapper musicMapper;@RequestMapping(value = "/upload")public ResponseBodyMessage<Boolean> insertMusic(@RequestParam String singer,@RequestParam("filename") MultipartFile file,HttpServletRequest req,HttpServletResponse resp) throws IOException {//无session就不创建HttpSession httpSession = req.getSession(false);if (httpSession == null || httpSession.getAttribute(Constant.USERINFO_SESSION_KEY) == null) {System.out.println("没有登录!");return new ResponseBodyMessage<>(-1, "没有登录!", false);}String filenameAndType = file.getOriginalFilename();System.out.println("filenameAndType---->>>>>>>>>>" + filenameAndType);String path = SAVE_PATH + "\\ " + filenameAndType;File dest = new File(path);System.out.println("dest:=>" + dest.getPath());if (!dest.exists()) {dest.mkdirs();}try {file.transferTo(dest);} catch (IOException e) {e.printStackTrace();return new ResponseBodyMessage<>(-1, "上传失败", false);}//数据库当中存储的歌曲不包括.mp3.所以需要进行截取String title = filenameAndType.substring(0, filenameAndType.lastIndexOf("."));//SimpleDateFormat来格式化当前的系统时间SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");String time = sf.format(new Date());//这里会被用到 播放音乐的模块String url = "/CloudMusic/get?path="+title;User user =(User)httpSession.getAttribute(Constant.USERINFO_SESSION_KEY);int userId = user.getId();int ret = musicMapper.insert(title,singer,time,url,userId);if(ret == 1){}else{dest.delete();return new ResponseBodyMessage<>(-1,"数据库上传失败,删除上传的⾳乐!",false);}return new ResponseBodyMessage<>(0,"上传成功!",true);}
}
String url = "/CloudMusic/get?path="+title;

注意这个地方的       路径/http请求方法

注解介绍:

1. 使⽤@Value("${music.local.path}"),获取到配置⽂件当中的值。不建议中⽂路径。

#⾳乐上传后的路径 music.local.path=D:/work/local/music

2. MultipartFile类,在org.springframework.web.multipart包当中,是Spring框架中处理⽂件上传 的主要类。

接口层:MusicMapper                                                                                                                    现在还未将数据插⼊到数据库当中,接下来我们实现数据库中 数据的写⼊。                            
 
@Mapper
public interface MusicMapper {int insert(String title,String singer,String time,String url,int userid);}
 定义MusicMapper.xml
<mapper namespace="com.example.musicplayer.mapper.MusicMapper"><insert id="insert">insert into music(title,singer,time,url,userid)values(#{title},#{singer},#{time},#{url},#{userid})</insert>
</mapper>

注意自己的文件名

基于此这个插入一个.MP3形式文件到数据库的接口就已经完成了

我们其实可以看到在我们的service中是写下了这样一段逻辑的

HttpServletResponse resp) throws IOException {//没有session不创建 HttpSession httpSession = req.getSession(false);if(httpSession == null || 
httpSession.getAttribute(Constant.USERINFO_SESSION_KEY) == null) {System.out.println("没有登录!");return new ResponseBodyMessage<>(-1,"没有登录!",false);}
同时还有一些配置要记得配置,我的这个配置文件如下
application.propertied <用来对照>
#配置数据库
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/musicserver?characterEncoding=utf8&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=1234
spring.datasource.driver-class-name=com.mysql.jdbc.Driver#配置xml
mybatis.mapper-locations=classpath:mybatis/**Mapper.xml#配置springboot上传文件的大小,默认每个文件的配置最大为15Mb,单次请求的文件的总数不能大于100Mb
spring.servlet.multipart.max-file-size = 15MB
spring.servlet.multipart.max-request-size=100MB#音乐上传后的路径
music.local.path=D:/CloudMusic
#music.local.path=/home/gb/music# 配置springboot日志调试模式是否开启
debug=true
# 设置打印日志的级别,及打印sql语句
#日志级别:trace,debug,info,warn,error
#基本日志
logging.level.root=INFO
logging.level.com.example.onlinemusic.mapper=debug
#扫描的包:druid.sql.Statement类和frank包
logging.level.druid.sql.Statement=DEBUG
logging.level.com.example=DEBUG

于是我们看到当我们在postman中测试的时候是无法直接调用这个insertMusic接口的

于是我们可以知道 

测试场景请求姿势结果
未登录上传不传Session❌ “请先登录!”
上传伪造MP3(你可以做这个效果)把.txt改成.mp3❌ “假MP3警告!”
正常上传歌手名+真实MP3文件✅ 成功入库!
同名文件覆盖(你可以做这个效果)再次上传相同文件❌ 需自行处理重复!

 

 


💡 一些总结

  1. 事务性操作:文件存盘 + 数据库登记 = 原子操作(要么全成功,要么回滚)

  2. 路径解耦@Value 动态读取存储路径,搬家不用改代码!

  3. 安全防线:Session验证 + 文件类型检测(虽然检测逻辑要自己补全😉)

  4. 扩展空间

    • 加文件去重?👉 SELECT * FROM music WHERE title=?

    • 加音乐元数据解析?👉 用 JAudiotagger 库读ID3标签!

相对于上次的提交,提交文件如下:

代码仓库:插入音乐接口开发 7.22 /音乐服务器 - Gitee.com 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/92321.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/92321.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年远程桌面软件深度评测:ToDesk、向日葵、TeamViewer全方位对比分析

随着远程办公和数字化协作的深入发展&#xff0c;远程桌面软件已经成为个人用户和企业的必备工具。在2025年的今天&#xff0c;远程控制软件市场呈现出百花齐放的态势&#xff0c;其中ToDesk、向日葵和TeamViewer作为市场上的三大主流选择&#xff0c;各自在技术创新、性能优化…

深度学习-全连接神经网络2

六、反向传播算法 反向传播&#xff08;Back Propagation&#xff0c;简称BP&#xff09;算法是用于训练神经网络的核心算法之一&#xff0c;它通过计算损失函数&#xff08;如均方误差或交叉熵&#xff09;相对于每个权重参数的梯度&#xff0c;来优化神经网络的权重。 1、前…

C语言的历史

C 语言是一种 通用的、过程式的编程语言&#xff0c;由 丹尼斯里奇&#xff08;Dennis Ritchie&#xff09; 在 1972 年于贝尔实验室开发。它以 高效、灵活、贴近硬件 而著称&#xff0c;广泛应用于系统软件、嵌入式系统、驱动程序、游戏引擎、数据库系统等底层开发领域。 C语…

jupyter使用

启动win rcmdjupyter notebook创建python文件

linux 环境服务发生文件句柄泄漏导致服务不可用

问题描述&#xff1a;服务调用远程rest接口 报错&#xff0c;发生too many open files 异常&#xff0c;系统句柄资源耗尽&#xff0c;导致服务不可用。排查经过&#xff1a;1、针对报错代码进行本地构建&#xff0c;构造异常&#xff0c;并进行压测。问题未复现2、经过讨论分析…

手机录制视频时,硬编码和软编码哪个质量高?(硬件编码、软件编码)

文章目录**1. 画质对比**- **软编码**&#xff1a;- **硬编码**&#xff1a;**2. 性能与功耗**- **软编码**&#xff1a;- **硬编码**&#xff1a;**3. 实际应用中的权衡****4. 现代手机的折中方案****5. 如何选择&#xff1f;****总结**在手机录制视频时&#xff0c; 软编码的…

IPv4与IPv6双栈协议:网络过渡的关键技术

为什么需要IPv4与IPv6共存&#xff1f; 在网络技术的世界中&#xff0c;兼容性问题始终是最大的挑战之一。IPv4和IPv6之间存在根本性的不兼容性&#xff0c;这意味着使用不同协议的设备无法直接通信。这种情况就像是两个人试图用完全不同的语言进行对话一样。 目前的网络现状…

【牛客刷题】数字变换

一、题目描述 给出两个数字a,ba,ba,b,aaa每次可以乘上一个大于1的正整数得到新的aa

MySQL 学习一 存储结构和log

1.InnoDB逻辑存储结构 表空间->段->区->页->行->数据表空间&#xff1a;覆盖了所有的数据和索引&#xff0c;系统表在系统表空间&#xff0c;还有默认表空间等 段&#xff1a;多个段组成表空间 区&#xff1a;多个区组成段&#xff0c;一般每个区的大小通常是1M…

TCP day39

六&#xff1a;C/S和B/S端 C/S&#xff1a;Client, server B/S&#xff1a;Browser server 1.cs 专用客户端 bs 通用客户端 2.协议不同 Cs 标准协议&#xff0c;自定义协议 Bs http 超文本传输 3.cs 功能复杂 bs 功能弱 4.bs 资源都在ser&#xff0c;有ser发送到cli cs 大部分资…

6 种无线传输照片从安卓到 Mac 的方法

将大量照片从安卓设备传输到电脑上&#xff0c;不仅可以备份照片&#xff0c;还能释放设备存储空间。虽然使用 USB 数据线可以在 Windows 电脑上轻松完成传输&#xff0c;但将安卓手机连接到 Mac 并非如此简单。因此&#xff0c;许多用户更倾向于无线传输照片从安卓到 Mac。您可…

在vscode 使用 remote-ssh

vscode安装插件Remote-SSH,直接安装即可 安装完毕之后 在左下角有这个图标 点击之后选择连接到主机然后选择添加新链接之后输入用户名和主机地址 非默认端口使用 -p 端口号之后选择第一个即可如果使用的是密码,直接连接,然后输入密码即可如果使用的密钥,则修改.ssh\config文件中…

RabbitMQ03——面试题

目录 一、mq的作用和使用场景 二、mq的优点 2.1架构设计优势 2.2功能特性优势 2.3性能与可靠性优势 2.4生态系统优势 2.5对比优势 三、mq的缺点 3.1性能与扩展性限制 3.2功能局限性 3.3运维复杂度 3.4与其他消息队列的对比劣势 四、mq相关产品&#xff0c;每种产品…

应用层攻防启示录:HTTP/HTTPS攻击的精准拦截之道

一、七层攻击的复杂性 # CC攻击模拟工具&#xff08;Python实现&#xff09; import requests import threadingtarget_url "https://example.com/search?q"def cc_attack():while True:# 构造恶意搜索请求malicious_query "0" * 1000 # 长查询参数try…

.net 警告【代码 CS1998】此异步方法缺少 “await“ 运算符,将以同步方式运行。

【代码 CS1998】此异步方法缺少 “await” 运算符&#xff0c;将以同步方式运行。请考虑使用 “await” 运算符等待非阻止的 API 调用&#xff0c;或者使用 “await Task.Run(…)” 在后台线程上执行占用大量 CPU 的工作。在 VS 2022 中遇到的 CS1998 编译器警告&#xff0c;表…

【自动驾驶黑科技】基于Frenet坐标系的车道变换轨迹规划系统实现(附完整代码)

1. 代码结构概览该代码实现了一个车道变换轨迹规划系统&#xff0c;包含两个核心模块&#xff1a;道路建模&#xff08;EnhancedRoadModel&#xff09;&#xff1a;基于样条曲线构建道路模型。轨迹规划&#xff08;LaneChangePlanner&#xff09;&#xff1a;根据障碍物状态和道…

uni-calendar自定义签到打卡颜色

uni-calendar自定义签到打卡颜色&#xff0c;只需要将打卡的状态添加到动态类class中即可 效果&#xff1a;在uni-modules >>> components >>> uni-calendar >>> uni-calendar-item.vue文件中&#xff0c;根据info对应的文字或者符号添加不同的clas…

浙江大学PTA程序设计C语言基础编程练习题1-5

&#x1f30f;个人博客主页&#xff1a;意疏-CSDN博客 希望文章能够给到初学的你一些启发&#xff5e; 如果觉得文章对你有帮助的话&#xff0c;点赞 关注 收藏支持一下笔者吧&#xff5e; 阅读指南&#xff1a;开篇说明题目一、厘米换算英寸题目二、然后是几点题目三、 逆序…

catkin build的config设置指南[设置多种make模式或策略]

在本篇文章中&#xff0c;我们来尽可能详细地深入探讨 catkin config 的使用方法。这是掌握 catkin_tools 工作流的关键&#xff0c;能极大地提升你的开发效率和项目的规范性。 catkin config 的核心思想 首先&#xff0c;要理解它的核心思想&#xff1a;为你的 Catkin 工作空间…

Ubuntu挂载和取消挂载

在 Ubuntu 中&#xff0c;挂载&#xff08;Mount&#xff09;和取消挂载&#xff08;Unmount&#xff09;是管理存储设备&#xff08;如硬盘、U盘、ISO镜像等&#xff09;的常见操作。以下是详细指南&#xff1a;1. 挂载&#xff08;Mount&#xff09; 1.1 查看可用存储设备 ls…