• Django:实现导入功能,及下载模版


    配置 setting.py ,将upload路径定义在根目录下

    # 文件上传配置
    UPLOAD_ROOT = os.path.join(BASE_DIR,'upload')

    前端

    <button id="select_file" class="btn btn-primary">导入</button>
    <a href="/env/file_down">下载模版</a>

    js:

        $(function () {
            var file; // 定义一个全局变量,为一个文本选择器。
            file = $('<input type="file" id="upload_file"/>'); // 这样file就是jquery创建的一个文本选择器,但是因为我们并没有把它加载到页面山,所以是不可见的。
            // button的单击事件
            $('#select_file').click(function () {
                // 启动文件选择
                file.click();
            });
            // 上传文件:选择好文件后,获取选择的内容并上传到指定路径
            file.change(function (e) {
                var fileobj = file[0].files[0];
                console.log(fileobj);
                var form = new FormData();
                form.append("select_file", fileobj);
                event.target.value = null; //解决type="file" 只能上传一次的问题
                $.ajax({
                    type: 'POST',
                    url: '/env/upload_server_info',
                    data: form,
                    processData: false,
                    contentType: false,
                    success: function (data) {
                        console.log(data)
                        data = JSON.parse(data)
                        console.log(typeof data)
                        if (data.code == 200) {
                            toastr.success("上传成功");
                            $("#mytab").bootstrapTable('refresh');
                        }
                        else {
                            toastr.warning(data.msg);
                        }
                    },
                    error: function () {
                        toastr.warning("上传失败");
                    }
                })
            })
        })

    后端: 

    # -*- coding: utf-8 -*-
    from __future__ import unicode_literals
    
    import json
    import xlrd
    from django.http import HttpResponse, FileResponse
    import os
    from AutoTestSite.settings import BASE_DIR, UPLOAD_ROOT
    from env.models import ServerInfo, Projects
    
    
    def upload_server_info(request):
        """
        上传文件
        :param request:
        :return:
        """
        file_obj = request.FILES.get('select_file')
        # 创建upload文件夹
        if not os.path.exists(UPLOAD_ROOT):
            os.makedirs(UPLOAD_ROOT)
        try:
            if file_obj is None:
                return HttpResponse('请选择要上传的文件')
            # 循环二进制写入
            f = open(os.path.join(BASE_DIR, UPLOAD_ROOT, file_obj.name), 'wb')
            for chunk in file_obj.chunks():
                f.write(chunk)
            f.close()
        except Exception as e:
            return HttpResponse(json.dumps({"code": 300, "msg": "上传文件失败"}))
        # 写入数据库
        return parse_xls(file_obj.name)
    
    
    def parse_xls(filename):
        # print(UPLOAD_ROOT + "\" + filename)
        file_path = UPLOAD_ROOT + "\" + filename
        # print(file_path)
        try:
            # 打开上传 excel 表格
            readboot = xlrd.open_workbook(r"%s" % file_path)
        except FileNotFoundError:
            print('没有找到文件')
        sheet = readboot.sheet_by_index(0)
        # 获取excel的行和列
        nrows = sheet.nrows
        ncols = sheet.ncols
        # print(ncols, nrows)
        from common import encrypt
        # 循环插入每行数据
        for i in range(1, nrows):
            row = sheet.row_values(i)
            project_name = row[0]
            server_ip = row[2]
            app_port = int(row[3])
            app = row[4]
            cpu = int(row[5])
            memory = int(row[6])
            disk = int(row[7])
            login_name = row[8]
            login_pwd = encrypt.des_encrypt(str(row[9]))
            status = int(row[10])
            print(row)
            print(str(server_ip))
            from common import validate
            if not validate.check_ip(str(server_ip)):
                print("ip格式不正确")
                return HttpResponse(json.dumps({"code": 400, "msg": "{},ip格式不正确".format(server_ip)}))
    
            try:
                # 检查是否存非法的项目名
                project_instance = Projects.objects.get(project_name=project_name)
            except Exception as e:
                return HttpResponse(json.dumps({"code": 300, "msg": "项目名称[{}]不存在".format(project_name)}))
            # 判断库中是否存在该ip
            if ServerInfo.objects.filter(server_ip=server_ip).count() != 0:
                return HttpResponse(json.dumps({"code": 400, "msg": "{},已存在".format(server_ip)}))
            try:
                # 写入数据库
                ServerInfo.objects.create(project_name=project_instance, server_ip=server_ip, app_port=app_port, app=app,
                                          cpu=cpu,
                                          memory=memory, disk=disk, login_name=login_name,
                                          login_pwd=login_pwd, status=status)
            except Exception as e:
                return HttpResponse(json.dumps({"code": 400, "msg": "导入失败,请检查导入数据"}))
    
        return HttpResponse(json.dumps({"code": 200, "msg": "导入成功"}))
    
    
    def file_down(request):
        """
        下载导入服务器模版
        :param request:
        :return:
        """
        file = open(os.path.join(BASE_DIR, UPLOAD_ROOT, "template.xlsx"), 'rb')
        print(os.path.join(BASE_DIR, UPLOAD_ROOT, "template.xlsx"))
        response = FileResponse(file)
        response['Content-Type'] = 'application/octet-stream'
        response['Content-Disposition'] = 'attachment;filename="template.xlsx"'
        return response
  • 相关阅读:
    微服务治理热门技术揭秘:无损上线
    云原生事件驱动引擎(RocketMQEventBridge)应用场景与技术解析
    阿里云解决方案架构师张平:云原生数字化安全生产的体系建设
    Vue配置对象
    js 实现reduce
    js 实现bind
    Vue简介
    关于Nodejs 技术架构 如何与C++通信
    cdn原理与优缺点 cdn跨域问题
    Vue模板语法 插值语法与指令语法
  • 原文地址:https://www.cnblogs.com/gcgc/p/14044613.html
Copyright © 2020-2023  润新知