Django实现简单的音乐播放器 4

在原有音乐播放器功能基础上,增加上传音乐功能。

 效果:

目录

配置上传路径

配置路由

视图处理歌曲

引入类库

保存歌曲文件

模板上传

设置菜单列表

设置菜单列表样式

脚本设置

上传效果

1.显示菜单列表

2.点击上传歌曲

3.上传完成

4.查看保存文件

增加数据库操作

修改验证入库方法

修改歌曲加载方法

上传歌曲入库

总结


配置上传路径

在mymp3/settings.py文件中,最底下加上以下配置:

MEDIA_ROOT = os.path.join(BASE_DIR, 'static/media')

配置路由

path(r'upload_music', views.upload_music, name='upload_music'),

视图处理歌曲

文件上传时,文件数据存储在request.FILES属性中。

注意:from表单上传文件需要加 enctype=”multipare/form-data”

上传必须是post请求。

引入类库

from django.conf import settings
from django.views.decorators.csrf import csrf_exempt

保存歌曲文件

通过csrf_exempt装饰器豁免csrf验证,读取模板提交的文件并写入设置的路径中。

@csrf_exempt
def upload_music(request):""" 上传歌曲文件 """if request.method == 'POST':file = request.FILES['file']# 文件在服务端路径 获取配置filePath = os.path.join(settings.MEDIA_ROOT, file.name)# 保存文件with open(filePath, 'wb+') as fp:for info in file.chunks():fp.write(info)return JsonResponse({'code': 1, 'msg': '上传成功!'})else:return JsonResponse({'code': 0, 'msg': '请选择POST提交文件!'})

模板上传

使用layui的文件上传功能来进行上传歌曲文件;原来加载歌曲使用的是下拉菜单,但是无法绑定layui上传事件,就改为自己写菜单列表了。

设置菜单列表

去掉原来的功能列表设置,改为在歌曲列表元素上面添加菜单列表内容。

菜单列表如下:

<!--菜单列表-->
<div id="menu-open"><span class="layui-icon layui-icon-app menu-open"></span><ul class="menu-list none"><li class="loadMusic">加载歌曲</li><li class="uploadMusic">上传歌曲</li></ul>
</div>
<!--菜单列表-->

设置菜单列表样式

通过给最外层的播放器容器设置相对浮动,菜单列表设置绝对浮动,调试后还是原来的位置。

<style>.none {display: none;}#music-player{position:relative;}#menu-open {position:absolute;top:24px;right:35px;}#menu-open span{color:#fff;}.menu-list {position:absolute;top:18px;right:-82px;margin: 5px 0;background-color:#fff;}.menu-list li{line-height: 26px;color: rgba(0,0,0,.8);font-size: 14px;white-space: nowrap;cursor: pointer;padding:0 20px;}
</style>

脚本设置

因为功能列表修改为菜单列表了,并在原来基础上增加上传功能绑定,故脚本修改较大。

内容如下:

