博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Canvas保存图片到七牛云
阅读量:6833 次
发布时间:2019-06-26

本文共 3320 字,大约阅读时间需要 11 分钟。

最近在做一个项目,需要在前端对图片切片并上传到七牛云

技术要点

  1. canvas.toBlob(blob=>{}); //可将canvas保存成二进制文件
  2. formData.append('file', blob, 'filename'); //将二进制文件添加到FormData中
  3. ajax.send(formData); //上传数据到后端处理

代码实现

目前没有看到七牛云提供的JSSDK支持上传blob到云上的, 所以这里自己实现了一下

注意ajax post formData到七牛云的时候不要设置content-type,让浏览器自己处理

class Qiniu {  constructor(options = {}) {    this._options = {...options};  }  ajax(url = '', opt = {}) {    const options = {method: 'GET', async: true, dataType: 'JSON', ...opt};    return new Promise((resolve, reject) => {      const ajax = this.createAjax();      if (ajax) {        const _async = typeof options.async === 'boolean' ? options.async : true;        ajax.open(options.method || 'GET', url, _async);        if (options.headers) {          Object.keys(options.headers).forEach(key => {            ajax.setRequestHeader(key, options.headers[key]);          });        }        ajax.onreadystatechange = () => {          if (ajax.readyState === 4) {            if (ajax.status >= 200 && ajax.status <= 400) {              let res = ajax.responseText;              if (options.dataType && options.dataType.toUpperCase() === 'JSON') {                res = JSON.parse(res);              }              resolve(res, ajax.response);            } else {              reject(new Error('请求失败:' + ajax.status))            }          }        };        ajax.send(options.data);      } else {        reject(new Error('创建Ajax请求失败!'));      }    });  }  createAjax() {    let xmlhttp;    if (window.XMLHttpRequest) {      xmlhttp = new XMLHttpRequest();    } else {      xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");    }    return xmlhttp;  }  getToken() {    if (this._options.token) {      return Promise.resolve(this._options.token);    } else {      if (typeof this._options.getToken === 'function') {        const t = this._options.getToken();        if (t && typeof  t.then === 'function') {          return t.then(token => {            this._options.token = token;            return token;          })        } else if (typeof t === 'string') {          this._options.token = t;          return Promise.resolve(t);        } else {          return Promise.reject(new Error('options.getToken必须返回Promise或string token'));        }      } else if (typeof this._options.getTokenUrl === 'string') {        return this.ajax(this._options.getTokenUrl, {          headers: {            authorization: this._options.authorization          }        }).then(res => {          this._options.token = res.uptoken;          return this._options.token;        }).catch(ex => {          throw new Error('获取uptoken失败:' + ex.message);        });      } else {        return Promise.reject(new Error('无法获取token'));      }    }  }  upload(file, filename, key) {    return this.getToken().then(token => {      const formData = new FormData();      formData.append('key', key || filename);      formData.append('token', token);      formData.append('file', file, filename);      return formData;    }).then(data => {            //注意不要设置content-type,浏览器自动会填充      return this.ajax('http://upload.qiniu.com/', {        method: 'POST',        data,      });    });  }}canvas.toBlob(blob => {    const filename = Date.now() + Math.random() + '.png';    const qiniu = new Qiniu({getTokenUrl:'这里写获取七牛token的接口地址'});    qiniu.upload(blob, filename);}, 'image/png');

转载地址:http://rjxkl.baihongyu.com/

你可能感兴趣的文章
设计模式6大原则:里氏置换原则
查看>>
hbase0.94.14伪分布式安装
查看>>
Debug记录:vCenter6.5突然不能访问并报错“503 Service Unavailable”
查看>>
自动导出oracle的数据
查看>>
顺序表实现的源码
查看>>
我的友情链接
查看>>
iOS调用系统摄像头和相册
查看>>
mysql文件导入办法(直接copy数据库文件)
查看>>
善用WIN四把利剑提升服务器稳定性
查看>>
Hadoop学习笔记《关于HDFS》
查看>>
【二叉树】线索化二叉树
查看>>
Office365混合部署之用户权限(角色)分配
查看>>
logback配置
查看>>
rhel6配置多用户tiger vnc server
查看>>
Mac环境下svn的使用
查看>>
Pig读写HBase数据
查看>>
NumPy基础(一)
查看>>
菜鸟学Linux 第104篇笔记 varnish
查看>>
ATEN宏正盛装出席Infocomm China 2016
查看>>
并发数/QPS/PV/ 服务器响应时间公示
查看>>