vue实现移动端图片裁剪上传功能

本文实例为大家分享了vue移动端图片裁剪上传的具体代码,供大家参考,具体内容如下

1. 安装cropperjs依赖库

npm install cropperjs

2. 编写组件SimpleCropper.vue

<template>
 <div class="v-simple-cropper">
 <slot>
  <button @click="upload">上传图片</button>
 </slot>
 <input class="file" ref="file" type="file" accept="image/*" @change="uploadChange">
 <div class="v-cropper-layer" ref="layer">
  <div class="layer-header">
  <button class="cancel" @click="cancelHandle">取消</button>
  <button class="confirm" @click="confirmHandle">裁剪</button>
  </div>
  <img ref="cropperImg">
 </div>
 </div>
</template> 

<script>
import Cropper from 'cropperjs'
import 'cropperjs/dist/cropper.min.css'
export default {
 name: 'v-simple-cropper',
 props: {
 initParam: Object,
 successCallback: {
  type: Function,
  default: () => {}
 }
 },
 data () {
 return {
  cropper: {},
  filename: ''
 }
 },
 mounted () {
 this.init()
 },
 methods: {
 // 初始化裁剪插件
 init () {
  let cropperImg = this.$refs['cropperImg']
  this.cropper = new Cropper(cropperImg, {
  aspectRatio: 1 / 1,
  dragMode: 'move'
  })
 },
 // 点击上传按钮
 upload () {
  this.$refs['file'].click()
 },
 // 选择上传文件
 uploadChange (e) {
  let file = e.target.files[0]
  this.filename = file['name']
  let URL = window.URL || window.webkitURL
  this.$refs['layer'].style.display = 'block'
  this.cropper.replace(URL.createObjectURL(file))
 },
 // 取消上传
 cancelHandle () {
  this.cropper.reset()
  this.$refs['layer'].style.display = 'none'
  this.$refs['file'].value = ''
 },
 // 确定上传
 confirmHandle () {
  let cropBox = this.cropper.getCropBoxData()
  let scale = this.initParam['scale'] || 1
  let cropCanvas = this.cropper.getCroppedCanvas({
  width: cropBox.width * scale,
  height: cropBox.height * scale
  })
  let imgData = cropCanvas.toDataURL('image/jpeg')
  let formData = new window.FormData()
  formData.append('fileType', this.initParam['fileType'])
  formData.append('img', imgData)
  formData.append('signId', this.$localStorage('signId'))
  formData.append('originalFilename', this.filename)
  window.$axios(this.initParam['uploadURL'], formData, {
  method: 'post',
  headers: {'Content-Type': 'multipart/form-data'}
  }).then(res => {
  this.successCallback(res.data)
  this.cancelHandle()
  })
 }
 }
}
</script> 

<style lang="less">
.v-simple-cropper {
 .file {
 display: none;
 }
 .v-cropper-layer {
 position: fixed;
 top: 0;
 bottom: 0;
 left: 0;
 right: 0;
 background: #fff;
 z-index: 99999;
 display: none;
 .layer-header {
  position: absolute;
  top: 0;
  left: 0;
  z-index: 99999;
  background: #fff;
  width: 100%;
  height: .8rem;
  padding: 0 .2rem;
  box-sizing: border-box;
 }
 .cancel,
 .confirm {
  line-height: .8rem;
  font-size: .28rem;
  background: inherit;
  border: 0;
  outline: 0;
  float: left;
 }
 .confirm {
  float: right;
 }
 img {
  position: inherit!important;
  border-radius: inherit!important;
  float: inherit!important;
 }
 }
}
</style>

3. 引用组件

<template>
 <simple-cropper :initParam="uploadParam" :successCallback="uploadHandle" ref="cropper">
 <img :src="userImg" @click="upload">
 </simple-cropper>
</template> 

<script>
import SimpleCropper from '@/components/SimpleCropper'
export default {
 name: 'info',
 data () {
 return {
  uploadParam: {
  fileType: 'recruit', // 其他上传参数
  uploadURL: this.$dataURL + 'uploadAction/qcloudImg', // 上传地址
  scale: 4 // 相对手机屏幕放大的倍数: 4倍
  },
  userImg: this.$dataURL + 'test.png'
 }
 },
 methods: {
 // 上传头像
 upload () {
  this.$refs['cropper'].upload()
 },
 // 上传头像成功回调
 uploadHandle (data) {
  if (data.state === 'SUCCESS') {
  this.userImg = this.form.headImgUrl = data.fileId
  }
 }
 },
 components: {
 SimpleCropper
 }
}
</script>

