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
英文地址,請注明出處:http://en.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…