base64格式压缩图片
conpress(base64,宽度,压缩程度0-1)
compress(base64String, w, quality) {
var that = this;
var getMimeType = function (urlData) {
var arr = urlData.split(',');
var mime = arr[0].match(/:(.*?);/)[1];
return mime;
var newImage = new Image();
var imgWidth, imgHeight;
var promise = new Promise(resolve => newImage.onload = resolve);
newImage.src = base64String;
return promise.then(() => {
imgWidth = newImage.width;
imgHeight = newImage.height;
var canvas = document.createElement("canvas");
var ctx = canvas.getContext("2d");
if (Math.max(imgWidth, imgHeight) > w) {
if (imgWidth > imgHeight) {
canvas.width = w;
canvas.height = w * imgHeight / imgWidth;
} else {
canvas.height = w;
canvas.width = w * imgWidth / imgHeight;
} else {
canvas.width = imgWidth;
canvas.height = imgHeight;
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.drawImage(newImage, 0, 0, canvas.width, canvas.height);
var base64 = canvas.toDataURL(getMimeType(base64String), quality);
return that.base64ToFile(base64);
});
base64格式转化为file
base64ToFile(data) {
// 将base64 的图片转换成file对象上传 atob将ascii码解析成binary数据
let binary = atob(data.split(',')[1]);
let mime = data.split(',')[0].match(/:(.*?);/)[1];
let array = [];
for (let i = 0; i < binary.length; i++) {
array.push(binary.charCodeAt(i));
let fileData = new Blob([new Uint8Array(array)], {
type: mime,
});
let file = new File([fileData], `${new Date().getTime()}.png`, { type: mime });
return file;
压缩的时候有些地方会出现特定的文件格式,需要.then获取。
ionic2 return “__zone_symbol__state: null, __zone_symbol__value: Array(0)”
在ionic2中使用Promise来GET后台数据时返回如下信息,明显这串数据不能赋予变量使用(实际发现一般方式也很难取出Promise返回的数据,如return、赋值等)
先看Promise代码:
getTasks(){
var url = APP_SERVE_URL+'products/1';
return new Promise((resolve, reject) => {
this.http.get(url)
.map(res => res.json())
.subscribe((taskDetails:TaskDetails) => {
resolve(taskDetails);
console.log(taskDetails.Name);
console.log('succeed!');
return(JSON.stringify(taskDetails));
}, err => {
reject(err);
constructor{}中调用getTasks的代码:
this.getTasks().then(taskDetails=>{
console.log(taskDetails);
});
this.globalData.task = this.getTasks();
console.log(this.globalData.task);
不过两者都不能通过一般的方式将Promis返回的数据赋予变量使用(本文暂不讨论两者为何不同),这对于想使用Promise返回数据来绑定页面组件显示在app中的人来说估计很郁闷,本文提供了一种简单的方式来返回Promise可供取用(retrieve)的数据。首先我们应该知道Promise是一种异步工作方式(详见JavaScript Promise:简介),这也就是为什么不能直接在Promise外使用变量来获取它返回的数据,下面这种方式读者可以试下:
getTasks1(): Promise<any>{
var url = APP_SERVE_URL+'products/1';
return this.http.get(url)
.map(res => res.json())
.toPromise();
this.getTasks1().then(task =>{
console.log(`Returned: ${task}`);
this.WorkOrder = task;
console.log(this.WorkOrder);
});
说明该变量成功retrieve data,大家不妨试下这种方式来获得plain data,查资料似乎使用async和await方式也能成功(毕竟Promise是异步工作的)。
base64格式压缩图片conpress(base64,宽度,压缩程度0-1)compress(base64String, w, quality) { var that = this; var getMimeType = function (urlData) { var arr = urlData.split(','); var mime = arr[0].match(/:(.*?);/)[1]; // return mime.replace("ima
之前为了拍摄照片使用了webcam相关的插件,其拍摄后得到的是base64格式的图片,直接显示没问题,在src中直接指定就可以了,但是要上传到server时问题就来了,server端接收的是标准的文件,也就是html form中type=”file”的形式。想要沿用这个接口不更改server端代码,于是尝试将base64直接转换成标准的fomeData并通过AJAX提交。
第一步,将base64转换成二进制图片(Blob)
主要思路是整理一下base64的前面几个字符,预处理以后转换成Blob对象,这个之后稍作处理可以放在formData中。
function dataURItoBlob(b
写在前面:本文说的这个方案有浏览器兼容性问题;所有主流浏览器的较新版本已经支持这个对象了,比如Chrome 7+、Firefox 4+、IE 10+、Opera 12+、Safari 5+,对兼容性比较敏感的网站慎用。
在工作中遇到了一个问题:在一个页面中,有4块内容,每块内容都包含一个图片上传功能,希望可以实现一键把这四块内容都上传上去。
我没有用插件实现上传功能,就是用的input[type=file],因此就遇到一个问题就是:
①传统的form表单会导致页面刷新,无法实现上述功能
②把表单serialize()序列化用Ajax的方式提交,也无法把上传文件的文件流进行序列化,也不行
Blob,Binary Large Object缩写,二进制大对象,表示一个不可变、原始数据的类文件对象。
单位为字节(byte),一个字节8位长,为0~255
Uint8Array
8位无符号整型数组
let binary = atob(base64.split(',')[1]);
let array = [];
for (let i = 0; i < binary.length; i
// base64 这里取得是 base64.split(',')[1]那一串,前面的不取
const data = window.atob(base64);
const ia = new Uint8Array(data.length);
for (let i = 0; i < data.length; i++) {
ia[i] = data.charCodeAt(i);
const blob = new Blob([i
表单数据到对象
将formData对象或form DOM节点转换为KV对象。
通常,您不想使用此方法,而是将onchange侦听器附加到每个输入元素。 在某些情况下有用。
var toObject = require ( 'formdata-to-object' )
var html = require ( 'bel' )
document . body . appendChild ( html `
< input type =" text " name =" name " >
< input type =" password " name =" password " >
< input type =" submit " value =" Login " >
</ form >
var form = document .
关于FormData
XMLHttpRequest Level 2添加了一个新的接口 —- FormData
利用FormData对象,可以通过js用一些键值对来模拟一系列表单控件,可以使用XMLHttpRequest的 send( ) 方法来异步提交表单与普通的ajax相比,使用FormData的最大优点就是可以异步上传二进制文件
FormData对象
FormData对象,可以把所有表单元素的name与value组成一个queryString,提交到后台。 在使用ajax提交时,使用FormData对象可以减少拼接queryString的工作量
queryString是查询字符串,ht
FormData对象,是可以使用一系列的键值对来模拟一个完整的表单,然后使用XMLHttpRequest发送这个”表单”。 在 Mozilla Developer 网站 使用
FormData对象 有详尽的
FormData对象使用说明。 但
上传文件部分只有底层的XMLHttpRequest
对象发送
上传请求,那么怎么通过jQuery的Ajax
上传呢? 本文将介绍通过jQuery使用
FormData对象上传文件。
使用<
form>表单初始化
FormData对象方式
上传文件
HTML代码
<
form id="upload
Form" enctype="multipart/
form-
data">
您可以使用 atob() 方法将 Base64 编码的字符串解码为二进制数据,再用 new Blob() 方法创建 Blob 对象,最后将 Blob 对象封装到 FormData 中,使用 XMLHttpRequest 或 fetch API 发送请求。以下是示例代码:
// 将 Base64 编码的字符串转换为 Blob 对象
function base64ToBlob(base64Str) {
const decodedStr = atob(base64Str);
let len = decodedStr.length;
let bytes = new Uint8Array(len);
for (let i = 0; i < len; ++i) {
bytes[i] = decodedStr.charCodeAt(i);
return new Blob([bytes]);
// 将 Blob 对象封装到 FormData 中
function createFormData(blob) {
const formData = new FormData();
formData.append('file', blob, 'filename.jpg');
return formData;
// 发送请求示例
const base64Str = '...'; // 替换成实际的 Base64 编码的字符串
const blob = base64ToBlob(base64Str);
const formData = createFormData(blob);
fetch('/upload', {
method: 'POST',
body: formData
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error(error));
以上代码仅供参考,具体实现可以根据实际情况进行调整。