添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

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("image/", "");
      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);
      //console.log(base64);
      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="uploadForm" 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)); 以上代码仅供参考,具体实现可以根据实际情况进行调整。