1.注册input file标签的onchange事件;

2.检查图片格式;

3.检查图片大小;

4.压缩图片

5.上传图片至服务器;

前端代码:

document.getElementById('img-file').addEventListener('change', function (event){
var that=this;
var file = that.files[0];
if (file) {
var rFilter = /^(image\/jpeg|image\/png|image\/jpg)$/i; // 检查图片格式
if (!rFilter.test(file.type)) {
alert("请选择jpeg、png、jpg格式的图片");
return;
}
}
var fileSize = Math.round(that.files[0].size/1024/1024) ; //以M为单位
if(fileSize>3){
alert("请上传小于3M的图片");
return;
} //压缩后上传
compress(event.target.files[0],fileSize,function(base64_data){
$.ajax({
type:'post',
url:ApiUrl+'/index.php?act=sns_album&op=base64_upload',
data:{key:key,imgBase64:base64_data},
dataType:'json',
success: function(result){
callBack(result);
}
});
}); },true); function compress(res,fileSize,callBack) {
//res代表上传的图片base64位,fileSize大小图片的大小
var img = new Image();
var maxW = 800; //设置最大宽度
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);
//*将image对象转成base64*
var dataUrl = cvs.toDataURL('image/jpeg', compressRate);
if(typeof callBack=='function') callBack(dataUrl);
}
img.src = res;
}

服务器:

    public function base64_uploadOp(){
header('Content-type:text/html;charset=utf-8');
$base64_image_content = $_POST['imgBase64'];
//匹配出图片的格式
if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $base64_image_content, $result)) {
$type = $result[2];
$member_id = $this->member_info['member_id']; $date = date("Ym");
$new_file =BASE_UPLOAD_PATH.DS."chat/".$date.DS;
if (!file_exists($new_file)) {
//检查是否有该文件夹,如果没有就创建,并给予最高权限
mkdir($new_file, 0700);
}
$file_name=time();
$new_file = $new_file . $file_name . ".{$type}";
if (file_put_contents($new_file, base64_decode(str_replace($result[1], '', $base64_image_content)))) {
$data = array();
$data['file_id'] = $file_name;
$data['file_name'] = $new_file;
$data['file_url'] =UPLOAD_SITE_URL.DS."chat/".$date.DS.$file_name . ".{$type}";
return json_encode($data);
} else {
exit("文件保存失败");
}
}else{
exit("文件转换失败");
}
}

H5图片上传、压缩的更多相关文章

  1. vuejs开发组件分享之H5图片上传、压缩及拍照旋转的问题处理

    一.前言 三年.net开发转前端已经四个月了,前端主要用webpack+vue,由于后端转过来的,前端不够系统,希望分享下开发心得与园友一起学习. 图片的上传之前都是用的插件(ajaxupload), ...

  2. 浅析H5图片上传

    概述 最近需求上需要实现图片上传的功能,简单记录下实现过程.目前实现的功能比较简单,主要有以下几点: 图片预览 图片删除 拖拽上传 压缩上传 移动端实现方案:使用File API 主要使用到 File ...

  3. H5 图片上传

    1.h5 图片异步上传 (1) 异步上传input触发onchange事件的时候,就把图片上传至服务器.后台可能会返回图片的链接等信息,前台可以把图片信息展示给用户看. (2) 另一种情况可能需要前台 ...

  4. vue移动端图片上传压缩

    上传压缩方法 import {api} from '../../api/api.js'; import axios from 'axios'; export function imgPreview ( ...

  5. h5图片上传预览与拖拽上传

    图片上传: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w ...

  6. Java图片上传压缩处理

    所需要的jar包在:\jdk1.7.0_25\jre\lib\rt.jar里面 package util; import java.awt.Image; import java.awt.image.B ...

  7. H5图片上传插件

    基于zepto,支持多文件上传,进度和图片预览,用于手机端. (function ($) { $.extend($, { fileUpload: function (options) { var pa ...

  8. h5图片上传预览

    项目中常用到文件上传预览功能,整理一下:如果不想使用 type="file" 的默认样式,可以让其覆盖在一个按钮样式上边,设其透明度为0,或者使用Label关联 html < ...

  9. h5图片上传简易版(FileReader+FormData+ajax)

    一.选择图片(input的file类型) <input type="file" id="inputImg"> 1. input的file类型会渲染为 ...

随机推荐

  1. LCA 最近公共祖先 (笔记、模板)

    求lca的方法大体有三种: 1.dfs+RMQ(线段树 ST表什么的) 在线 2.倍增 在线 3.tarjan 离线 ps:离线:所有查询全输入后一次解决 在线:有一个查询输出一次 以下模板题为 洛谷 ...

  2. 02018_StringBuffer练习

    1.已知int[] arr = {34,12,89,68}; 将其中的元素转成字符串,格式 [34,12,89,68]: 参考:02011_定义打印数组元素方法,按照给定的格式打印[11, 33, 4 ...

  3. 【Codeforces Round #493 (Div. 2) B】Cutting

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 显然只有在前i个位置奇数偶数出现次数都相同的地方才能切. (且不管前面怎么切,这里都能切的. 那么就相当于有n个物品,每个物品的代价 ...

  4. BA-siemens-点位类型表

    X(超级点)  输入 0-10v 4-20ma(不可用) Ni 1000 Pt 1000 10k & 100k 热敏电阻 数字输入 脉冲计数输入 输出 0-10v 4-20ma(不可用) 数字 ...

  5. HDU 4133

    注意题目中的一句话:If a number m has bigger evaluating value than all the numbers smaller than it... 这让我重新想过反 ...

  6. 八皇后问题java实现

    八皇后问题java实现 public class eightqueen { public static int count=0; public static void main(String[] ar ...

  7. [React] How to use a setState Updater Function with a Reducer Pattern

    In this lesson we'll walk through setting up an updater function that can receive an action argument ...

  8. __FUNCTION__, __LINE__ 有助于debug的宏定义

    __FUNCTION__, __LINE__ 今天无意之间看到一段代码,里面有这样一个片段: if (!interface) { err ("%s - error, can't find d ...

  9. 【Swift】学习笔记(六)——函数

    函数  懂编程语言的来说这个是最主要的了,不论什么语言都有函数这个概念.函数就是完毕特定任务的独立代码块. 函数怎么创建: 1.创建一个无參无返回值的函数(实际上全部的函数都有返回值,这个函数返回vo ...

  10. 从HTTP 2.0想到的关于传输层协议的一些事

    0.HTTP协议的历史 我也不知道... 1.关于HTTP 2.0 收到了订阅的邮件,头版是说HTTP 2.0的内容,我本人不是非常关注HTTP这一块儿.可是闲得无聊时也会瞟两眼的.HTTP 2.0的 ...