layui.use(['dropdown', 'util', 'layer', 'table'], function () {var dropdown = layui.dropdown, util = layui.util, layer = layui.layer, $ = layui.jquery, upload = layui.upload;// 上传音乐var uploadInst = upload.render({elem: '.uploadMusic', url: '/upload_music',accept: 'audio',exts: 'mp3', done: function (res) {if(res.code > 0) {layer.alert(res.msg, {icon: 1})} else {layer.alert(res.msg, {icon: 5})}}, error: function () {layer.alert('请求异常', {icon: 5})}});// 打开菜单列表$("#menu-open").on('click', function () {$(".menu-list").toggleClass("none");})// 关闭菜单列表 点击菜单列表外的其他部分时关闭菜单列表$(document).on('click', function (e) {if ($(e.target).closest('.music-player').length < 1) {$('.menu-list').addClass("none");}})// 请求接口 导入歌曲到数据库$('.loadMusic').click(function(){$.ajax({type: 'GET',url: "/load_music",data: {id:1},success: function (data) {layer.alert(data, {icon: 1})}.bind(this),error: function (e) {console.log("ERROR : ", e);}});})})

上传效果

1.显示菜单列表

2.点击上传歌曲

3.上传完成

4.查看保存文件

增加数据库操作

目前只是实现文件上传功能,还需要把对文件进行验证和把相应歌曲信息加入数据库,这样播放列表就能显示和播放该歌曲了。

修改验证入库方法

把原来的insert_music方法改为两个方法,一个负责验证歌曲信息,另一个负责入库操作;并修改函数返回格式。

如下:

def auth_music(name):""" 验证歌曲文件 """ext = 'mp3'# 判断文件后缀fileInfo = name.split('.')if len(fileInfo) != 2:return {'code': 0, 'msg': '文件有误'}if fileInfo[1] != ext:return {'code': 0, 'msg': '请上传MP3文件'}# 查询歌曲是否存在info = Single.objects.filter(title=name).first()if info:return {'code': 0, 'msg': '歌曲已存在'}else:return {'code': 1, 'msg': '可以上传'}def insert_music(name):""" 把歌曲信息插入数据表 """single = Single()single.title = namesigners = name.split('-')single_1 = signers[1].strip('') if len(signers) > 1 else '未知'single.singer = single_1.strip('.mp3')single.songUrl = '/static/media/' + name# 随机1-10专辑封面图片sui_num = random.randint(1, 10)single.imageUrl = '/static/images/' + str(sui_num) + '.png'flag = single.save()if flag:return {'code': 0, 'msg': '上传失败,请重试!'}else:return {'code': 1, 'msg': '上传成功'}

修改歌曲加载方法

因为上述方法歌曲加载功能有使用,所以也需要相应修改,具体为:在循环中调用验证歌曲信息函数,通过判断返回值决定是否入库操作。

def load_music(request):""" 加载本地的歌曲 """# 项目路径app_path = os.path.abspath(os.path.dirname(__file__))# 获取媒体资源目录下所有歌曲文件path = app_path + '/../static/media/'files = os.listdir(path)for file in files:flag = auth_music(file)if flag['code'] > 0:print(insert_music(file))else:print(flag['msg'])return HttpResponse('加载本地音乐成功!')

上传歌曲入库

修改歌曲验证和入库方法就是为了方法通用,这样上传文件直接可以使用,并返回提示信息。

@csrf_exempt
def upload_music(request):""" 上传歌曲文件 """if request.method == 'POST':file = request.FILES['file']flag = auth_music(file.name)if flag['code'] < 1:return JsonResponse(flag)# 文件在服务端路径 获取配置filePath = os.path.join(settings.MEDIA_ROOT, file.name)# 保存文件with open(filePath, 'wb+') as fp:for info in file.chunks():fp.write(info)# 入库操作flag = insert_music(file.name)return JsonResponse(flag)else:return JsonResponse({'code': 0, 'msg': '请选择POST提交文件!'})

注意:通过request.FILES获取的文件,此时也就是file为文件对象,如果入库需要使用file获取文件名称来入库。

音乐播放器版本2源码

链接:百度网盘 请输入提取码

提取码:e5th

总结

在原来基础上增加单独歌曲文件上传,使用了layui控件实现上传,

后端验证歌曲文件,保存本地并入库处理。

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

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

相关文章

SpringBoot前后端分离项目,打包、部署到服务器详细图文流程

文章目录 实施步骤一、修改配置文件地址1.修改MySQL配置2.修改Redis配置3.修改日志路径和字符集配置 二、将源码压缩并上传服务器1.上传前端文件2.上传后端文件&#xff08;同上&#xff09; 三、前端项目打包1.安装依赖2.项目打包 四、后端项目打包1.项目打包&#xff08;jar包…

一次零基础靶机渗透细节全程记录

一、打靶总流程 1.确定目标&#xff1a; 在本靶场中&#xff0c;确定目标就是使用nmap进行ip扫描&#xff0c;确定ip即为目标&#xff0c;只是针对此靶场而言。其他实战中确定目标的方式包括nmap进行扫描&#xff0c;但不局限于这个nmap。 2.信息收集&#xff1a; 比如平常挖…

【Matlab】智能优化算法_非洲秃鹫优化算法AVOA

【Matlab】智能优化算法_非洲秃鹫优化算法AVOA 1.背景介绍2.数学模型3.文件结构4.算法流程图5.伪代码6.详细代码及注释6.1 AVOA.m6.2 boundaryCheck.m6.3 exploitation.m6.4 exploration.m6.5 initialization.m6.6 levyFlight.m6.7 main.m6.8 ObjectiveFunction.m6.9 random_se…

前端处理后端返回的文件流,进行文件下载

二进制流格式 Blob格式 前言&#xff1a; 需求&#xff1a;根据后端接口返回的文件流进行数据处理&#xff0c;并实现文件的下载&#xff0c;且下载文件为word文档. 代码实现&#xff1a; //下载文件 async function DownLoadFile(row) {let res await DownLoadFileAPI(row.…

目标检测学习

目录 1、目标定位 2、特征点检测 3、目标检测 4、滑动窗口的卷积实现 5、Bounding Box 预测&#xff08;Bounding box predictions&#xff09; 6、交并化 7、非极大值抑制 8、Anchor Boxes 9、YOLO算法 1、目标定位 2、特征点检测 如何检测特征点&#xff08;以人的部…

【UE4 C++】根据指定路径生成静态网格体

在上一篇博客中&#xff08;【UE C】蓝图调用C函数&#xff09;&#xff0c;我们用C创建了一个蓝图函数库&#xff0c;本篇文章在这个蓝图函数库基础上增加一个方法&#xff0c;该方法只需输入一个文件目录路径&#xff0c;就可在场景中生成该目录下得所有静态网格体。&#xf…

ChatGPT对高校人才培养模式的挑战与应对策略思考

酷吗&#xff1f;输入指令后直接就能生成一大串代码&#xff0c;即使不懂相关技术也能玩转编程&#xff0c;这就是ChatGPT赋予你的“新能力”&#xff0c;除了写代码&#xff0c;ChatGPT还能帮你执行各种五花八门的任务。 AI工具如ChatGPT在行业中的广泛应用对于行业的人才结…

解密Sketch文件打开秘籍:简单两步操作!

虽然Figma&#xff0c;sketch,xd都很好用&#xff0c;但是设计师在设计工作流中经常会遇到无法在这三者软件中自由导入导出的情况。但是只要我们转变一下思路&#xff0c;因为这三种软件都支持导入sketch格式,所以我们只要将文件格式转成sketch&#xff0c;就能自由的在不同软件…

【华为鸿蒙3.0/荣耀安卓12使用VMOS Pro的激活方式】

关于华为鸿蒙3.0/荣耀安卓12如何解除进程限制&#xff0c;这里提供以下教程供小伙伴们参考。 需要准备&#xff1a;电脑一台&#xff0c;数据线一根。 第一步&#xff1a;打开手机USB调试模式。 确保USB数据线已连接手机和电脑&#xff0c;打开手机“开发者选项”&#xff0…

【Distributed】zookeeper+kafka的应用及部署

文章目录 一、zookeeper1. zookeeper的概述1.1 Zookeeper 定义1.2 Zookeeper 工作机制1.3 Zookeeper 特点1.4 Zookeeper 数据结构1.5 Zookeeper 应用场景1.6 Zookeeper 选举机制第一次启动选举机制非第一次启动选举机制选举Leader规则 2. 部署 Zookeeper 集群2.1 安装前准备2.2…

HarmonyOS学习路之开发篇—流转(多端协同 一)

多端协同开发 场景介绍 开发者在应用FA中通过调用流转任务管理服务、分布式任务调度的接口&#xff0c;实现多端协同。 主要流程如下&#xff1a; 设备A上的应用FA向流转任务管理服务注册一个流转回调。 Alt1-系统推荐流转&#xff1a;系统感知周边有可用设备后&#xff0c;主…

onvif库封装及qt工程调用onvif库实现设备搜索、获取码流地址等功能

一、前言&#xff1a; 本篇的OnvifManager工程是在vs2010下进行开发编译&#xff0c;它实现了对onvif库的封装调用&#xff0c;目前工程接口实现了对onvif的搜索、码流地址获取、设备重启接口&#xff0c;其他接口后续可以通过更改工程代码进行添加。qt工程myonvif是对OnvifMan…