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 = name
    signers = 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控件实现上传,

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GEE:计算每个对象的面积、标准差、周长、宽度、高度

作者:CSDN @ _养乐多_ 本文记录了面对对对象分割,以及计算每个对象的面积、标准差、周长、宽度、高度的代码。 文章目录 一、代码一、代码 // 设置种子 var seeds = ee.Algorithms.Image.Segmentation.seedGrid(20)

如何通过 CrossOver 在 Mac 苹果电脑上安装使用 windows 应用程序?

首先我们可以先了解一下什么是 crossOver &#xff0c;CrossOver 是 Mac 和 Windows 系统之间的兼容工具。使 Mac 操作系统的用户可以运行 Windows 系统的应用&#xff0c;从办公软件、实用工具、游戏到设计软件&#xff0c; 您都可以在 Mac 程序和 Windows 程序之间随意切换。…

18.Lucas-Kanade光流及OpenCV中的calcOpticalFlowPyrLK

文章目录 光流法介绍OpenCV中calcOpticalFlowPyrLK函数补充reference 欢迎访问个人网络日志&#x1f339;&#x1f339;知行空间&#x1f339;&#x1f339; 光流法介绍 光流描述了像素在图像中的运动&#xff0c;就像彗星☄划过天空中流动图像。同一个像素&#xff0c;随着时…

MacOS触控板缩放暂时失灵问题解决

我的系统版本为Monterey 12.5.1&#xff0c;亲测有效 直接创建脚本xxx.sh&#xff0c;并在终端执行脚本bash xxx.sh即可解决此问题&#xff0c;脚本内容如下&#xff1a; #!/bin/bashkillall Finder #kill Finder如不需要可以删除 killall Dock #kill Dock 如不需要可以删…

【Maven】Maven下载,配置以及基本概念

文章目录 1. Maven简介2. Maven下载3. Maven环境配置4.Maven的基本概念4.1 仓库4.2 坐标4.3 仓库配置(修改IDEA默认Maven库) 1. Maven简介 Maven是一个Java项目管理工具和构建工具&#xff0c;用于管理项目的依赖关系、构建过程以及项目的部署。它是Apache软件基金会的开源项目…

『表面』在平面模型上提取凸(凹)多边形

原始点云 直通滤波,z轴0~1.1 分割模型为平面&#xff0c;分割结果进行投影 提取多边形 代码: #include <pcl/ModelCoefficients.h> // 模型系数的数据结构&#xff0c;如平面、圆的系数 #include <pcl/io/pcd_io.h>#include <pcl/point_types.h> // 点云数据…

nginx uwsgi配置django

uwsgi文件 [uwsgi] # 服务端口号&#xff0c;这里没有设置IP值&#xff0c;默认是加载服务器的IP地址 #http :5000 socket:8000 # flask项目地址 chdir /pyprogram/electric # wsgi文件 /home/flask_project/mange.py #module app:app wsgi-file/pyprogram/electric/electr…

手搓一台简单的网络损伤仪——弱网测试

1、介绍 支持对链路带宽、传输时延、丢包率和无码率的手动设置&#xff1b; 1.1、网络损伤仪在使用时&#xff0c;网络拓扑连接 1.2、网络损伤仪管理页面展示 2、使用的设备及相关技术栈 一台Intel 赛扬 J1900的迷你主机【拥有4个千兆网口】&#xff1b;ubuntu-18.04.5-live…

【机器学习】了解 AUC - ROC 曲线

一、说明 在机器学习中&#xff0c;性能测量是一项基本任务。因此&#xff0c;当涉及到分类问题时&#xff0c;我们可以依靠AUC - ROC曲线。当我们需要检查或可视化多类分类问题的性能时&#xff0c;我们使用AUC&#xff08;曲线下面积&#xff09;ROC&#xff08;接收器工作特…

Coggle 30 Days of ML(23年7月)任务六:训练FastText、Word2Vec词向量

Coggle 30 Days of ML&#xff08;23年7月&#xff09;任务六&#xff1a;训练FastText、Word2Vec词向量 任务六&#xff1a;学会训练FastText、Word2Vec词向量 说明&#xff1a;在这个任务中&#xff0c;你将学习如何训练FastText和Word2Vec词向量模型&#xff0c;这些词向量…

