关于图片上传

前面我弄了一个关于上传图片到阿里oss 的jq包的 方法。

现在对其升级。

为何要升级?1,主要是减小服务器开销,本来就可以在请求之前完成,那么我们就不必要让数据库加工了。

原理:利用js 对图片进行压缩。压缩好了后,在进行上传。

直接上代码:

/* 图片上传前进行压缩
*  前端压缩
*主要是利用:canvas画板的功能重新绘制一下,就可以了。
// 压缩前将file转换成img对象
function readImg(file) {
    return new Promise((resolve, reject) => {
     const img = new Image()
     const reader = new FileReader()
     reader.onload = function(e) {
      img.src = e.target.result
     }
     reader.onerror = function(e) {
      reject(e)
     }
     reader.readAsDataURL(file)
     img.onload = function() {
      resolve(img)
     }
     img.onerror = function(e) {
      reject(e)
     }
    })
   }
/**
 * 
 * 工具参数说明
 * img 被压缩的img对象
 * type 压缩后转换的文件类型
 *  mx 触发压缩的图片最大宽度限制
 *  mh 触发压缩的图片最大高度限制
 */
function compressImg(img, type, mx, mh) {
    return new Promise((resolve, reject) => {
     const canvas = document.createElement('canvas')
     const context = canvas.getContext('2d')
     const { width: originWidth, height: originHeight } = img
     // 最大尺寸限制
     const maxWidth = mx
     const maxHeight = mh
     // 目标尺寸
     let targetWidth = originWidth
     let targetHeight = originHeight
     if (originWidth > maxWidth || originHeight > maxHeight) {
      if (originWidth / originHeight > 1) {
       // 宽图片
       targetWidth = maxWidth
       targetHeight = Math.round(maxWidth * (originHeight / originWidth))
      } else {
       // 高图片
       targetHeight = maxHeight
       targetWidth = Math.round(maxHeight * (originWidth / originHeight))
      }
     }
     canvas.width = targetWidth
     canvas.height = targetHeight
     context.clearRect(0, 0, targetWidth, targetHeight)
     // 图片绘制
     context.drawImage(img, 0, 0, targetWidth, targetHeight)
     canvas.toBlob(function(blob) {
      resolve(blob)
     }, type || 'image/png') })
   }
//    测试 async 异步方式,防止意外
async function upload(file){
      const img = await readImg(file);//将file转换成img对象
      const blob = await compressImg(img, file.type, 1000, 1000);//压缩大小为 1000x1000
      const formData = new FormData();
      formData.append('file', blob, 'xxx.jpg');//新生成的图片名字:xxx.jpg
      axios.post('http://xxx.com/api',formData);//压缩完成 上传服务器
    }
    upload(file).catch(e => console.log(e))

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

加金开发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值