• vue利用canvas将图片上传到服务器


    前端.vue页面:

        <div class="panel">
          <div class="panel_hd">身份证</div>
          <div class="panel_bd flex">
            <div class="id-card">
              <div>身份证正面</div>
              <div class="submit-img">
                <input type="file" accept="image/*" @change="chooseImg($event,'fileFront')"/>
                <img :src="fileFront" alt="">
              </div>
            </div>
            <div class="id-card">
              <div>身份证反面</div>
              <div class="submit-img">
                <input type="file" accept="image/*" @change="chooseImg($event,'fileBack')"/>
                <img :src="fileBack" alt="">
              </div>
            </div>
          </div>
        </div>

    js:

    canvas绘图后用 canvas.toDataURL()可以得到图片的base64 dataURI——格式:data:image/png;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/7QjCUGhvdG9zaG9wIDMuMAA/9k=

    <script type="text/ecmascript-6">
        import ScrollLock from '../mixins/scrollLock'
        import {mapState, mapMutations} from 'vuex'
    
        export default {
            name: "Promotion",
            mixins: [ScrollLock],
            data() {
                return {
                }
            },
            computed: {
            },
            methods: {
                chooseImg(e, type) {
                    let file = e.target.files[0];
                    if (!file) {
                        return;
                    }
                    this.transformToBase64(file, type);
                },
                transformToBase64(file, type) {
                    if (!window.FileReader) {
                        console.log('浏览器对FileReader方法不兼容');
                    } else {
                        let reader = new FileReader();
                        reader.readAsDataURL(file);//读出 base64
                        reader.onloadend = () => {
                            this.imgCompress(reader, type);
                        };
                    }
                },
                imgCompress(reader, type) {//图片超过尺寸压缩
                    let img = new Image();
                    img.src = reader.result;
                    img.onload = () => {
                        let w = this.naturalWidth, h = this.naturalHeight, resizeW = 0, resizeH = 0;
                        let maxSize = {
                             1000,
                            height: 1000,
                            level: 0.2
                        };
                        if (w > maxSize.width || h > maxSize.height) {
                            let multiple = Math.max(w / maxSize.width, h / maxSize.height);
                            resizeW = w / multiple;
                            resizeH = h / multiple;
                            let canvas = document.createElement('canvas'),
                                ctx = canvas.getContext('2d');
                            canvas.width = resizeW;
                            canvas.height = resizeH;
                            ctx.drawImage(img, 0, 0, resizeW, resizeH);
                            let base64 = canvas.toDataURL('image/jpeg', maxSize.level);
                            this.uploadImg(base64, type);
                        } else {
                            // 如果图片尺寸小于最大限制,则不压缩直接上传
                            this.uploadImg(reader.result, type);
                        }
                    }
                },
                uploadImg(base64, type) {
                    // this[type] = base64;
                    this.$axios.post('driver/uploadImage', {
                        picString: base64,
                        picType: type
                    }).then(response => {
                        this[type] = base64;
                    }, () => {
                        this.$error('图片上传失败');
                    });
                },
            },
            created() {
            },
            mounted() {
            }
        }
    </script>

    服务端api:

    程序将接收到base64串,通过fastdfs的api上传到文件服务器。fastdfs工具点击这里

    @Slf4j
    @RequestMapping("/api/driver")
    @RestController
    public class DriverInfoController {
    
        @Autowired
        private FastdfsClientUtil fastdfsClientUtil;
    
        @PostMapping("/uploadImage")
        @ResponseBody
        public Result uploadImage(@RequestBody JSONObject requestBody){
            String picString = requestBody.getString("picString");
            
            String imgPath = fastdfsClientUtil.uploadImageAndCrtThumbImageByBase64(picString);
            log.info("[上传返回的地址:{}]",imgPath);
            return Result.ok();
        }
    }
  • 相关阅读:
    S3C2440的LCD虚拟显示测试
    arm-linux-gcc编译器测试
    韦东山教程ARM的时钟设置出现的问题及其解决方法
    程序在nor flash中真的可以运行吗?
    存储器的速度
    程序测试的方法
    对编程的一些思考

    [算法题] 字节流解析
    [C/C++]函数指针和函数分发表
  • 原文地址:https://www.cnblogs.com/buguge/p/13406399.html
Copyright © 2020-2023  润新知