Linux地盘上AMD处理器称王了

近日资讯&#xff0c;尽管从全局来看&#xff0c;Linux系统份额远不及Windows&#xff0c;但在程序员、开发者、硬核玩家圈子&#xff0c;Linux则备受推崇。 来自Steam的最新数据显示&#xff0c;在Linux游戏用户中&#xff0c;AMD处理器的份额占据绝对优势&#xff0c;达到了…

ts学习(一):基础篇1

旨在记录&#xff01; 这篇人都学废了&#xff0c;本想记录常用类型&#xff0c;越学越多&#xff0c;每一个都很重要… 一、string: 字符串类型二、number: 数字类型三、boolean: 布尔值四、array:数组五、tuple: 元组六、字面量七、object:对象八、any: 任意类型九、unknown:…

Spring MVC文件上传

Spring MVC文件上传 Spring MVC 框架的文件上传基于 commons-fileupload 组件&#xff0c;并在该组件上做了进一步的封装&#xff0c;简化了文件上传的代码实现&#xff0c;取消了不同上传组件上的编程差异。 1. MultipartResolver接口 在 Spring MVC 中实现文件上传十分容易…

云和DevOps如何帮助加速数字化转型?

1.云和 DevOps&#xff1a;概述 数字化转型已成为寻求在现代时代蓬勃发展的企业的一项关键举措。为了加速这一转型&#xff0c;组织正在利用云计算的力量并采用DevOps实践。云计算提供可扩展且灵活的基础架构&#xff0c;而 DevOps 则支持协作和持续交付的文化。本文将探讨云和…

MySQL:数据的增删改查

数据的增删改查 前言一、插入数据1、实际问题2、方式1&#xff1a;VALUES的方式添加3、方式2&#xff1a;将查询结果插入到表中 二、删除数据三、更新数据四、查询数据五、MySQL8新特性&#xff1a;计算列 前言 本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知…

PyTorch中的torch.nn.Linear函数解析

torch.nn是包含了构筑神经网络结构基本元素的包&#xff0c;在这个包中&#xff0c;可以找到任意的神经网络层。这些神经网络层都是nn.Module这个大类的子类。torch.nn.Linear就是神经网络中的线性层&#xff0c;可以实现形如yXweight^Tb的加和功能。 nn.Linear()&#xff1a;…

数据库的分片策略

数据库的分片策略 1、范围分片2、hash 取模分片3、一致性hash 分片 1.分片策略 数据库的分片策略是指将数据库中的数据按照一定的规则和方式进行分割&#xff08;分片&#xff09;存储在不同的物理节点或服务器上的策略。分片策略旨在实现水平扩展&#xff0c;提高数据库的性…

前端下载PDF内容空白且大小偏大问题解决

前端使用React框架axios请求后端接口下载文件&#xff0c;请求返回正常但文件大小和内容异常。经排查&#xff0c;其原因是使用了mockjs用作数据模拟&#xff0c;导致了请求异常&#xff0c;将其注释掉后&#xff0c;文件大小与内容恢复正常。 目录 1.文件异常 2.定位问题 3…

【VirtualBox】安装 VirtualBox 提示 needsthe Microsoft Visual C++ 2019

概述 一个好的文章能够帮助开发者完成更便捷、更快速的开发。书山有路勤为径&#xff0c;学海无涯苦作舟。我是秋知叶i、期望每一个阅读了我的文章的开发者都能够有所成长。 一、开发环境 开发环境&#xff1a;windows10虚拟机&#xff1a;VirtualBox 7.0.8 二、报错 ubun…

汽车销售数据可视化分析实战

1、任务 市场需求&#xff1a;各年度汽车总销量及环比&#xff0c;各车类、级别车辆销量及环比 消费能力/价位认知&#xff1a;车辆销售规模及环比、不同价位车销量及环比 企业/品牌竞争&#xff1a;各车系、厂商、品牌车销量及环比&#xff0c;市占率及变化趋势 热销车型&…