zoukankan      html  css  js  c++  java
  • 关于前端本地压缩图片,兼容IOS/Android/PC且自动按需加载文件之lrz.bundle.js

    一、介绍说明
    主要特点:
      ①在前端压缩好要上传的图片可以更快的发送给后端,因此也特别适合在移动设备上使用。
      ②兼容IOS/Android,修复了IOS/Android某些版本已知的BUG。
      ③按需加载文件,仅需引入lrz.bundle.js文件,例如当检测是IOS7的用户,那么会自动异步再载入修复BUG的文件,而无需担心浪费宝贵的带宽开销。
      ④原生JS编写,不依赖例如jquery等第三方库。
    二、如何获取
    下载地址:

    https://files.cnblogs.com/files/sunyuweb/lrz.bundle.js

    <script src="./lrz.bundle.js"></script>
    三、如何使用

    方式1:图片用于用户上传

    <script src="./lrz.all.bundle.js"></script>(博客暂时没有资源可以自行Google download)

    这里加载的这个有个all,和上面地址的例子可能是不一样。因为这个all的js是比较全的兼容android和ios。

    如果您的图片来自用户拍摄或者上传的,您需要一个input file来获取图片。

    上传图片<input type="file" capture="camera" accept="image/*" name="logo" />
    capture(捕获的意思)表示调用相册相机camera,录音机video和摄像机audio。
    accept 表示直接打开系统文件目录。(其实html5的input:file标签还支持一个multiple属性,表示可以支持多选。加上这个multiple后,capture就没啥用了,因为multiple是专门用来支持多选的。)

    input type="file" 添加了 accept="image/*"属性在Chrome和Safari等Webkit浏览器下却出现了响应滞慢的问题,使得页面弹出选择文件的弹窗非常的慢6-10s,这是因为accept="image/*"会每一个文件都遍历一次所有的”image/*”文件类型。

    解决办法是:删掉它或者将 * 通配符,或者修改为指定的MIME类型

    <input type="file" accept="image/gif,image/jpeg,image/jpg,image/png,image/svg">

    $(function(){
      $('input[name=logo]').on('change', function(){
        lrz(this.files[0], { 640}) //640这个代表的是图片占得内存的大小,值越小,占内存越小
          .then(function (rst) {  //请求ajax把图片地址传过去
            $.ajax({
              url: site_url + 'api/user/updLogo',
              type: 'post',
              data: {img: rst.base64}, //rst.base64就是这个图片的地址 base64字符串
              dataType: 'json',
              timeout: 200000,
              error: doAjax.error,
              success: doAjax.success,
            });
          })
          .catch(function (err) {  //捕获错误,而且一旦出错上面的then都不会执行  })
          .always(function () {  //无论成败都会执行这里   });
      });
    })

    <input onchange="upload()" type="file" capture="camera" />
    接着通过change事件可以得到用户选择的图片
    function upload () {
      lrz(this.files[0])
        .then(function (rst) {  // 处理成功会执行  })
        .catch(function (err) {  // 处理失败会执行  })
        .always(function () {  // 不管是成功失败,都会执行  });
    });


    方式2:如果图片不是来自用户上传的,那么也可以直接传入图片路径
    lrz('./xxx/xx/x.png')
      .then(function (rst) {  // 处理成功会执行  })
      .catch(function (err){  // 处理失败会执行  })
      .always(function () {  // 不管是成功失败,都会执行  });

    四、后端处理
    后端最终会收到前端发送的base64字符串,接着处理字符串为图片即可。
    前端生成的结果中有一个base64Len,这是字符串的长度,后端应该核对以确认是否提交完整。
    五、兼容性
    IE9以上及大部分非IE浏览器(chrome、微信什么的)
    六、FAQ
    有疑问请直接在 issues 中提问 :see_no_evil:
    Q:有时拍摄完照片后,页面自动刷新或闪退了。
    A:虽然已作了优化处理,但内存似乎还是爆掉了,常见于低配android手机。


    Q: 怎么批量上传图片?
    A: 您可以自己写个循环来传入用户多选的图片,但在移动端上请勿这样做,原因同上。


    Q: 直接传入图片路径的无法生成图片
    A: 可能是跨域的问题,具体请看CORS_enabled_image


    Q: 想要商用可以吗?
    A: 没问题,但请留意issue里已知的问题。

     

  • 相关阅读:
    Android Studio 快捷键、Debug的使用
    android 控件获取 获取焦点
    jquery里面获取div区块的宽度与高度
    C# ASP.NET MVC 配置允许跨域访问
    分页跳转计算公式
    在vue-cli3 中import引入一个没有export default{}的js文件
    vue中引入css文件
    Vue 导入文件import、路径@和.的区别
    npm 如何查看一个包的版本信息?
    Chrome浏览器常用键盘快捷键介绍
  • 原文地址:https://www.cnblogs.com/sunyuweb/p/lrzBundleJs.html
Copyright © 2011-2022 走看看