在前端上传图片的操作过程中,当上传服务器时,如果图片过大,可能会影响页面响应速度,这个时候,我们便会对图片进行压缩处理,再上传服务器。

前端对图片进行压缩,一般使用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>

【参考文章】

如何使用FromData上传压缩裁剪后的图片Blob对象

H5实现图片先压缩再上传

FormData的使用

MND:FormData对象的使用

【方法】如何实现图片压缩并使用FormData上传的更多相关文章

  1. php canvas 前端JS压缩,获取图片二进制流数据并上传

    <?php if(isset($_GET['upload']) && $_GET['upload'] == 'img'){ //二进制数据流 $data = file_get_c ...

  2. 使用FormData上传文件、图片

    关于FormData XMLHttpRequest Level 2添加了一个新的接口  ---- FormData 利用FormData对象,可以通过js用一些键值对来模拟一系列表单控件,可以使用XM ...

  3. 移动端 H5 拍照 从手机选择图片,移动端预览,图片压缩,图片预览,再上传服务器

    前言:最近公司的项目在做全网营销,要做非微信浏览器的wap 站 的改版,其中涉及到的一点技术就是采用H5 选择手机相册中的图片,或者拍照,再将获取的图片进行压缩之后上传. 这个功能模块主要有这5点比较 ...

  4. ASP.NET MVC中使用Dropzone.js实现图片的批量拖拽上传

    说在前面 最近在做一个MVC相册的网站(这里),需要批量上传照片功能,所以就在网上搜相关的插件,偶然机会发现Dropzone.js,试用了一下完全符合我的要求,而且样式挺满意的,于是就在我的项目中使用 ...

  5. 相册选择头像或者拍照 上传头像以NSData 图片二进制格式 表单上传

    一.点击头像图片 或者按钮 在相册选择照片返回img,网络上传头像要用data表单上传 (1)上传头像属性 // 图片二进制格式 表单上传 @property (nonatomic, strong) ...

  6. 项目总结21:项目总结21:input实现多图上传(FormData)(上传OSS并保存数据库)

    项目总结21:input实现多图上传(FormData)(上传OSS并保存数据库) 备注:本案例,作为Demo,包含少量的项目业务逻辑,input多图上传的逻辑是完整的: 不废话直接上代码 1-前端标 ...

  7. canvas利用formdata上传到服务器

    1.首先绘制canvas图片 <canvas id="myCanvas" width="100" height="100" style ...

  8. (十)HttpClient以multipart/form-data上传文件

    原文链接:https://blog.csdn.net/wsdtq123/article/details/78888734 POST上传文件 最早的HTTP POST是不支持文件上传的,给编程开发带来很 ...

  9. js bese64转化为blob使用FormData上传

    原文 工作示例 <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

随机推荐

  1. oracle杀死正在执行的进程

    1 查询目前正在执行的终端和进程, SELECT /*+ rule */ s.username,decode(l.type,'TM','TABLE LOCK','TX','ROW LOCK',NULL ...

  2. linux系统调用、库函数和内核函数关系与区别

    看系统调用,还有库函数,以前一直不明白,总是以为 系统调用跟库函数是一样的,但是今天才知道是不一样的. 库函数也就是我们通常所说的应用编程接口API,它其实就是一个函数定义,比如常见read().wr ...

  3. java 分解整数 【个 十 百 千】,获得个位、十位、百位数字

    求一个数数的个位数,十位数,百位数及千位: int num = 53; int g = (num / 1) % 10;  //个位 int s = (num / 10) % 10; //十位 int ...

  4. NOIP(CSP)答题技巧&小细节

    1.主函数类型 通常使用int main(),然而可以使用完全等价的signed main() 解锁 #define int long long  的操作 2.long long 的使用 数列长度/边 ...

  5. hyper-v虚拟机centos7网络配置

    原文地址:https://jingyan.baidu.com/article/91f5db1b0279bd1c7e05e377.html hyper-v安装了centos7之后并不能上网,这里简单介绍 ...

  6. python — mysql基础知识

    目录 1 . 数据库的介绍 2. mysql 1 . 数据库的介绍 1.为什么要用数据库? 很多功能如果只是通过操作文件来改变数据是非常繁琐的,程序员需要做很多事情 对于多台机器或者多个进程操作用一份 ...

  7. 排序之希尔排序(JS)

    希尔排序(Shell's Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法.该 ...

  8. php--最新正则(手机号码)

    这次给大家带来正则验证(2018最新最全手机号验证),正则验证(2018最新最全手机号验证)的注意事项有哪些,下面就是实战案例,一起来看一下. 下面给大家分享2018手机号正则表达式验证方法,具体内容 ...

  9. FastJson学习:JSON格式字符串、JSON对象及JavaBean之间的相互转换

    当前台需要传送一系列相似数据到后端时,可以考虑将其组装成json数组对象,然后转化为json形式的字符串传输到后台 例如: nodes = $('#PmPbsSelect_tree').tree('g ...

  10. RecyclerView item独占一行实现

    核心代码: GridLayoutManager manager = new GridLayoutManager(context, 4); manager.setSpanSizeLookup() cla ...