vue + elementUI 项目里使用qiniu插件实现上传图片功能

总结:按照七牛官网一步步来就可以实现。

官网链接:JavaScript SDK_SDK 下载_对象存储 - 七牛开发者中心

一、上传单张图片的配置和方法

具体实现步骤:

1、npm 安装qiniu依赖

npm install qiniu-js

2、npm 安装 plupload依赖

npm install plupload --save

3、在上传页面引入插件依赖

var qiniu = require('qiniu-js')

 

4、DOM部分:

<el-form-item label="上传图片:">
    <el-upload action="" :http-request="qiniuUploadCover" list-type="picture-card" :limit="2" :disabled="false" :auto-upload="true" :on-exceed="exceed"
                     :before-upload="beforeUpload" :on-remove="onRemove" :on-preview="handlePictureCardPreview" ref="addEditUpload" :file-list="fileList">
        <i class="el-icon-plus"></i>
     </el-upload>
     <el-dialog :visible.sync="showPic" size="tiny" :append-to-body="true">
         <img width="100%" :src="showPicUrl" alt="">
     </el-dialog>
     <span class="redFont" style="font-size:12px;">建议上传尺寸:宽750px 、高375px</span>
</el-form-item>

el-upload 的属性含义,具体可查看elementUI官网:

:limit="addEditDialog.limit"   

限制图片的数量

:before-upload="beforeUpload" 

上传前的钩子函数。一般对图片的格式、大小进行校验。

http-request="qiniuUpload"  

上传图片的钩子函数。点击upload控件、选中图片之后就会触发这个函数,在该函数里调七牛接口上传图片。

:on-exceed="exceed"

上传的图片数量超出限制时的钩子函数,一般弹出相关提示。

:disabled="false"   

禁用上传图片插件。

:on-remove="onRemove" 

移除图片的钩子函数。

:on-preview="handlePictureCardPreview" 

图片放大查看的钩子函数。

5、js部分:

beforeUpload() 

qiniuUploadCover()

getImagekey()

handlePictureCardPreview()

onRemove()

exceed()

/* 七牛插件公用的函数:
 * 图片上传前的钩子,对图片进行限制
 */
Vue.prototype.beforeUpload = function(file){
    //console.log(file);

     //const isJPG = file.type === 'image/jpeg' || 'image/jpg' || 'image/png';
     var isJPG;
     if(file.type === 'image/jpeg' || file.type === 'image/jpg' || file.type === 'image/png'){
        isJPG=true;
     }else{
        isJPG=false;
     }

     const isLt2M = file.size / 1024 / 1024 < 3;

     if (!isJPG) {
        //this.$message.error('上传头像图片只能是 jpeg/jpg/png 格式!');
        this.$message({
            message: '上传头像图片只能是 jpeg/jpg/png 格式!',
            type: 'error',
            duration:1500,
            showClose: true,
         });
      }
      if (!isLt2M) {
         //this.$message.error('上传头像图片大小不能超过 3MB!');
         this.$message({
             message: '上传头像图片大小不能超过 3MB!',
             type: 'error',
             duration:1500,
             showClose: true,
          });
       }
       return isJPG && isLt2M;
}

    /* 得到图片中间的key
     * 新增和编辑时上传图片到七牛都调用 _this.getImagekey(_this.oldPicUrl) 方法,参数要求:
     * 新增:_this.oldPicUrl=""
     * 编辑:_this.oldPicUrl 值为修改前的图片url
    */
    Vue.prototype.getImagekey = function(url){
        var key="tmp_bj_" + Date.parse(new Date());
        var count="0";
        if(url!=""){
            if(url.indexOf("http://image.qxdaojia.com")>=0){
                if(url.indexOf("?")>=0){
                    key=url.substring(26).substring(0,url.substring(26).lastIndexOf("?"));
                    count="1";//覆盖
                }else{
                    key=url.substring(26);
                    count="1";//覆盖
                }
            }
        }
        //其中覆盖时,key与url相等;普通上传时,url为空,key为上传的key.
        return { key:key , url : count == "0" ? "" : key };
    }
    //文件超出个数限制时的钩子
    Vue.prototype.exceed = function(files, fileList){
        // console.log(files);
        // console.log(fileList);
        this.$message({
            message: '上传的图片数量超出限制!',
            type: 'warning',
            duration:1500,
            showClose: true,
        });
    }

