<template>
<el-form-item label="课程图片">
<el-upload
class="avatar-uploader"
action="http://106.13.150.219:8090/api/Common/CommonMethod/PostUploadImageList"
:show-file-list="false"
:on-success="handleAvatarSuccess"
:before-upload="beforeAvatarUpload"
>
<img v-if="imageUrl" :src="imageUrl" class="avatar">
<i v-else class="el-icon-plus avatar-uploader-icon"></i>
</el-upload>
</el-form-item>
<el-dialog title="图片剪裁" :visible.sync="dialogVisible" append-to-body>
<div class="cropper-content">
<div class="cropper" style="text-align:center">
<vueCropper
ref="cropper"
:img="option.img"
:outputSize="option.outputSize"
:outputType="option.outputType"
:info="option.info"
:canScale="option.canScale"
:autoCrop="option.autoCrop"
:autoCropWidth="option.autoCropWidth"
:autoCropHeight="option.autoCropHeight"
:fixed="option.fixed"
:fixedBox="option.fixedBox"
:fixedNumber="option.fixedNumber"
></vueCropper>
</div>
</div>
<div slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false">取 消</el-button>
<el-button type="primary" @click="finish" :loading="loading">确认</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
//引入插件
import {VueCropper} from 'vue-cropper'
export default {
name: "ImageUpload",
components: {
VueCropper
},
data() {
return {
//控制是否在upload框里显示图片
isShowImageUrl: false,
imageUrl: '',
dialogVisible: false,
// 裁剪组件的基础配置option
option: {
img: '', // 裁剪图片的地址
info: true, // 裁剪框的大小信息
outputSize: 0.8, // 裁剪生成图片的质量
outputType: 'jpeg', // 裁剪生成图片的格式
canScale: false, // 图片是否允许滚轮缩放
autoCrop: true, // 是否默认生成截图框
autoCropWidth: 200, // 默认生成截图框宽度
autoCropHeight: 200, // 默认生成截图框高度
fixedBox: false, // 固定截图框大小 不允许改变
fixed: true, // 是否开启截图框宽高固定比例
fixedNumber: [1, 1], // 截图框的宽高比例
full: true, // 是否输出原图比例的截图
canMoveBox: false, // 截图框能否拖动
original: false, // 上传图片按照原始比例渲染
centerBox: false, // 截图框是否被限制在图片里面
infoTrue: true, // true 为展示真实输出图片宽高 false 展示看到的截图框宽高
canMove: true,
},
picsList: [], //页面显示的数组
// 防止重复提交
loading: false,
}
},
methods: {
// 上传文件之前的钩子,参数为上传的文件,若返回 false 或者返回 Promise 且被 reject,则停止上传。
//选中文件夹中的图片,点击打开的时候会触发这个函数,来判断选择的图片是否符合方法中对于图片格式的要求
beforeAvatarUpload(file) {
console.log('上传的文件----' + file)
const isJPG = file.type === 'image/jpeg' || file.type === 'image/png';
const isLt2M = file.size / 1024 / 1024 < 2;
if (!isJPG) {
this.$message.error('上传头像图片只能是 JPG 格式!');
}
if (!isLt2M) {
this.$message.error('上传头像图片大小不能超过 2MB!');
}
return isJPG && isLt2M;
},
//文件上传成功时的钩子
//这个方法在什么时候执行呢?
//
handleAvatarSuccess(res, file) {
//上传成功后将图片地址赋值给裁剪框显示图片
//res中包含的是action="http://106.13.150.219:8090/api/Common/CommonMethod/PostUploadImageList"
//上面的接口返回的数据,成功/失败
//包括服务器返回的信息,包含文件临时存放路径等信息
console.log(res)
//找到临时路径url
console.log(res.Data[0].url)
//保存临时路径
this.imageUrl = res.Data[0].url
//在upload框中显示图片
this.isShowImageUrl = true
//file中包含的是文件信息
//关于上传的图片的具体信息,并且包含uid这个属性
console.log(file)
console.log(file.raw)
this.$nextTick(() => {
this.option.img = URL.createObjectURL(file.raw);
this.dialogVisible = true
})
},
// finish() {
// this.$refs.cropper.getCropData((data) => {
// //data里面包含的是裁剪后的图片大小和类型,当然类型不会改变啦
// // console.log(data)
// let formData = new FormData()
// formData.append("file", data)
// imageUpload(formData).then(res => {
// console.log(res)
// })
// })
// },
finish() {
// 裁剪后获取blob对象(二进制文件对象)
this.$refs.cropper.getCropBlob((data) => {
// 前端裁剪图片后获取的实际是blob对象,后端统一的文件上传接口实际接收的file对象,前端需要在数据提交前将blob对象转为file对象。转换方法如下:
const file = new File([data],"file_0.jpg",{type:data.type, lastModified: Date.now()})
// 请求拦截器中的处理FormData 需要这个格式也可自行处理
let image = {'file_0':file}
this.loading = true
//上传服务器
this.$axios.post('http://106.13.150.219:8090/api/Common/CommonMethod/PostUploadImageList',image).then(res=>{
this.imageUrl = res[0].url
this.loading = false
this.dialogVisible = false
})
})
}
}
}
</script>
<style scoped>
h1 {
margin-bottom: 30px;
}
.avatar {
height: 100%;
width: 100%;
}
.avatar-uploader {
background: lightblue !important;
width: 150px;
height: 150px;
text-align: center;
line-height: 150px;
}
.el-icon-plus {
width: 150px;
height: 150px;
font-size: 30px;
}
.cropper-content {
width: 500px;
height: 500px;
background: pink;
}
.cropper {
width: 500px;
height: 500px;
background: yellow;
}
</style>