H5图片压缩上传(单图和多图)

Wesley13
• 阅读 709

H5项目中要用到图片上传,团队成员没有找到解决方案。只能由自己在网上搜索整理一下,如下:

直接看代码吧

Html页:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>H5图片压缩上传</title>
</head>
<body>
<div> 单图:
  <input type="file" accept="image/*" capture="camera" class="jsImg" />
  <input type="hidden" id="hidpic"/>
  <br>
  多图:
  <input type="file" accept="image/*" capture="camera" multiple="multiple"  class="jsImgs" />
  <input type="hidden" id="hidpics"/>
  <br>
  <button id="upload" type="button">上传照片 </button>
</div>
<script src="https://my.oschina.net//lockupme/blog/907636/jquery.js"></script>
<script>

$(function(){
    $('#upload').on('click', function(){
        $.post("u.php", { hidpic: $('#hidpic').val(),hidpics: $('#hidpics').val()  }, function(data){
         alert("Data Loaded: " + data);
       });
    });
    
    //单图
    $('.jsImg').on('change', function(e){
        console.log(this.files[0]);
        setFilesReader(this.files[0], 0);
    });    
    
    //多图
    $('.jsImgs').on('change', function(e){
        console.log(this.files[0]);
        for (var i = 0; i < this.files.length; i++) {
            setFilesReader(this.files[i], 1);
        }
    });

})

function setFilesReader(file, ismul) {
    var reader = new window.FileReader();
    reader.onload = function(e) {
        compress(this.result, fileSize, ismul);
    }
    reader.readAsDataURL(file);
    //console.log(this.files[0]);
    var fileSize = Math.round(file.size/1024/1024) 
}

//onchange="readMultiFiles(this.files)"
function readMultiFiles(files) {
    for (var i = 0; i < files.length; i++) {
        setFilesReader(files[i]);
    }
}

//res代表上传的图片,fileSize大小图片的大小
function compress(res, fileSize, ismul) {
    var img = new Image(), maxW = 640; //设置最大宽度

    img.onload = function () {
        var cvs = document.createElement('canvas'), ctx = cvs.getContext('2d');

        if(img.width > maxW) {
            img.height *= maxW / img.width;
            img.width = maxW;
        }

        cvs.width = img.width;
        cvs.height = img.height;

        ctx.clearRect(0, 0, cvs.width, cvs.height);
        ctx.drawImage(img, 0, 0, img.width, img.height);

        var compressRate = getCompressRate(1,fileSize);

        var dataUrl = cvs.toDataURL('image/jpeg', compressRate);

        //document.body.appendChild(cvs);
        //console.log(ismul);
        if (ismul == 0) {
            $('#hidpic').val(dataUrl);
        } else if (ismul == 1) {
            $('#hidpics').val($('#hidpics').val()+'||'+dataUrl);
        }
    }
    img.src = res;
}

//计算压缩比率,size单位为MB
function getCompressRate(allowMaxSize,fileSize){
    var compressRate = 1;
        
    if(fileSize/allowMaxSize > 4){
       compressRate = 0.5;
    } else if(fileSize/allowMaxSize >3){
       compressRate = 0.6;
    } else if(fileSize/allowMaxSize >2){
       compressRate = 0.7;
    } else if(fileSize > allowMaxSize){
       compressRate = 0.8;
    } else{
       compressRate = 0.9;
    }
    return compressRate;
}

</script>
</body>
</html>

后端用PHP:

<?php


//单图
$base64 = trim($_POST['hidpic']);
$url = explode(',', $base64);
file_put_contents('./test-s.jpg', base64_decode($url[1]));//返回的是字节数


//多图
$base64 = trim($_POST['hidpics'], '||');
$urlArr = explode('||', $base64);
$i = 0;
foreach ($urlArr as $url) {
    $url = explode(',', $url);
    $a = file_put_contents('./test'.$i.'.jpg', base64_decode($url[1]));//返回的是字节数
    $i++;
}

print_r('upload ok');

?>
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这