//移除upload控件的图片url
            onRemove (file, fileList) {
                // file : 当前被删除的图片
                // fileList : 删除后还剩下的图片
                //console.log(file);console.log(fileList);
                _this.oldPicUrl = file.url;//暂存被删掉的旧图片
                
                //删除一张图片之后的upload控件值
                var arr =[];
                fileList.forEach(function(ele){
                    arr.push(ele.url);
                })
                _this.form.rnImage=arr.toString();
            },
            handlePictureCardPreview(file) {//放大查看图片
                _this.showPicUrl = file.url;
                _this.showPic = true;
            },
            qiniuUploadCover(event){
                /* 新增和编辑时上传图片到七牛都调用此方法,参数要求:
                新增:paramObj:{key:"tmp_bj_" + Date.parse(new Date()),url:""}
                编辑:paramObj:_this.getImagekey(_this.oldPicUrl);
                */
               //console.log(_this.oldPicUrl);debugger
                var paramObj=_this.getImagekey(_this.oldPicUrl);
                uptokencover(paramObj).then(res => {
                    if(res.code==0){
                        var qiniu_token = res.data.uptoken;

                        /*  file: blob对象,上传的文件; 
                            key: string, 文件资源名
                            token: string, 上传验证信息,前端通过接口请求后端获得
                            putExtra: object, 
                            config: object
                        */
                        var putExtra={
                            fname: "",//文件原文件名
                            params: {},//用来放置自定义变量
                            mimeType: ["image/png", "image/jpeg", "image/gif"],//用来限定上传文件类型,指定null时自动判断文件类型。
                        }
                        var config={
                            useCdnDomain: true,//表示是否使用 cdn 加速域名,为布尔值,true 表示使用,默认为 false。
                            region: qiniu.region.z2,//选择上传域名区域;当为 null 或 undefined 时,自动分析上传域名区域
                        }
                        var observable  = qiniu.upload(event.file, paramObj.key, qiniu_token, putExtra, config);
                        var subscription = observable.subscribe({
                            next(res){
                                // next: 接收上传进度信息,res 参数是一个带有 total 字段的 object,包含loaded、total、percent三个属性,提供上传进度信息。
                                //console.log(res);
                            },
                            error(err){
                                // 上传错误后触发,当不是 xhr 请求错误时,会把当前错误产生原因直接抛出,诸如 JSON 解析异常等;当产生 xhr 请求错误时,参数 err 为一个包含 code、message、isRequestError 三个属性的 object
                                //console.log(err);
                            }, 
                            complete(res){
                                //console.log(res);
                                // 接收上传完成后的后端返回信息,res 参数为一个 object, 为上传成功后后端返回的信息,具体返回结构取决于后端sdk的配置
                                //1、先把上传前的图片url保存为数组
                                var customaryImgArr = [];
                                if(_this.form.rnImage!=""){
                                    customaryImgArr = _this.form.rnImage.split(",");
                                }
                                //2、把当前上传的图片插入数组
                                customaryImgArr.push( "http://image.qxdaojia.com/"+paramObj.key+"?v="+Date.parse(new Date()) );
                                //3、把数组转换成string,给接口保存。
                                _this.form.rnImage = customaryImgArr.toString();
                                
                            }
                        }) // 上传开始
                    }else{
                        _this.$message({
                            message: res.message,
                            type: 'error',
                            duration:1500,
                            showClose: true,
                        });
                    }
                });
            },

二、上传多张图片的方法

1、Dom部分:给el-upload添加multiple属性,支持一次选择多图。

<el-upload :multiple="true"></el-upload>

2、【注意】上传图片时图片url要拼接唯一的key,通过_this.getImagekey(_this.oldPicUrl)来获取。但是同时上传多个文件时,短时间内多次调用_this.getImagekey()返回的key是相同的,所以此时需要在_this.getImagekey()返回的key后面再拼接唯一的字符标识。否则七牛上传图片会报614错误(文件已存在)。