4. 示例图

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • vue中用H5实现文件上传的方法实例代码

    整理文档,搜刮出一个vue中用H5实现文件上传的方法实例代码,稍微整理精简一下做下分享. 1.图片上传 <img v-if="personInfo.photoUrl" :src="headPreFix + personInfo.photoUrl" style="height:126px;max-width:133px;margin: 25px 0;"> <img v-else src="../../assets/def

  • Vue.js 2.0 移动端拍照压缩图片上传预览功能

    在学习和使用Vue.js 2.0 的过程中遇到不少不一样的地方,本来移动端开发H5应用,准备将mui框架和Vue.js+vue-router+vuex 全家桶结合起来使用,但是在拍照上传的实现过程中遇到了无法调用plus的H5+接口的问题,所以最后拍照上传功能还是使用input file方式里解决的.但是内心还是不甘心的,由于项目进度推进,迭代版本,所以不得不放弃,后续可能我将此功能使用调用H5+接口实现. 首先我来讲我实现这个拍照预览压缩上传的思路,准确的说应该是拍照或选择图片压缩之后预览及上

  • vue移动端裁剪图片结合插件Cropper的使用实例代码

    之前写了一个上传头像的功能模块,以下的内容是描述上传头像过程中裁剪图片插件结合vue的一个使用. 当然,使用就安装 npm install cropperjs 接着再引入 import Cropper from 'cropperjs' 下面是源码 <template> <div id="demo"> <!-- 遮罩层 --> <div class="container" v-show="panel">

  • require.js+vue开发微信上传图片组件

    由于项目是thinkPHP做后端框架,一直以来都是多页面的后端路由,想使用火热的webpack有点无从下手(原谅我太菜,而且推广vue只有我一个人--),没办法,想把vue用起来,唯有在原来的基础上改进.使用webpack的巨大好处就是可以使用 .vue 这样的单文件来写vue组件,这样每一个组件就是一个 .vue 文件,哪里用上这个组件就引入进来,维护起来确实很爽.然而一直以来项目用的都是require.js,那又想以这样的形式来组织vue组件,还要加上vue-router和vue-resou

  • vue.js 上传图片实例代码

    最近爱上了用vue.js做前端,昨天用vue上传图片时遇到了问题,最后半天时间终于摸索出来,我将相关部分的代码贴出来. 前端部分 <div class="form-group"> <label>背景图</label> <input type="file" class="form-control" @change="onFileChange"> </div> <d

  • 基于VUE选择上传图片并页面显示(图片可删除)

    基于VUE选择上传图片并在页面显示,图片可删除,具体内容如下 demo例子: 依赖文件:jqueryform HTML文本内容: <template> <div id="accident"> <div class="wrapper"> <i class="icon-pic"></i>相关照片 <button type="button" @click="

  • Vue axios 中提交表单数据(含上传文件)

    我们经常使用表单来上传数据,以及上传文件,那么怎么在表单提交成功的时候接受服务器的响应,并作出相应操作. 当然使用一般jQuery上传对象的格式也是可以的,如果使用传统的表单上传呢? <!DOCTYPE html> <html lang="en"> <head> <title></title> <meta charset="UTF-8"> <meta name="viewport

  • vue实现移动端图片裁剪上传功能

    本文实例为大家分享了vue移动端图片裁剪上传的具体代码,供大家参考,具体内容如下 1. 安装cropperjs依赖库 npm install cropperjs 2. 编写组件SimpleCropper.vue <template> <div class="v-simple-cropper"> <slot> <button @click="upload">上传图片</button> </slot>

  • js移动端图片压缩上传功能

    移动端图片压缩上传功能如何实现? 做移动端开发的时候,form里面的file后台经常获取不到,用foemdata也拿不到 找到了一个formdata的脚本 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta content="width=device-width, initial-scale=1.0, maximum-

  • 基于Vue的移动端图片裁剪组件功能

    最近项目上要做一个车牌识别的功能.本来以为很简单,只需要将图片扔给后台就可以了,但是经测试后识别率只有20-40%.因此产品建议拍摄图片后,可以对图片进行拖拽和缩放,然后裁剪车牌部分上传给后台来提高识别率.刚开始的话还是百度了一下看看有没有现成的组件,但是找来找去都没有找到一个合适的,还好这个功能不是很着急,因此自己周末就在家里研究一下. Demo地址:https://vivialex.github.io/demo/imageClipper/index.html 下载地址:https://git

  • vue 图片裁剪上传组件的实现

    先看一下总体效果: 上传文件做了大小和类型的限制,在动图中无法展现出来. 使用file类型的input实现选择本地文件 但是浏览器原生的文件上传按钮的颜值不尽人意,而且按钮上的文字是无法改变的,我需要把这个上传文件的按钮改造一下. 方法1:使用label元素来触发一个隐藏的file类型的 input元素:(缺点:在多人开发时,可能出现重复的元素id,导致难以预料的bug) <input type="file" id='up_file_input' v-show='false' &

  • 基于vue+axios+lrz.js微信端图片压缩上传方法

    业务场景 微信端项目是基于Vux + Axios构建的,关于图片上传的业务场景有以下几点需求: 1.单张图片上传(如个人头像,实名认证等业务) 2.多张图片上传(如某类工单记录) 3.上传图片时期望能按指定尺寸压缩处理 4.上传图片可以从相册中选择或者直接拍照 遇到的坑 采用微信JSSDK上传图片 在之前开发的项目中(mui + jquery),有使用过微信JSSDK的接口上传图片,本想应该能快速迁移至此项目.事实证明编程没有简单的事: 1.按指定尺寸压缩图片 JSSDK提供的接口wx.choo

  • vue-image-crop基于Vue的移动端图片裁剪组件示例

    本文介绍了vue-image-crop基于Vue的移动端图片裁剪组件示例,分享给大家,具体如下: 代码地址:https://github.com/jczzq/vue-image-crop vue-image-crop 基于Vue的移动端图片裁剪组件 组件使用URL.createObjectURL()等新特性,使用前注意兼容问题.IE >= 10 注意:该组件适用于 PC 端,不推荐手机端使用. 功能预览 快速开始 安装Node >= 8.9.0(推荐LTS = 8.11.0) # 安装 vue

  • Vue使用canvas实现图片压缩上传

    本文实例为大家分享了Vue使用canvas实现图片压缩上传的具体代码,供大家参考,具体内容如下 场景:如用户头像等 对于大尺寸图片的上传,在前端进行压缩除了省流量外,最大的意义是极大的提高了用户体验. 两方面: 1.由于上传图片尺寸比较小,因此上传速度会比较快,交互会更加流畅,同时大大降低了网络异常导致上传失败风险. 2.很多网站的图片上传功能都会对图片的大小进行限制,尤其是头像上传,限制5M或者2M以内是非常常见的(但是我用单反拍了个头像,照片超过2M很正常,要对图片进行处理才能上传).如果可

  • jquery.Jcrop结合JAVA后台实现图片裁剪上传实例

    本文介绍了头像裁剪上传功能,用到的技术有  jQuery,springmvc,裁剪插件用的是jcrop(中间遇到很多坑,最终跨越). 图片上传步骤: 1.用户选择图片 2.将图片传入后台:用户选择图片的时候选择的是各种各样的,但是我们的网页显示图片大小是有限的,所以我们就要在用户选择图片之后将图片添加到后台进行压缩,压缩成我们想要的大小,之后再显示到页面才好 3.利用jcrop裁剪工具对图片进行裁剪并且实时预览 4.点击确定按钮将裁剪用到的参数传入后台,后台图片进行剪切,之后缩放成我们需要的格式

  • 小程序实现图片裁剪上传

    本文实例为大家分享了小程序实现图片裁剪上传的具体代码,供大家参考,具体内容如下 <!--图片展示 --> <view bindtap='upEwm' data-which='1'>   <view>第一个图</view>   <image style='width:200rpx;height:200rpx;background-color:red' src='{{headImg}}'></image> </view> &l

  • node.js(express)中使用Jcrop进行图片剪切上传功能

    需求说明 简单来说就是要实现用户上传头像,并且要保存用户裁切后的部分作为用户头像. 第一步,选择图片: 第二步,在弹窗页面中展现并进行裁切: 第三步,点击"保存",上传服务器. 实现过程 说来有点坎坷,相当于做了2遍,走了弯路. 第1遍是用户一选择图片,就进行了上传,然后返回一个地址,所以在弹层上展现的图片已经是服务器上的图片了,然后进行裁切,再保存. 第2遍找到的一个方法,是在第1遍做到裁切处理时候想到的,即弹层展现的是用户机器上选择的图片,不用先上传,但是用image/base64

随机推荐