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 = { width: 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(); } }
当看到一些不好的代码时,会发现我还算优秀;当看到优秀的代码时,也才意识到持续学习的重要!--buguge
本文来自博客园,转载请注明原文链接:https://www.cnblogs.com/buguge/p/13406399.html