使用webSocket实现移动端与PC端传输图片

        需求:我需要把移动端的一个base64图片传到PC端后,由PC端上传第三方接口,得到第三方接口返回的一个合成文件。 

        下面是我历经千辛万苦后得到的流程结果,我会按照下面如图顺序介绍每一个步骤

                

 我好苦呀

下面开始介绍:

一.获取base64

        这里实际是获取电子签名的base64,总之就是拿到一个base64

二.转文件流上传图片

        里面的上传图片实际是调用接口,fd已经是可直接上传的formData了

        更详细可看:base64转formdata上传图片_shihezhengshz的博客-CSDN博客

// base64转formdata
base64ToFormdata(base64Data){
  const data = window.atob(base64Data.split(',')[1]);
  const ia = new Uint8Array(data.length);
  for (let i = 0; i < data.length; i++) {
    ia[i] = data.charCodeAt(i);
  }
  const blob = new Blob([ia], { type: 'image/png' });
  const fd = new FormData();
  fd.append('multipartFile', blob, new Date().getTime() + '.png');

  // 上传图片
  this.upload(fd)
}

三.获取文件地址

        我调用后端上传文件接口后,后端会返回给我一个存到服务器里的文件地址

四.传文件地址

        此处有:注意点B

        这个就是使用webSocket将信息,从移动端传到PC端,这里webSocket实际上就是聊天室思想,即A链接传信息给B链接。

 五.文件地址获取图片转base64

        此处有:注意点C

// 获取到一个canvas的url叭
getBase64Image(img) {
    var canvas = document.createElement("canvas");
    canvas.width = img.width;
    canvas.height = img.height;
    var ctx = canvas.getContext("2d");
    ctx.drawImage(img, 0, 0, img.width, img.height);
    var ext = img.src.substring(img.src.lastIndexOf(".")+1).toLowerCase();
    var dataURL = canvas.toDataURL("image/"+ext);
    return dataURL;
},
// 图片地址转为base64
imgUrlTransformationForBase64(imgUrl){
  var image = new Image();
  image.width = 200;
  image.height = 200;
  // 设置跨域
  image.setAttribute("crossOrigin",'Anonymous')
  // 服务器地址
  image.src = "http://192.168.0.18:7012"+imgUrl;

  image.onload = () => {
    this.base64 = this.getBase64Image(image);
  }

  return this.base64
},

 原文链接:

https://www.jb51.net/article/132697.htmhttps://www.jb51.net/article/132697.htm

下面是我在实现这套流程时遇到的问题,以下包含---问题+心路历程(可跳过)+解决方案:

A注意点:《webSocket:兄弟,你这个base64,有亿点点长鸭》

心路历程:刚开始遇到问题,是因为webSocket “不稳定”,也就是传输数据的时候经常会断开连接,但偶尔又能成功,因为这时候是我第二次写webSocket,也没想到解决方案,百度了好一会儿,才知道webSocket还有Code码!哇!

解决方案:webSocket报code1009,即数据量过大,也就是你的base64太长了,传不了,这就衍生了我使用地址传输的方案,也就有了下一个问题

原文链接:https://segmentfault.com/a/1190000014582485https://segmentfault.com/a/1190000014582485

 B注意点:《webSocket:“听说,你传了个地址?”》

心路历程:传地址……传地址……明明挺快乐的事儿,结果期待着,好长时间收不到webSocket的消息,一看,好家伙,链接又断了,一看code,1002~emmmm~上网一查,自己一想,喔~是链接里面的   /   出问题了。

解决方案:string.split('/').join('-'),之后传过去再 string.split('-').join('/')转回来,其中string就是地址了

C注意点: 《Canvas:谁污染了我,我又污染了谁?》

 心路历程:一张图,足矣。

解决方案:设置跨域

var image = new Image();
// 设置跨域
image.setAttribute("crossOrigin",'Anonymous')

 原文链接:Uncaught DOMException: Failed to execute 'toDataURL' on 'HTMLCanvasElement': Tainted canvases may not be exported - 范仁义 - 博客园Uncaught DOMException: Failed to execute 'toDataURL' on 'HTMLCanvasElement': Taintedhttps://www.cnblogs.com/Renyi-Fan/p/9588755.html

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值