H5+jqweui实现手机端图片压缩上传

主要功能,使用H5的formData上传base64格式的图片,canvas压缩图片,前端样式使用weui,为方便起见,使用了jquery封装过的weui,jqweui

话不多少,开始上代码。

前端代码,直接在jqweui官网下的demo里改的(是dist下的demo)

<!DOCTYPE html>
<html>
  <head>
    <title>jQuery WeUI</title>
    <meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">

<meta name="description" content="Write an awesome description for your new site here. You can edit this line in _config.yml. It will appear in your document head meta (for Google search results) and in your feed.xml site description.
">

<link rel="stylesheet" href="../lib/weui.min.css">
<link rel="stylesheet" href="../css/jquery-weui.css">
<link rel="stylesheet" href="css/demos.css">

  </head>

  <body ontouchstart>
    <header class=‘demos-header‘>
      <h1 class="demos-title">Uploader</h1>
    </header>

    <div class="weui-cells weui-cells_form">
      <div class="weui-cell">
        <div class="weui-cell__bd">
          <div class="weui-uploader">
            <div class="weui-uploader__hd">
              <p class="weui-uploader__title">图片上传</p>
              <div class="weui-uploader__info">0/2</div>
            </div>
            <div class="weui-uploader__bd">
              <ul class="weui-uploader__files" id="uploaderFiles">
                <li class="weui-uploader__file" style="background-image:url(./images/pic_160.png)"></li>

              </ul>
              <div class="weui-uploader__input-box">
                <input id="uploaderInput" class="weui-uploader__input" type="file" accept="image/*" multiple="">
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
    <script src="../lib/jquery-2.1.4.js"></script>
<script src="../lib/fastclick.js"></script>
<script>
  $(function() {
    FastClick.attach(document.body);
  });
</script>
<script src="../js/jquery-weui.js"></script>
<script>
  $(function () {
    // 允许上传的图片类型
    var allowTypes = [‘image/jpg‘, ‘image/jpeg‘, ‘image/png‘, ‘image/gif‘];
    // 1024KB,也就是 1MB
    var maxSize = 2048 * 2048;
    // 图片最大宽度
    var maxWidth = 10000;
    // 最大上传图片数量
    var maxCount = 6;
    $(‘#uploaderInput‘).on(‘change‘, function (event) {
      var files = event.target.files;
      //console.log(files);return false;
        // 如果没有选中文件,直接返回
        if (files.length === 0) {
          return;
        }  

        for (var i = 0, len = files.length; i < len; i++) {
          var file = files[i];
          var reader = new FileReader();  

            // 如果类型不在允许的类型范围内
            if (allowTypes.indexOf(file.type) === -1) {  

                $.alert("该类型不允许上传!", "警告!");
              continue;
            }  

            if (file.size > maxSize) {
              //$.weui.alert({text: ‘图片太大,不允许上传‘});
                $.alert("图片太大,不允许上传", "警告!");
              continue;
            }  

            if ($(‘.weui-uploader__file‘).length >= maxCount) {
              $.weui.alert({text: ‘最多只能上传‘ + maxCount + ‘张图片‘});
              return;
            }
            reader.readAsDataURL(file);
            reader.onload = function (e) {
                //console.log(e);
              var img = new Image();
                img.src = e.target.result;
                img.onload = function () {
                    // 不要超出最大宽度
                    var w = Math.min(maxWidth, img.width);
                    // 高度按比例计算
                    var h = img.height * (w / img.width);
                    var canvas = document.createElement(‘canvas‘);
                    var ctx = canvas.getContext(‘2d‘);
                    // 设置 canvas 的宽度和高度
                    canvas.width = w;
                    canvas.height = h;
                    ctx.drawImage(img, 0, 0, w, h);             
                    var base64 = canvas.toDataURL(‘image/jpeg‘,0.8);
                   //console.log(base64);
                    // 插入到预览区
                    var $preview = $(‘<li class="weui-uploader__file weui-uploader__file_status" style="background-image:url(‘ + img.src + ‘)"><div class="weui-uploader__file-content">0%</div></li>‘);
                    $(‘#uploaderFiles‘).append($preview);
                    var num = $(‘.weui-uploader__file‘).length;
                    $(‘.weui-uploader__info‘).text(num + ‘/‘ + maxCount);  

                     var formData = new FormData();

                    formData.append("images", base64);
                    //console.log(img.src);
                         $.ajax({

                                    url: "savetofile.php",

                                    type: ‘POST‘,

                                    data: formData,

                                    contentType:false,

                                    processData:false,

                                    success: function(data){

                                    $preview.removeClass(‘weui-uploader__file_status‘);
                                            $.toast("上传成功", function() {
                                              //console.log(‘close‘);
                                            });
                                },
                                error: function(xhr, type){
                                alert(‘Ajax error!‘)
                                }
                                    });

                      };  

                    };  

                  }
                });
  });
