前端图片压缩后,文件流上传
时间:2019-11-13
本文章向大家介绍前端图片压缩后,文件流上传,主要包括前端图片压缩后,文件流上传使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
直接贴部分代码了
使用的是vantUI框架,不过没有关系,都是对文件流进行判断压缩的。按需求改造一下就OK了
<template> <div class="page_publish"> <div class="bg_box"> <div class="form_box"> <div class="con"> <div class="file_box"> <van-uploader :before-read="beforeRead" :after-read="afterRead" v-model="fileList" multiple :max-count="3" > <div class="upload_btn flex flex-v flex-align-center flex-pack-center"> <img src="../assets/imgs/icon_camaro.png" class="icon" /> <p class="num" v-if="fileList.length==0">添加图片</p> <p class="num" v-else>({{fileList.length}}/3)</p> </div> </van-uploader> </div> <p class="limit_txt">(限20-200字)</p> </div> </div> </div> </div> </template> <script> import { checkLogin } from "../assets/js/util.js"; import { imgUpload, addStory } from "../http/api.js"; import urlConfig from "../http/env.js"; import Vue from "vue"; import { Button, Toast, Dialog, Loading, ImagePreview, Uploader, Divider } from "vant"; Vue.use(Toast, ImagePreview); export default { data() { return { formData: { story: "果图片 URL 中不包含类型信息,可以添加 isImage 标记来声明果图片 URL 中不包含类型信息,可以添加 isImage 标记来声明", name: "ss", phone: "13344443333", images: "" }, dialogSubmit: false, //确认弹框 fileList: [ // Uploader 根据文件后缀来判断是否为图片文件 // 如果图片 URL 中不包含类型信息,可以添加 isImage 标记来声明 ] }; }, mounted() { }, components: { [Uploader.name]: Uploader, [Divider.name]: Divider, [Loading.name]: Loading }, methods: { // 上传图片 unLoadImg() { let _this = this; let fileList = this.fileList; return new Promise(function(resolve, reject) { if (fileList.length == 0) { //没有图片 resolve(""); } else { // 有图片,上传 let formData = new FormData(); let files = fileList.forEach(function(item, i) { console.log(_this.convertBase64UrlToBlob(item.content)); // formData.append('images',item.file) //不压缩上传 formData.append( "images", _this.convertBase64UrlToBlob(item.content), "file_" + Date.parse(new Date()) + ".jpg" ); // 文件对象 }); imgUpload(formData) .then(res => { if (res.code == "PY0000") { resolve(res.response.imageUrl); } else { reject(res.msg); } }) .catch(err => { reject("图片上传失败"); }); } }); }, /** * 将以base64的图片url数据转换为Blob * 用url方式表示的base64图片数据 */ convertBase64UrlToBlob(urlData) { var arr = urlData.split(","), mime = arr[0].match(/:(.*?);/)[1], bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n); while (n--) { u8arr[n] = bstr.charCodeAt(n); }; return new Blob([u8arr], { type: mime }); }, // 返回布尔值 beforeRead(file) { // console.log(file); if (file.type !== "image/jpeg" && file.type !== "image/png") { Toast("请上传 jpg/png 格式图片"); return false; } else if (file.size > 1024 * 1024 * 4) { Toast("图片大小不可超过4M!"); return false; }; return true; }, afterRead(file) { let _this = this; // 如果图片大小超过2M,则先压缩 if(file.file.size > 1024 * 1024 * 2){ var ready = new FileReader(); /*开始读取指定的Blob对象或File对象中的内容. 当读取操作完成时,readyState属性的值会成为DONE,如果设置了onloadend事件处理程序,则调用之.同时,result属性中将包含一个data: URL格式的字符串以表示所读取文件的内容.*/ ready.readAsDataURL(file.file); ready.onload = function() { var re = this.result; _this.canvasDataURL(re); }; } }, // 压缩图片 canvasDataURL(path, obj, callback) { let _this = this; var img = new Image(); img.src = path; img.onload = function() { var that = this; // 默认按比例压缩 var w = that.width, h = that.height, scale = w / h; w = w; h = w / scale; var quality = 0.5; // 默认图片质量为0.5 //生成canvas var canvas = document.createElement("canvas"); var ctx = canvas.getContext("2d"); // 创建属性节点 var anw = document.createAttribute("width"); anw.nodeValue = w; var anh = document.createAttribute("height"); anh.nodeValue = h; canvas.setAttributeNode(anw); canvas.setAttributeNode(anh); ctx.drawImage(that, 0, 0, w, h); // quality值越小,所绘制出的图像越模糊 var base64 = canvas.toDataURL("image/jpeg", quality); // 回调函数返回base64的值 let length = _this.fileList.length; _this.fileList[length-1].content = base64; }; }, } }; </script>
原文地址:https://www.cnblogs.com/LChenglong/p/11847171.html
- ASP.NET MVC的Razor引擎:RazorView
- 三分钟学会 Java 单元测试
- 革了短信的命之后,微信开始把枪口对准了应用市场
- 建构微服务的第一步: 微服务哪里来?
- 最新机器学习必备十大入门算法!都在这里了
- ASP.NET MVC的Razor引擎:IoC在View激活过程中的应用
- 深度学习笔记:深度学习在计算机视觉的应用
- 快速添加永久存储到到Minishift / CDK 3
- 张小龙发布2018微信全新计划(内附演讲全文)
- 使用JClouds在Java中获取和发布云服务器
- 利用ASP.NET SiteMap生成与Bootstrap"兼容"菜单
- 埃隆·马斯克强烈推荐的5本书,看完之后他开始改变世界
- 算法:AOE网(Activity On edge Network)与关键路径简介
- ASP.NET Core的配置(4):多样性的配置来源[中篇]
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 一起来学matlab-matlab学习笔记8 基本绘图命令_3 特殊图形绘制
- 看了这个有趣的例子,你就秒懂多线程同步了
- IDA7.0 配置内核调试,双机调试
- ViewPager2与Fragment
- SpringBoot整合SpringSecurity实现JWT认证
- 用Python爬取股票数据,绘制K线和均线并用机器学习预测股价(来自我出的书)
- 用非常硬核的JAVA序列化手段实现对象流的持久化保存
- 微信小程序语音同步智能识别的实现案例
- 数据结构之链式队列的代码实现及有趣应用
- 用自定义链式栈解决力扣括号匹配问题
- String及StringTable(三):StringBuilder源码解读
- UidGenerator:百度开源的分布式ID服务(解决了时钟回拨问题)
- String及StringTable(四):StringBuffer与StringBuilder对比
- Apache James 2.3.2.1 邮箱服务搭建
- SpringBoot实现微信小程序登录的完整例子