vue页面转图片,vue实现图片上传到服务器

  vue页面转图片,vue实现图片上传到服务器

  本文主要介绍了vue将图像路径转换为二进制文件流的实现,具有很好的参考价值。希望对大家有帮助。如有错误或不足之处,请不吝赐教。

  

目录

  二进制文件流的图像路径(二进制)Base64Base64二进制文件流的图像路径(二进制)下载二进制流文件Blob,ajax(axios)

  

图片路径转二进制文件流(binary)

  在vue项目中,需要将本地图片或者前端生成的图片发送回后端,然后需要将图片路径转换成二进制文件流,在参数中显示。这时候就需要转换图片路径了。

  

图片路径转换为Base64

  imageUrlToBase64(imageUrl) {

  Let=new image()//一定要设为let,否则图片无法显示。

  image . set attribute( cross origin , anonymous )//解决跨域问题

  image . src=imageUrl v= math . random()

  image.onload=()={

  var canvas=document . createelement( canvas )

  画布宽度=图像宽度

  canvas.height=image.height

  var context=canvas . get context( 2d )

  context.drawImage(image,0,0,image.width,image.height)

  var质量=0.8

  var URL=canvas . toDataUrl( image/jpeg ,quality)//使用toda taurl将图片转换成JPEG格式,不要将图片压缩成png,因为base64压缩成png后的字符串可能会比转换前长!

  this.base64toFile文件(数据URL)

  }

  }

  

Base64转换为二进制文件流(binary)

  base64toFile(数据url,文件名=文件){

  let arr=dataurl.split(,)

  设mime=arr[0]。匹配(/:(。*?);/)[1]

  let suffix=mime.split(/)[1]

  设bstr=atob(arr[1])

  设n=bstr.length

  设u8arr=新Uint8Array(n)

  while (n - ) {

  u8arr[n]=bstr.charCodeAt(n)

  }

  let file=新文件([u8arr],` ${filename}。${suffix} `,{

  类型:mime

  })

  console.log(文件)

  }

  

下载二进制流文件

  通常前端下载文件有两种方式。一种是后台提供一个URL,然后用window.open(URL)下载;另一种是在后台直接返回文件的二进制内容,然后在前端转换下载。下面是第二种实现方法。

  

Blob、ajax(axios)

  这就是在mdn上引入Blob方式:

  Blob表示不可变的原始数据类文件对象。Blob不一定以JavaScript本地格式表示数据。

  特定用途

  axios({

  方法: post ,

  URL:“/export”,

  })。然后(res={

  //假设数据是返回的二进制数据

  常量数据=res.data

  常量url=window。URL.createObjectURL(新Blob([数据],{ type: application/vnd . openxml formats-office document . spreadsheetml . sheet }))

  const a=document . createelement( a )

  a.href=url

  a .单击()

  //const link=document . createelement( a )

  //link.style.display=none

  //link.href=url

  //link.setAttribute(download , excel.xlsx )

  //document.body.appendChild(链接)

  //link.click()

  //document.body.removeChild(链接)

  })

  下载的文件,一堆乱码……肯定有问题。

  最后发现参数responseType有问题,它表示服务器响应的数据类型。由于后台返回的是二进制数据,我们只好将其设置为arraybuffer,然后看结果是否正确。

  axios({

  方法: post ,

  URL:“/export”,

  responseType: arraybuffer ,

  })。然后(res={

  //假设数据是返回的二进制数据

  常量数据=res.data

  常量url=window。URL.createObjectURL(新Blob([数据],{ type: application/vnd . openxml formats-office document . spreadsheetml . sheet }))

  const a=document . createelement( a )

  a.href=url

  a .单击()

  //const link=document . createelement( a )

  //link.style.display=none

  //link.href=url

  //link.setAttribute(download , excel.xlsx )

  //document.body.appendChild(链接)

  //link.click()

  //document.body.removeChild(链接)

  })

  这次没有问题,文件可以正常打开,内容正常,不再乱码。

  以上个人经历,希望能给大家一个参考,也希望大家多多支持我们。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: