首页 > 其他分享 >在vue3中实现一个截图上传图片功能

在vue3中实现一个截图上传图片功能

时间:2024-08-29 15:39:51浏览次数:11  
标签:截图 false img value vue3 cropper const 上传 any

<template>
    <div class="avatar-container">
        <el-dialog :title="title" :model-value="dialogVisibleCorpper" width="800px" append-to-body @opened="openDialog"
            :before-close="beforeClose">
            <el-row>
                <el-col :span="12" style="height: 300px">
                    <vue-cropper ref="cropper" :img="options.img" :info="true" :autoCrop="options.autoCrop"
                        :autoCropWidth="options.autoCropWidth" :autoCropHeight="options.autoCropHeight" :canMove="options.canMove"
                        :fixedBox="options.fixedBox" :outputType="options.outputType" @realTime="realTime" :fixed="options.fixed"
                        v-if="showCropper" />
                </el-col>
                <el-col :span="12" style="height: 300px">
                    <div class="preview-box">
                        <img v-if="previews.url" :src="previews.url" :style="previews.img" />
                        <span v-else></span>
                    </div>
                </el-col>
            </el-row>
            <el-row style="margin-top: 12px">
                <el-col :span="12">
                    <el-row>
                        <el-col :span="8">
                            <el-upload action="#" :http-request="() => { }" :before-upload="beforeUpload"
                                :show-file-list="false">
                                <el-button>选择</el-button>
                            </el-upload>
                        </el-col>
                        <el-col :span="4">
                            <el-button :icon="Plus" @click="changeScale(1)"></el-button>
                        </el-col>
                        <el-col :span="4">
                            <el-button :icon="Minus" @click="changeScale(-1)"></el-button>
                        </el-col>
                        <el-col :span="4">
                            <el-button :icon="RefreshLeft" @click="rotateLeft()"></el-button>
                        </el-col>
                        <el-col :span="4">
                            <el-button :icon="RefreshRight" @click="rotateRight()"></el-button>
                        </el-col>
                    </el-row>
                </el-col>
                <el-col :span="4" :offset="8" style="margin-left: 22.3%">
                    <el-button type="primary" @click="determine()">提 交</el-button>
                </el-col>
            </el-row>
        </el-dialog>
    </div>
</template>

<script setup lang="ts">
import {
    Plus,
    Minus,
    RefreshLeft,
    RefreshRight,
} from "@element-plus/icons-vue";
import { ElMessage } from "element-plus";
import "vue-cropper/dist/index.css";
import { upLoadFile } from "@/api/api";
import { VueCropper } from "vue-cropper";
import { getCurrentInstance, ref, reactive, watch } from "vue";
const { proxy } = getCurrentInstance() as any;
const props = defineProps({
    dialogVisibleCorpper: {
        type: Boolean,
        default: false,
    },
    title: {
        type: String,
        default: "上传图片",
    },
});
const cropper: any = ref(VueCropper)
const showCropper = ref(false);
// cropper配置  更多配置可参考 https://www.npmjs.com/package/vue-cropper
const options: any = reactive({
    img: null, // 裁剪图片的地址
    autoCropWidth: 200, // 默认生成截图框宽度 默认容器的 80%
    autoCropHeight: 200, // 默认生成截图框高度 默认容器的 80%
    fixed:true,
    outputType: "png", // 裁剪生成图片的格式 jpeg, png, webp
    autoCrop: true, // 是否默认生成截图框
    fixedBox: false, // 固定截图框大小
    canMove:false,
    // centerBox:true,
});
const filePath = ref('');
const previews: any = ref({
    url: "",
});

// 打开裁剪弹窗
const openDialog = () => {
    showCropper.value = true;
};
// 修改图片大小 正数为变大 负数变小
const changeScale = (num: any) => {
    num = num || 1;
    proxy.$refs.cropper.changeScale(num);
};
// 向左边旋转90度
const rotateLeft = () => {
    proxy.$refs.cropper.rotateLeft();
};
// 向右边旋转90度
const rotateRight = () => {
    proxy.$refs.cropper.rotateRight();
};
// 上传图片处理
const beforeUpload = (rawFile: any) => {
    if (rawFile.type.indexOf("image/") == -1) {
        ElMessage.error("请上传图片类型文件!");
        return false;
    }
    if (rawFile.size / 1024 / 1024 > 2) {
        ElMessage.error("文件大小不能超过2MB!");
        return false;
    }
    const reader = new FileReader();
    reader.readAsDataURL(rawFile);
    reader.onload = () => {
        // 图片在这里
        options.img = reader.result;
        console.log(options)
    };
};
// 实时预览事件
const realTime = (data: any) => {
    previews.value = data;
    console.log(previews.value)
};
const emit = defineEmits(["update:dialogVisibleCorpper", "confirm"]);