其他的地方还是和上传单张图片时一样。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: VueElementUI是一对非常强大的前端开发工具,可以帮助我们快速实现增删改查功能。具体实现步骤如下: 1. 安装VueElementUI 首先需要安装VueElementUI,可以使用npm或yarn进行安装。 2. 创建Vue组件 创建一个Vue组件,包含增删改查的功能。可以使用ElementUI提供的组件,如表格、表单、对话框等。 3. 实现数据绑定 使用Vue的数据绑定功能,将组件中的数据和页面中的元素进行绑定。可以使用v-model指令实现双向数据绑定。 4. 实现增删改查功能 使用Vue的方法和事件处理功能实现增删改查的功能。可以使用axios或fetch等工具进行数据的请求和响应。 5. 完成样式设计 使用ElementUI提供的样式和自定义样式,完成页面的样式设计。 以上就是使用VueElementUI实现增删改查功能的基本步骤。需要注意的是,具体实现过程可能会因为项目需求的不同而有所差异。 ### 回答2: Vue ElementUI 是一套基于 Vue.js 的开源 UI 组件库,提供了丰富的组件和样式库,使开发人员可以更方便、快速地创建美观,符合规范的项目界面。本文将以 Vue ElementUI 为基础,介绍如何实现增删改查功能。 一、安装 Vue ElementUI 首先,需要安装 Vue.js 和 ElementUI。 在命令行中执行以下命令安装: ``` npm install vue npm install element-ui ``` 二、创建 Vue ElementUI 项目 在命令行中执行以下命令来创建一个新的 Vue ElementUI 项目。 ``` vue create vue-elementui-demo ``` 三、在Vue文件中引入ElementUI组件库 修改App.vue文件,引入ElementUI组件库。 ``` <template> <div id="app"> <el-header>Header</el-header> <el-main>Main Content</el-main> <el-footer>Footer</el-footer> </div> </template> <script> import ElementUI from 'element-ui'; import 'element-ui/lib/theme-chalk/index.css'; export default { name: 'app', components: { 'el-header': ElementUI.Header, 'el-main': ElementUI.Main, 'el-footer': ElementUI.Footer } }; </script> ``` 四、创建增删改查页面 首先,在src目录下创建一个名为views的文件夹,用于存放页面组件。在views文件夹中新建一个名为user.vue的组件文件用于实现增删改查页面。 创建一个表格用于显示用户列表,并添加一个操作列,用于添加、编辑和删除操作。代码如下: ``` <template> <div class="user"> <el-button @click="handleCreate">新建</el-button> <el-table :data="tableData" style="width: 100%"> <el-table-column prop="name" label="姓名"></el-table-column> <el-table-column prop="gender" label="性别"></el-table-column> <el-table-column prop="age" label="年龄"></el-table-column> <el-table-column label="操作"> <template slot-scope="scope"> <el-button @click="handleEdit(scope.row)">编辑</el-button> <el-button @click="handleDelete(scope.row)">删除</el-button> </template> </el-table-column> </el-table> </div> </template> <script> export default { data() { return { tableData: [ {name: "张三", gender: "男", age: "18"}, {name: "李四", gender: "女", age: "20"}, {name: "王五", gender: "男", age: "22"} ] } }, methods: { handleCreate() { // TODO: 弹出新建对话框 }, handleEdit(row) { // TODO: 弹出编辑对话框 }, handleDelete(row) { // TODO: 弹出删除确认对话框,确认后从tableData中删除该行数据 } } } </script> ``` 五、实现新建、编辑、删除对话框 为了实现新建、编辑、删除操作,需要实现对应的对话框组件。创建一个名为user-dialog.vue的组件文件用于实现这些对话框。 代码如下: ``` <template> <el-dialog :title="title" :visible.sync="dialogVisible"> <el-form :model="form" label-position="left" label-width="80px"> <el-form-item label="姓名"> <el-input v-model="form.name"></el-input> </el-form-item> <el-form-item label="性别"> <el-radio-group v-model="form.gender"> <el-radio label="男">男</el-radio> <el-radio label="女">女</el-radio> </el-radio-group> </el-form-item> <el-form-item label="年龄"> <el-input v-model="form.age"></el-input> </el-form-item> </el-form> <div slot="footer" class="dialog-footer"> <el-button @click.native="dialogVisible = false">取消</el-button> <el-button type="primary" @click.native="handleSave">保存</el-button> </div> </el-dialog> </template> <script> export default { props: { title: { type: String, required: true }, visible: { type: Boolean, required: true }, form: { type: Object, required: true } }, computed: { dialogVisible: { get() { return this.visible; }, set(val) { this.$emit('update:visible', val); } } }, methods: { handleSave() { this.$emit('save'); } } } </script> ``` 在user.vue中引入user-dialog.vue组件,并为每个操作添加对应的处理函数来弹出对应的对话框。 代码如下: ``` <template> <div class="user"> <el-button @click="handleCreate">新建</el-button> <el-table :data="tableData" style="width: 100%"> <!-- 省略的列 --> </el-table> <user-dialog title="新建用户" :visible.sync="createDialogVisible" :form="createForm" @save="handleCreateSave"/> <user-dialog title="编辑用户" :visible.sync="editDialogVisible" :form="editForm" @save="handleEditSave"/> <el-dialog title="删除确认" :visible.sync="deleteDialogVisible"> <p>确定要删除“{{deleteForm.name}}”吗?</p> <div slot="footer" class="dialog-footer"> <el-button @click.native="deleteDialogVisible = false">取消</el-button> <el-button type="danger" @click.native="handleDelete">删除</el-button> </div> </el-dialog> </div> </template> <script> import UserDialog from '@/views/user-dialog.vue'; export default { components: { UserDialog }, data() { return { tableData: [ {id: 1, name: "张三", gender: "男", age: "18"}, {id: 2, name: "李四", gender: "女", age: "20"}, {id: 3, name: "王五", gender: "男", age: "22"} ], createDialogVisible: false, createForm: { name: "", gender: "男", age: "" }, editDialogVisible: false, editForm: { id: 0, name: "", gender: "", age: "" }, deleteDialogVisible: false, deleteForm: { id: 0, name: "" } } }, methods: { handleCreate() { this.createForm.name = ""; this.createForm.gender = "男"; this.createForm.age = ""; this.createDialogVisible = true; }, handleCreateSave() { const id = Math.max(0, ...this.tableData.map(item => item.id)) + 1; const data = {... this.createForm, id}; this.tableData.push(data); this.createDialogVisible = false; }, handleEdit(row) { this.editForm.id = row.id; this.editForm.name = row.name; this.editForm.gender = row.gender; this.editForm.age = row.age; this.editDialogVisible = true; }, handleEditSave() { const index = this.tableData.findIndex(item => item.id === this.editForm.id); if (index >= 0) { this.tableData.splice(index, 1, this.editForm); } this.editDialogVisible = false; }, handleDelete(row) { const index = this.tableData.findIndex(item => item.id === row.id); if (index >= 0) { this.tableData.splice(index, 1); } this.deleteDialogVisible = false; }, handleDeleteSave() { this.handleDelete(this.deleteForm); } } } </script> ``` 以上就是如何使用 Vue ElementUI 实现增删改查功能的介绍,希望对你有所帮助。 ### 回答3: Vuejs是目前最流行的前端框架之一,随着其火爆的发展,越来越多的公司和开发者喜欢使用Vuejs开发项目,其中Vuejs与element-ui的组合是目前最常用的一种方式,element-ui提供了一整套完整的UI组件库,可以轻松地实现页面开发。在实现增删改查功能时,Vuejs与element-ui非常适合,可以极大地提高我们的开发效率,让我们快速实现各种功能。 首先,我们需要安装Vue-cli 3.x版本,使用Vue-cli创建一个Vue项目,安装element-ui库。我们还需要安装axios库,它可以用来与后端API通信。 接下来,我们需要创建一个列表页,将数据展示在页面上,同时还需要添加按钮以执行相应的操作。这个列表页可以通过element-ui的table组件来实现,同时使用axios库与后端api通信,获取数据并将其渲染到页面上。 在实现增加数据功能时,我们可以通过一个Dialog弹窗来实现,通过展示表单进行新增数据操作。此时我们就需要用到element-ui的Dialog组件,将表单组件放在Dialog面,同时使用axios与后端进行通信。 修改数据同样也可以使用弹窗进行实现,只需要在弹窗的表单填入需要修改的数据,通过axios向后端发送更新请求即可。 最后,删除数据可以通过一些操作按钮来处理,例如:删除按钮,勾选数据后点击删除按钮即可。在处理完删除数据请求之后,使用axios与后端进行通信。 总之,使用Vuejs与element-ui一起开发增删改查功能是一种很高效的方式,这个组合可以大大提高我们前端开发的效率,减少开发周期。同时各种组件也可以通过element-ui的样式来保证我们UI的一致性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值