</script>
  </body>
</html>

上述代码中

 var base64 = canvas.toDataURL(‘image/jpeg‘,0.8); 

只有这个函数的第一个参数为image/jpeg是压缩功能才可正常使用,第二个参数为压缩比例

php代码,对base64格式的图片解码并保存

<?php

$imgData = $_REQUEST[‘images‘];
if (preg_match(‘/^(data:\s*image\/(\w+);base64,)/‘, $imgData, $result)){
  $type = $result[2];

    $rand = rand(1000,9999);
  $new_file = ‘img/‘.$rand.‘.‘.$type;
  if (file_put_contents($new_file, base64_decode(str_replace($result[1], ‘‘, $imgData)))){
    echo $type;
  }

}

?>  
时间: 2024-12-14 15:12:52

H5+jqweui实现手机端图片压缩上传的相关文章

基于H5+ API手机相册图片压缩上传

// 母函数 function App(){} /** * 图片压缩,默认同比例压缩 * @param {Object} path * pc端传入的路径可以为相对路径,但是在移动端上必须传入的路径是照相图片储存的绝对路径 * @param {Object} obj * obj 对象 有 width, height, quality(0-1) * @param {Object} callback * 回调函数有一个参数,base64的字符串数据 */ App.prototype.dealImage

纯原生js移动端图片压缩上传插件

前段时间,同事又来咨询一个问题了,说手机端动不动拍照就好几M高清大图,上传服务器太慢,问问我有没有可以压缩图片并上传的js插件,当然手头上没有,别慌,我去网上搜一搜. 结果呢,呵呵...诶~又全是基于jquery.zepto的(这句话似乎吐槽次数太多了...),然后我也就不吐槽了, 然后当然是自己做了,先上图: 纯原生js的移动端图片压缩上传插件,不依赖任何库 用法 在html页面中引入input标签,通过自定义属性data-LUploader绑定点击触发的标签id,写法如下: <div cla

Html5+asp.net mvc 图片压缩上传

在做图片上传时,大图片如果没有压缩直接上传时间会非常长,因为有的图片太大,传到服务器上再压缩太慢了,而且损耗流量. 思路是将图片抽样显示在canvas上,然后用通过canvas.toDataURL方法得到base64字符串来实现压缩. 废话不多少不多说直接看代码: 本次测试使用了 zepto.min.js 插件,更新版本的下载请点击这里 主要js代码: //图片压缩处理 ; (function () { /** * 加载的时候进行抽样检测 * 在iOS中,大于2M的图片会抽样渲染 */ func

【方法】如何实现图片压缩上传

[参考文章] 前端实现图片压缩上传功能 H5实现图片先压缩再上传 原文地址:https://www.cnblogs.com/wannananana/p/12050442.html

android图片压缩上传系列-service篇

本篇文章是继续上篇android图片压缩上传系列-基础篇文章的续篇.主要目的是:通过Service来执行图片压缩任务来讨论如何使用Service,如何处理任务量大的并发问题. 了解下Service 大家都知道如果有费时任务,这时需要将任务放到后台线程中执行,如果对操作的结果需要通过ui展示还需要在任务完成后通知前台更新.当然对于这种情况,大家也可以在Activity中启动线程,在线程中通过Handler和sendMessage来通知Activity并执行更新ui的操作,但是更好的方法是将这些操作

springMVC多图片压缩上传的实现

前台代码: <form id="userForm" method="post" enctype="multipart/form-data"> <div> <label class="my_input_title">图片1:</label> <input type="file" name="file" class=""

HTML5实现图片压缩上传功能

上篇文章中提到移动端上传图片,我们知道现在流量还是挺贵的,手机的像素是越来越高,拍个照动不动就是好几M,伤不起.虽然客户端可以轻轻松松实现图片压缩再上传,但是我们的应用还可能在浏览器里面打开,怎么办呢,图片压缩.受以前PC上的开发思维影响,尼玛js哪有权限去操作文件,哪有资格压缩图片啊,搞不了,你们客户端去整吧.只能说自己还是有些井底之蛙了.在HTML5的影响下,前端能干的事情越来越多了,开发的功能逼格也越来越高了,H5万岁!前端的魅力也在这,过去不可能的并不意味现在.以后不可能,努力吧,骚年!

前端图片压缩上传(纯js的质量压缩,非大小压缩)

此demo为大于1M对图片进行压缩上传 若小于1M则原图上传,可以根据自己实际需求更改. demo源码如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>XMLHttpRequest上传文件</title> <script type="text/javascript"> /* 三个参数 file:一个是文件(

前端图片压缩上传(纯js的质量压缩,非长宽压缩)

原文: 此demo为大于1M对图片进行压缩上传 若小于1M则原图上传,可以根据自己实际需求更改. demo源码如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>XMLHttpRequest上传文件</title> <script type="text/javascript"> /* 三个参数 file:一个