2.django+vue+element实现上传文件进度条

分享一份django+vue+element的上传文件进度的简易实现。

采用的是半分离,没有用到vue-cli

需求是上传csv文件,但模板的内容比较小,为了实现一下进度条的效果,暂时没有做文件格式的限制

效果

在这里插入图片描述
在这里插入图片描述

1 前端核心代码

  • html

    <div class="form-group" v-for="(l, index) in data.regions">
        <label class="col-sm-2 control-label">地区名称</label>
        <div class="col-sm-4">
            .....
        </div>
        <div class="col-sm-4">
            <div class="col-sm-6">
                <button class="btn btn-xs btn-warning" v-show="!l.file.name">请选择csv文件</button>
                <el-progress :text-inside="true" :stroke-width="24" :percentage="l.file.process"
                             :status="l.file.status" v-show="l.file.name"></el-progress>
            </div>
            <div class="col-sm-6">
                <button class="btn btn-xs btn-success" type="button"
                        @click="selectFile($event)">上传文件</button>
                <input type="file" v-show="false" @change="upload($event, index)">
            </div>
        </div>
        <div class="col-sm-2">
            <button class="btn btn-xs btn-danger" type="button" @click="del(index)"
                    v-show="index!==0">-</button>
            <button class="btn btn-xs btn-primary" type="button" @click="add"
                    v-show="index===data.regions.length-1">+</button>
        </div>
    </div>
    
  • js

    let vm1 = new Vue({
        el: '#myModal1',
        delimiters: ['[[', ']]'],
        data: {
            name: '',
            witch: '',
            data: {
                name: '',
                logic_env: '',
                battle_env: '',
                regions: [
                    { region_id: '', file: { name: '', remote_src: '', status: null, process: 0 } },
                ],
            },
        },
        methods: {
            selectFile(event) {
                let file = event.target.nextElementSibling
                file.click()
            },
            upload(event, index) {
                let file = event.target.files[0]
                let which = this.data.regions[index]
                if (!file) {
                    toastr.warning('请选择文件')
                    return
                }
                which.file.name = file.name
                let formData = new FormData();
                let that = this
                formData.append('file', file)
                which.file.status = null
                axios({
                    method: 'post',
                    url: '/swan/uploads/',
                    // headers: {'Content-Type': 'multipart/form-data'},
                    data: formData,
                    onUploadProgress(progressEvent) {
                        if (progressEvent.lengthComputable) {
                            let val = (progressEvent.loaded / progressEvent.total * 100).toFixed(0);
                            console.log(parseInt(val))
                            which.file.process = parseInt(val)
                        }
                    }
                }).then(response => {
                    console.log(response.data.data.remote_src)
                    which.file.status = 'success'
                })
                    .catch(error => {
                    which.file.status = 'exception';
                    // 进度为0看不到颜色,不好判断,所以设置了30
                    which.file.process = 30;
                    toastr.error(error.response.data.msg)
    
                })
            },
            add() {
                this.data.regions.push({ region_id: '', file: { name: '', remote_src: '', status: null, process: 0 } })
            },
            del(index) {
                this.data.regions.splice(index, 1)
            },
            submit: function () {
                let url = this.submitUrl;
                let data = this.data;
                axios.post(url, data)
                    .then(function (response) {
                    toastr.success(response.data.msg);
                    vm.search();
                    vm.$refs.refLogic.getoption()
                    vm.$refs.refBattle.getoption()
                    vm.$refs.refRegion.getoption()
                })
                    .catch(function (err) {
                    toastr.error(err.response.data.msg)
                });
                $('#myModal1').modal('hide')
    
            }
        }
    })
    

2 后端

def upload(request):
    """上传文件"""
    BASE_DIR = '/tmp/test/'
    if request.method == 'POST':
        file = request.FILES.get('file', None)
        if file is None:
            raise KeyError('请选择上传文件')
        os.popen('mkdir -p {base}'.format(base=BASE_DIR))
        file_dir = os.path.join(BASE_DIR, file.name)
        with open(file_dir, 'wb') as f:
            for chunk in file.chunks():
                f.write(chunk)
        return response_200_success(data={'remote_src': file_dir})
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值