视频电商网站实战 - 构建视频提交页面:视频封面上传(上)

[上节课](http://blog.csdn.net/github_26672553/article/details/54615267
)

我们已经初步构建了一个『发布视频』的界面,本节课我们来完善

参考Element-UI文档:http://element.eleme.io/#/zh-CN/component/upload
给发布视频组件publish.vue,添加如下模板内容:

<el-form-item label="视频封面" prop="v_pic">
    <el-upload
            action="//jsonplaceholder.typicode.com/posts/"
            type="drag"
            :thumbnail-mode="true"
            :on-preview="handlePreview"
            :on-remove="handleRemove"
            :on-success="handleSuccess"
            :multiple="false"
    >
        <i class="el-icon-upload"></i>
        <div class="el-dragger__text">将文件拖到此处,或<em>点击上传</em></div>
        <div class="el-upload__tip" slot="tip">只能上传jpg/png文件,且不超过500kb</div>
    </el-upload>
</el-form-item>

这里写图片描述
JS部分:

methods: {
    handleRemove(file, fileList) {
        //移除图片
        console.log(file, fileList);
    },
    handlePreview(file) {
        //预览图片
        console.log(file);
    },
    handleSuccess(file){
        //响应成功
    }
}

这里写图片描述
此时上传图片,可以预览。通过观察我们发现控制台请求了http://jsonplaceholder.typicode.com/posts/ 路径,这就是上传图片的服务端地址,我们需要换成我们的后台的路径即可。

来到后端程序,处理图片上传

因为我们课程着重与Vue.js,后端使用的PHP框架(Yii2),我们就不做过多介绍。
Yii2文件上传参考文档:http://www.yiichina.com/doc/guide/2.0/input-file-upload

比如我们后端上传图片的地址是:http://localhost/yiiserver/web/index.php/video/upload
那么,在publish.vue组件模板上需要修改el-upload元素的action属性,具体代码:

<el-upload
                            action="http://localhost/yiiserver/web/index.php/video/upload"
                            type="drag"
                            :thumbnail-mode="true"
                            :on-preview="handlePreview"
                            :on-remove="handleRemove"
                            :on-success="handleSuccess"
                            :multiple="false"
                            name="Uploader[file]"
                    > </el-upload>

除了修改action,还需要注意name,因为我们使用的Yii2框架,UploadedFile[xxx]是框架的规定。框架后端通过xxx来接收文件。

另外http://localhost/yiiserver/web/index.php/video/upload 需要访问一个json对象:

{"name":"","status":0,"url":""}

表示图片在后端上传成功,返回的json用于前端判断。

我们在data中定义个pic对象,用来接受后端返回的数据:

data(){
    return {
        video:{
            v_title:'',
            v_class:2,
            v_pic:{name:'',url:''},
        },
    }
},

handleSuccess方法就是用来处理后端响应的

handleSuccess(file){
    //响应成功
    console.log(file);
    if(file.status ==1){
        //保存后端返回来的数据
        this.video.v_pic.url = file.url;
        this.video.v_pic.name = file.name;
    }else{
        alert('上传失败,,请稍后再试');
    }
}

这里写图片描述

这里写图片描述
有一个查看图片的功能,我们可以来做一下。
在模板上加入下面内容:

<el-dialog title="图片预览" v-model="isShowPic" size="small">
            <span>
                <img :src="video.v_pic.url">
            </span>
            <span slot="footer" class="dialog-footer">
          </span>
        </el-dialog>

v-model可以看出,我们是通过isShowPic这个data属性来控制对话框是否弹出。
所在在data()里需要定义isShowPic:false,默认对话框是关闭的。
当用户点击『查看图片』就是调用handlePreview方法:

handlePreview(file) {
    //预览图片
    console.log(file);
    this.isShowPic = true;
},

自此完整的publish.vue代码如下

<template>
    <div>

        <el-dialog title="图片预览" v-model="isShowPic" size="small">
            <span>
                <img :src="video.v_pic.url">
            </span>
            <span slot="footer" class="dialog-footer">
          </span>
        </el-dialog>

        <el-form :model="video"  label-width="100px" class="demo-ruleForm">
            <el-col :span="12">
                <el-form-item label="视频标题" prop="v_title">
                    <el-input v-model="video.v_title" placeholder="请输入视频标题"></el-input>
                </el-form-item>
                <el-form-item label="视频分类" prop="v_class">
                    <el-select v-model="video.v_class" placeholder="请选择">
                        <el-option
                            v-for="item in this.$store.getters.navForVideoClass"
                            :label="item.nav_text"
                            :value="item.nav_id"
                        >
                            {{item.nav_text}}
                        </el-option>
                    </el-select>
                </el-form-item>

                <el-form-item label="视频封面" prop="v_pic">
                    <el-upload
                            action="http://localhost/yiiserver/web/index.php/video/upload"
                            type="drag"
                            :thumbnail-mode="true"
                            :on-preview="handlePreview"
                            :on-remove="handleRemove"
                            :on-success="handleSuccess"
                            :multiple="false"
                            name="Uploader[file]"
                    >
                        <i class="el-icon-upload"></i>
                        <div class="el-dragger__text">将文件拖到此处,或<em>点击上传</em></div>
                        <div class="el-upload__tip" slot="tip">只能上传jpg/png文件,且不超过500kb</div>
                    </el-upload>
                </el-form-item>

            </el-col>

            <el-col :span="12"></el-col>

        </el-form>
    </div>
</template>

<script>
    export default{
        data(){
            return {
                video:{
                    v_title:'',
                    v_class:2,
                    v_pic:{name:'',url:''},
                },
                isShowPic:false,
            }
        },

        methods: {
            handleRemove(file, fileList) {
                //移除图片
                console.log(file, fileList);
                this.video.v_pic.url = '';
                this.video.v_pic.name = '';
            },
            handlePreview(file) {
                //预览图片
                console.log(file);
                this.isShowPic = true;
            },
            handleSuccess(file){
                //响应成功
                console.log(file);
                if(file.status ==1){
                    //保存后端返回来的数据
                    this.video.v_pic.url = file.url;
                    this.video.v_pic.name = file.name;
                }else{
                    alert('上传失败,,请稍后再试');
                }
            }
        }
    }
</script>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值