// 关闭弹窗
const beforeClose = () => {
    options.img = null;
    previews.value.url = "";
    emit("update:dialogVisibleCorpper", false);
};
// 提交图片
const determine = () => {
    // console.log(options.img)
    // options.img = null;

    // previews.value.url = "";
    // emit("confirm");
    cropper.value.getCropBlob(async (data: any) => {
        const imgUrl = window.URL.createObjectURL(data);

        const response = await fetch(imgUrl);
        const blobData = await response.blob();
        console.log(blobData)

        const formData = new FormData();
        formData.append('icon', blobData, 'filename.png');
        upLoadFile(formData).then((res:any) => {
            console.log(res)
            filePath.value = res.file_path;
             
            options.img = null;

            previews.value.url = "";
            emit("confirm", filePath.value);
            console.log(filePath.value)
        })


        //    imageUpload(formData).then(res => {
        //       isLoading.value = false
        //       show.value = false
        //       props.getPropsUrl(res.data.data.url)
        //     });
    })

};
</script>

<style lang="scss" scoped>
.avatar-container {
    .img-box {
        border-radius: 50%;
        border: 1px solid #ccc;
        width: 10vw;
        height: 10vw;
    }
}

.preview-box {
    position: absolute;
    top: 50%;
    transform: translate(50%, -50%);
    width: 200px;
    height: 200px;
    border-radius: 50%;
    border: 1px solid #ccc;
    overflow: hidden;
}
</style>

 

标签:截图,false,img,value,vue3,cropper,const,上传,any
From: https://www.cnblogs.com/1229834468wty/p/18386805

相关文章

  • 实现一个通过调用openai4.0的智能聊天系统,支持上传图片(这里是通过websocket返回流式效
    <template><divclass="chatInfor"><divclass="chatInfor-content"><el-scrollbarheight="97%"id="chatBox"ref="scrollbarRef"v-loading="loading"wi......
  • 在Vue3应用中使用TypeScript的最佳实践
    随着Vue3的推出,TypeScript逐渐成为了前端开发中的一种必备技能。Vue3的设计更好地支持TypeScript,这使得开发者可以在开发过程中充分利用TypeScript的强类型系统,从而提高代码的可维护性和可读性。在这篇博客中,我们将深入探讨在Vue3应用中使用TypeScript的最佳实践,并通过示例......
  • windows上传文件精准包含技巧
    目录环境搭建原理绕过结果环境搭建需要在php.ini开启upload_tmp_dir选项这里需要对C:\Windows\Temp有写入权限文件上传页面文件包含页面原理利用文件上传产生的缓存文件进行命令执行,从而getshell绕过你上传文件的时候会生成临时文件,我们需要抓取这个临时......
  • Vue3实现excel文件预览和打印
    预览excel关于实现excel文档在线预览的做法,一种方式是通过讲文档里的数据处理成html,一种是将文档处理成图片进行预览。首先我们先讲一下实现html这种方式预览的。Excel预览用的是xlsx这个库。xlsxxlsx是一个优秀的表格处理库,是一款适用于浏览器和nodejs的开源电子表格解析库"......
  • vue3导入excel表格并展示(使用xlsx插件+vite+element-plus)/js上传表格(js+xlsx)
    第一步:下载两个库npminstallfile-saver--savenpminstallxlsx--save第二步:引入import{saveAs}from'file-saver'import*asXLSXfrom'xlsx'第三步:给组件设置点击事件<el-form-item@click="handleExport">导出</el-for......
  • 在Vue3中处理异步API调用并更新表单数据的方法示例
    在Vue3中,处理异步API调用并更新表单数据通常涉及到使用组合式API(CompositionAPI),它提供了一种更灵活的方式来组织组件逻辑。以下是使用Vue3的setup函数和reactive、ref等响应式API来处理异步API调用并更新表单数据的一个示例。首先,假设我们有一个表单,需要从API获取一些数据并填......
  • vue3导入excel表格并展示(使用xlsx插件+vite+element-plus)/js上传表格(js+xlsx)
    首先下载两个库npminstallxlsx--savenpminstallfile-saver--save然后在你需要导出的组件里引入库import{saveAs}from'file-saver'import*asXLSXfrom'xlsx'创建函数consthandleExport=()=>{letoneDimensionalArray=[]lettwoDimensionalArray......
  • Vue3 变量响应基础
    在Vue3中有两种分别为选项式和组合式的操作,现在一般用组合式,很少用选项式的操作;1.计算,与变量;直接这样写的话,他不会进行计算,需要添加两个大括号;比如 {{1+1}}变量的话我们可以不用script中的因为里面是Vue2的我们可以改成如果不使用{{}}的话他显示的则会变......
  • 电脑长截图滚动截图FastStone Capture v10.7专业授权绿色版
    FastStoneCapture是一款集屏幕捕捉、编辑、导出和屏幕录像为一体的轻量级、多功能截图录屏软件。软件的特色功能是支持电脑长截图滚动截图。它以其简洁高效的操作界面和强大的功能赢得了全球用户的青睐。FastStoneCapture自2000年推出以来,经历了多次更新迭代,每一次升级都是对......
  • laravel用AetherUpload实现大文件上传,并更改默认上传目录
    github地址:https://github.com/peinhu/AetherUpload-Laravel最近需求要做个视频上传,找到个好用的扩展AetherUpload 1.首先用composer安装,切换到laravel项目根目录,执行 composerrequirepeinhu/aetherupload-laraveldev-master2.在 config/app.php 的 providers 数组......