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

前端对图片进行压缩,一般使用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. Hadoop介绍与安装

    前言 最近想学习下大数据,有点急于求成,于是去网上找了各种培训机构的视频,发现大都质量不佳,理论基本不说或者简单讲下,然后教你照猫画虎的敲代码,出了问题都没法分析.最后还是找了厦门大学的公开课从理论开 ...

  2. 【jmeter测试范例】001——TCP测试

    1.打开Jmeter(或者运行NewDriver.java启动Jmeter) 2.新建一个测试计划 ······ 3.新建线程组 4.设置线程组的参数 1.线程的数量 2.要在多久内完成,即每个请求发 ...

  3. 2.2注册中心:Eureka

    pom.xml配置 <?xml version="1.0" encoding="UTF-8"?><project xmlns="ht ...

  4. (七)mybatis 的输入映射与输出映射

    目录 前言 输入映射 - - 传递 pojo 包装类型 (复杂查询 ) 输出映射 - - resultType 输出映射 - - resultMap 前言 通过 paramterType 指定输入参数 ...

  5. Django-djangorestframework-请求模块-获取请求参数

    目录 请求模块 源码分析 正式使用 总结 请求模块 主要是分析 drf 二次封装后的 request 对象 以及怎么拿到请求传递过来的数据(url 拼接的数据,数据包传过来的数据) 源码分析 源码查看 ...

  6. 第九章 MIZ702 ZYNQ片上ADC的使用

      9.0难度系数★☆☆☆☆☆☆ 9.1实验概述 这次借助zynq的内嵌的XADC来采集zynq内部的一些参数: •VCCINT:内部PL核心电压 •VCCAUX:辅助PL电压 •VREFP:XADC ...

  7. prometheus-常用资源对象

    监控 Kubernetes 常用资源对象 Prometheus 来自动发现 Kubernetes 集群的节点,用到了 Prometheus 针对 Kubernetes 的服务发现机制kubernete ...

  8. arcgis js之点击获取featureLayer中的点

    arcgis js之点击获取featureLayer中的点 代码: this.view.on('click', (evt) => { let layer = this.map.findLayer ...

  9. vs 调试时 QuickWatch 不能计算变量值

    尝试下这个方法:DEBUG- -> Options and Settings--> Symbols中查看缓存路径是否设置为当前程序的bin文件然后将Debug-->Options a ...

  10. Lab2 Report

    1.安装SeleniumIDE插件 a)安装Firefox 17.0 - 56.*版本的firefox,下载地址为:http://ftp.mozilla.org/pub/firefox/release ...