【方法】如何实现图片压缩并使用FormData上传
在前端上传图片的操作过程中,当上传服务器时,如果图片过大,可能会影响页面响应速度,这个时候,我们便会对图片进行压缩处理,再上传服务器。
前端对图片进行压缩,一般使用canvas来实现。最后使用canvas API函数toDataURL来获取图片的Base64字符串,然后上传到服务器的时候,会面临两种选择:
- 直接将图片的Base64字符串post到后端是进行处理和保存;
- 在前端将Base64字符串转化为二进制的Blob对象形式,再使用(FormData)上传至后端。
在上上篇随笔:移动端H5如何调用相册和相机上传图片、音频、视频中有讲到,FormData的append方法中,value接收file和blob对象形式,canvas转化成URL格式后,我们只能通过转为Blob对象上传(我在网上找到的方法都是转为blob...)
第一种方法的话比较简单,主要交给后端进行处理。而第二种相较复杂一点点,主要实现过程如下:
// 本例使用vue-cli3快速构建
<template>
<div id="app">
<div class="show-box">
<img :src="imgSrc" alt />
</div>
<form class="input-box">
<div class="select">
选择文件
<input type="file" name="upphoto" @change="input" />
<!--后端读取的是name为upphoto的标签-->
</div>
<div class="button" @click="loadImg">点击上传</div>
</form>
</div>
</template> <script>
import $ from "jquery"; export default {
name: "app",
data() {
return {
maxSize: 500, // 限制图片最大为500kb
file: "",
imgSrc: "",
formData: ""
};
},
methods: {
readFileImg(file) {
// 读取图片信息并展示
let reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = () => {
let img = new Image();
img.src = reader.result;
img.onload = () => {
this.imgSrc = img.src;
// 以上是将选择的图片展示出来
let originWidth = img.naturalWidth,
originHeight = img.naturalHeight,
originSize = file.size / 1024; // 计算图片多少kb
this.compressEvent(img, originSize, originWidth, originHeight);
};
};
reader.onerror = function(error) {
console.log(`error: ${error}`);
};
},
compressEvent(img, originSize, originWidth, originHeight) {
// 将图片绘制到canvas上进行压缩
let canvas = document.createElement("canvas"),
context = canvas.getContext("2d"),
maxSize = this.maxSize;
if (originSize <= maxSize) {
this.formData = new FormData($(".input-box")[0])
return false;
}
let mul = originSize / maxSize,
targetWidth = originWidth / mul,
targetHeight = originHeight / mul;
canvas.width = targetWidth;
canvas.height = targetHeight;
context.clearRect(0, 0, targetWidth, targetHeight); // 清除画布
context.drawImage(img, 0, 0, targetWidth, targetHeight); // 画图 let dataURL = canvas.toDataURL("image/jpeg", 0.1); // 将其转化成base64字符串 let blob = this.dataURItoBlob(dataURL); // 转化为blob格式 this.formData = new FormData();
this.formData.append("file", blob, this.file.name);
},
dataURItoBlob(dataURI) {
// base64格式转化为blob对象
let byteString = atob(dataURI.split(",")[1]); let mimeString = dataURI
.split(",")[0]
.split(":")[1]
.split(";")[0]; let ab = new ArrayBuffer(byteString.length);
let ia = new Uint8Array(ab);
for (let i = 0; i < byteString.length; i++) {
ia[i] = byteString.charCodeAt(i);
} return new Blob([ab], { type: mimeString });
},
input(event) {
// 选择文件
this.readFileImg(event.target.files[0]);
},
loadImg() {
// 点击上传
$.ajax({
url: "./downFile.php", // 接口地址
type: "POST",
async: false,
data: this.formData,
cache: false,
contentType: false,
processData: false,
success: function(data) {
this.imgSrc = "";
},
error: function(error) {
console.log(error);
}
});
}
}
};
</script> <style lang="less">
// 此处样式文件省略...</style>
【参考文章】
【方法】如何实现图片压缩并使用FormData上传的更多相关文章
- php canvas 前端JS压缩,获取图片二进制流数据并上传
<?php if(isset($_GET['upload']) && $_GET['upload'] == 'img'){ //二进制数据流 $data = file_get_c ...
- 使用FormData上传文件、图片
关于FormData XMLHttpRequest Level 2添加了一个新的接口 ---- FormData 利用FormData对象,可以通过js用一些键值对来模拟一系列表单控件,可以使用XM ...
- 移动端 H5 拍照 从手机选择图片,移动端预览,图片压缩,图片预览,再上传服务器
前言:最近公司的项目在做全网营销,要做非微信浏览器的wap 站 的改版,其中涉及到的一点技术就是采用H5 选择手机相册中的图片,或者拍照,再将获取的图片进行压缩之后上传. 这个功能模块主要有这5点比较 ...
- ASP.NET MVC中使用Dropzone.js实现图片的批量拖拽上传
说在前面 最近在做一个MVC相册的网站(这里),需要批量上传照片功能,所以就在网上搜相关的插件,偶然机会发现Dropzone.js,试用了一下完全符合我的要求,而且样式挺满意的,于是就在我的项目中使用 ...
- 相册选择头像或者拍照 上传头像以NSData 图片二进制格式 表单上传
一.点击头像图片 或者按钮 在相册选择照片返回img,网络上传头像要用data表单上传 (1)上传头像属性 // 图片二进制格式 表单上传 @property (nonatomic, strong) ...
- 项目总结21:项目总结21:input实现多图上传(FormData)(上传OSS并保存数据库)
项目总结21:input实现多图上传(FormData)(上传OSS并保存数据库) 备注:本案例,作为Demo,包含少量的项目业务逻辑,input多图上传的逻辑是完整的: 不废话直接上代码 1-前端标 ...
- canvas利用formdata上传到服务器
1.首先绘制canvas图片 <canvas id="myCanvas" width="100" height="100" style ...
- (十)HttpClient以multipart/form-data上传文件
原文链接:https://blog.csdn.net/wsdtq123/article/details/78888734 POST上传文件 最早的HTTP POST是不支持文件上传的,给编程开发带来很 ...
- js bese64转化为blob使用FormData上传
原文 工作示例 <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...
随机推荐
- Pandas 读取超过 65536 行的 Excel 文件
Excel 文件的格式曾经发生过一次变化,在 Excel 2007 以前,使用扩展名为 .xls 格式的文件,这种文件格式是一种特定的二进制格式,最多支持 65,536 行,256 列表格.从 Exc ...
- nasm 使用总结
1,编译 nasm -f bin myfile.asm -o myfile 生成目标文件 nasm -f bin myfile.asm -l myfile 生成清单文件 2,快速开始 nasm是 ...
- 【规律】A Rational Sequence
题目描述 An infinite full binary tree labeled by positive rational numbers is defi ned by:• The label of ...
- nginx浏览器开启密码验证
如果我们在 nginx 下搭建了一些站点,但是由于站点内容或者流量的关系,我们并不想让所有人都能正常访问,那么我们可以设置访问认证.只有让用户输入正确的用户名和密码才能正常访问.效果如下: 在 ngi ...
- 论文阅读:《Bag of Tricks for Efficient Text Classification》
论文阅读:<Bag of Tricks for Efficient Text Classification> 2018-04-25 11:22:29 卓寿杰_SoulJoy 阅读数 954 ...
- StoneTab标签页CAD插件 3.0.0
//////////////////////////////////////////////////////////////////////////////////////////////////// ...
- MUI 跨域请求web api
由于刚接触MUI框架,所以在跨域问题上花了一点时间.希望我的方式能帮你少走点弯路(大神就直接过里吧)! 首先,遇到这个问题,各种百度.其中说法最多的是将mui,js文件里的 setHeader('X- ...
- wpf win10 popup位置偏移问题
同样问题参照: https://stackoverflow.com/questions/18113597/wpf-handedness-with-popups 解决方案: private static ...
- 捕捉Promise reject 错误
var sleep = function (time) { return new Promise(function (resolve, reject) { setTimeout(function () ...
- 关于iReport5.6.0无法正常启动或者闪退或者JDK8不兼容的解决方案
参考网址: https://blog.csdn.net/erlian1992/article/details/76359191?locationNum=6&fps=1 说白了 ,即 jaspe ...