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

news/2024/10/20 16:09:23/

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

 效果:

目录

配置上传路径

配置路由

视图处理歌曲

引入类库

保存歌曲文件

模板上传

设置菜单列表

设置菜单列表样式

脚本设置

上传效果

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.ppmy.cn/news/892685.html

相关文章

Html5视频video标签中调用blob地址,实现视频安全

Html5视频video标签中调用blob地址&#xff0c;实现视频安全 后端代码参考&#xff1a; /** 在这里可以进行权限验证等操作*///创建文件对象 File f new File("E:\\test.mp4"); //获取文件名称 String fileName f.getName(); //导出文件 String agent getRequest…

Html5视频video标签中使用blob实现视频播放加密

后端代码&#xff1a; /** 在这里可以进行权限验证等操作*///创建文件对象 File f new File("E:\\test.mp4"); //获取文件名称 String fileName f.getName(); //导出文件 String agent getRequest().getHeader("User-Agent").toUpperCase(); InputStre…

Google技巧:crack web sites

首先打开Google&#xff0c;在关键词输入框中输入"index of/"inurl:lib(双引号为英文状态下&#xff09;&#xff0c;选择“搜索简体中文网页”选项&#xff0c;回车搜索&#xff0c;得到了一些网页&#xff0c;不要以为这是一些普通的页面&#xff0c;其实它们是一些…

Android视频播放项目总结之 使用第三方Vitamio库,开发万能播放器(一)

Android自身代的vodeoView可以实现视频播放,但是很格式不支持 万能播放器指的是能任何格式的视频,他要用到第三方的库: ffmpeg开源框架 vitamio基于ffmpeg开发的开源框架 我们的开发用的是vitamio开源框架可以在官网上下载 Vitamio 是什么? Vitamio 是一款 Android与 …

Vitamio 多媒体框架 介绍

功能 Vitamio 是一款 Android 与 iOS 平台上的全能多媒体开发框架&#xff0c;全面支持硬件解码与 GPU 渲染。Vitamio 凭借其简洁易用的 API 接口赢得了全球众多开发者的青睐。到目前&#xff0c;全球已经有超过 一万 种应用在使用 Vitamio&#xff0c;覆盖用户超过 5亿 。 Vit…

视频直播技术详解

《视频直播技术详解》系列之一&#xff1a;开篇 原创 2016-08-11 何李石 七牛云 随着互联网用户消费内容和交互方式的升级&#xff0c;支撑这些内容和交互方式的基础设施也正在悄悄发生变革。手机设备拍摄视频能力和网络的升级催生了大家对视频直播领域的关注&#xff0c;吸…

复习题

cookie Cookie是由服务器端生成的,发送给User-Agent(一般是浏览器),(服务器告诉浏览器设置一下Cookie),浏览器会将cookie以key/value 的形式保存在某个目录下的文本文件内,下一次请求同一网站时就发送该Cookie服务器(前提是浏览器设置Cookie) 为什么会有Cookie? …

【Android -- 面试】复习指南之 Android 高级(下)

三、Android优秀三方库源码 1、你项目中用到哪些开源库&#xff1f;说说其实现原理&#xff1f; 一、网络底层框架&#xff1a;OkHttp实现原理 这个库是做什么用的&#xff1f; 网络底层库&#xff0c;它是基于http协议封装的一套请求客户端&#xff0c;虽然它也可以开线程…