html文件上传前端模板,开箱即用

一、需求:在用户信息中增加一个附件配置的功能,发送邮件给客户时一起发送附件。本文主要记录次案例的前端模块。

效果:点击上传文件,选择文件后,ui-li列表动态产生数据(v-for)。点击删除可删除对应列表。

二、思路:

模态框出现的时候发请求查询数据库中的字段并渲染到页面上,点击上传文件出现选择页面,监听input的change事件,触发后调用文件上传接口上传文件到后端,同时前端ui li 绑定的fileList数组新增元素,点击保存按钮调接口存储数据到数据库中。实际上数据库中存储的字段是文件名(xxx.zip,xxx.pdf),点击删除后只是删除前端中data中对应的数组元素,点击保存后才真正生效。

三、实现:

1、先引入vue和elementUI,提升下开发速度,这个看个人需求。

    <link href="../../static/css/element.css" rel="stylesheet"/>
    <script src="../../static/js/vue.min.js"></script>
    <script src="../../static/js/element.js"></script>

 js部分:由于django框架的原因,{{}}的模板语法会和django自带的产生冲突,故改成[[]]。

var vm = new Vue({
            delimiters: ['[[', ']]'],
            el: '#app',
            data() {
                return {
                }
            },
            methods: {
            }
        })

2、html代码:

<div style="height: 35px;display: flex;justify-content: center;" class="form-group">
                                <label class="col-sm-3 control-label">客户编号:</label>
                                <div class="col-sm-7">
                                    <input type="text" class="form-control" v-model="customer.customerSysId" disabled>
                                </div>
                            </div>
                            <div style="height: 35px;display: flex;justify-content: center;" class="form-group">
                                <label class="col-sm-3 control-label">客户公司:</label>
                                <div class="col-sm-7">
                                    <input type="text" class="form-control" v-model="customer.customerCompany" disabled>
                                </div>
                            </div>
                            <div style="padding: 0 15px;" class="">

                                <input style="left:-9999px;position:absolute;" id="file" class="" ref="fileRef"
                                       type="file" placeholder="" @change='change'
                                       multiple=true name='file'>
                                <ul style="padding-left: 65px" v-for="(item, index) in customer.fileList" :key="index">
                                    <li style="width: 428px">
                                        <div style="display: flex;justify-content:space-between;">
                                            <span>[[item.name]]</span>
                                            
                                                <el-button size="mini" type="danger" @click="deleteFile(index)">删除
                                                </el-button>

                                        </div>
                                    </li>
                                </ul>
                            </div>

3、js代码

data部分:

data() {
          return {
          mainText: '',
          customer: {
          files: [],
          fileList: [],
          customerSysId: '',
          customerCompany: '',
                    }
                }
            },

methods部分:



                deleteFile(e) {
                    this.customer.fileList.splice(e, 1)
                },
                change() {
                    if (this.$refs.fileRef.files.length == 0) {

                    } else {

                        for (let i = 0; i < this.$refs.fileRef.files.length; i++) {
                            console.log(this.$refs.fileRef.files[i])
                            this.customer.fileList.push(this.$refs.fileRef.files[i])

                        }
                        let fd = new FormData()
                        for (let i = 0; i < this.customer.fileList.length; i++) {
                            fd.append('file', this.customer.fileList[i])
                        }
                        $.ajax({
                            cache: false,
                            type: "POST",
                            url: "/withExpProgram/upload/",
                            //traditional: true, //加上此项可以传数组
                            // dataType: 'json',
                            contentType: false,
                            processData: false,
                            async: true,
                            data: fd,
                            success: (res) => {
                            },
                            error: (err) => {
                            }
                        })
                    }
                    console.log('this.$refs.fileRef.files', this.$refs.fileRef.files.length);
                    console.log('this.customer.fileList', this.customer.fileList)
                },
                customer_files() {
                    let filesName = []
                    for (let i = 0; i < this.customer.fileList.length; i++) {
                        filesName.push(this.customer.fileList[i].name)
                    }
                    let data = {
                        customerSysId: this.customer.customerSysId,
                        filesName: filesName
                    }
                    $.ajax({
                        cache: false,
                        type: "POST",
                        url: "/withExpProgram/customer_files/",
                        traditional: true, //加上此项可以传数组
                        dataType: 'json',
                        async: true,
                        data: data,
                        success: (res) => {
                            this.$message({
                                message: '保存成功!',
                                type: 'success'
                            });
                            console.log(res);
                        },
                        error: (err) => {
                            console.log(err);
                        }
                    })
                }

vue实例之外的部分:这个方法不写到methods里面的原因是使用了bootstrap-table插件,有些不兼容的地方,索性就写到外面。反正也不影响。

//点击修改弹出模态框并调接口查询用户附件配置
function files_setting(customerSysId, customerCompany) {
            $("#customerFiles").modal("show");
            vm.customer.customerSysId = customerSysId
            vm.customer.customerCompany = customerCompany
            $.ajax({
                cache: false,
                type: "POST",
                url: "/withExpProgram/query_customer_files/",
                //traditional: true, //加上此项可以传数组
                dataType: 'json',
                data: {customerSysId},
                success: (res) => {
                    if (res.errno == 0) {
                        for (let i = 0; i < res.data.files.length; i++) {
                            vm.customer.fileList.push({'name': res.data.files[i]})
                        }
                    }
                    console.log('fileList:', vm.customer.fileList);

                    console.log(res);
                },
                error: (err) => {
                    console.log(err);
                }
            });
        }
{#监听模态框关闭,关闭后清除数组#}
        $('#customerFiles').on('hidden.bs.modal', function () {
            vm.customer.fileList = []
        })

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值