分享编程~
 

HTML PHP文件上传(三) AJAX异步上传 文件base64上传js图片压缩

通过ajax异步加载实现表单异步提交、文件异步上传

天天特卖抢好货

通过ajax异步加载实现表单异步提交、文件异步上传。

实现原理就是把上传文件转base64字符串数据进行文件上传。

源码

demo.html 代码:

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>HTML文件上传(三) ajax异步上传 文件base64上传</title>
	<script src="http://apps.bdimg.com/libs/jquery/1.8.3/jquery.min.js"></script>
</head>
<body>
	<input type="file" id="imagesfile" hidefocus style="display:none">
	<img src="./photo_icon.png" width="100" id="imgtmp" onclick="imagesfile.click()" alt="选择文件" />
	<button id="sub_btn" >上传</button>
</body>
</html>

<script>
window.onload = function(){
    var imagesfile = document.getElementById("imagesfile");
    imagesfile.onchange = function () {
        var file = imagesfile.files[0];
        //判断文件大小不能超过10M ,免去服务器的压力。
        if (file.size > 10 * 1024 * 1024) {
            alert("上传文件必须 < 10Mb!");
            return false;
        }
        // 获取文件
        var reader = new FileReader();  // 实例化
        reader.readAsDataURL(file);     // 加载
        reader.onload = function () {   // 异步加载完成
            //console.log(reader);
            var base64 = reader.result; // 获取 base64 DataURL
            var imgDom = document.getElementById("imgtmp");
            imgDom.src = base64;
	    /**图片压缩**/
	    imgDom.onload = function () {
        imgDom.onload=null;
                var canvas = document.createElement('canvas');  // 获取canvas对象
                var context = canvas.getContext('2d');          // 获取canvas的上下文
                canvas.width = 100;
                canvas.height = 100;
                context.clearRect(0, 0, canvas.width, canvas.height); // 首先先清空canvas里面的内容,以防内容叠加
                context.drawImage(imgDom, 0, 0, canvas.width, canvas.height); // 画图
                var base64min = canvas.toDataURL('image/jpeg', 0.92);         // 格式和质量
                imgDom.src = base64min;
                //选择文件后可以自动上传图片
                //base64_uploading(base64min);
            }
	    /****/
        }
    }
}

var flag = ''; // 为了防止重复提交添加个开关
// 点击提交
$('#sub_btn').on('click',function(){
	var base64Data = $('#imgtmp').attr('src');
	if(base64Data && flag != base64Data){
		flag = base64Data;
		base64_uploading(base64Data);
	}else{
		alert('已经提交过了');
	}
})

//AJAX上传base64
function base64_uploading(base64Data){
	$.ajax({
		type: 'POST',
		url: "upload.php",
		data: { 
			'img': base64Data
		},
		dataType: 'json',
		timeout: 50000,
		success: function(data){
			console.log(data);
			if(data.code == 10000){
				alert('上传成功');
			}else{
				alert('上传失败:'+data.msg);
			}
		},
		complete:function() {},
		error: function(xhr, type){
			alert('上传超时了');
		}
	 });
}
</script>


后端接收文件以php为例,upload.php 源码:

<?php
header("Content-type: text/html; charset=utf-8");
error_reporting(E_ALL ^ E_NOTICE);

function fileuploads(){
	// 初始配置
	$up_dir = './uploads/';
	$fileTypes = array('pjpeg','jpeg','jpg','gif','bmp','png');
	// 初始结果集
	$result = array('code'=>40000,'msg'=>'参数错误','data'=>array());
	// 参数验证
	if(!isset($_POST['img'])){
		return $result;
	}
	$base64_img = trim($_POST['img']);
	// 路径验证生成
	if(!file_exists($up_dir)){
		mkdir($up_dir,0777);
	}
	// 正则匹配填充搜索结果
	if(!preg_match('/^(data:\s*image\/(\w+);base64,)/', $base64_img, $res)){
		$result['code'] = 30000;
		$result['msg'] = '上传文件信息错误';
		return $result;
	}
	$type = $res[2]; // 文件类型
	// 文件类型判断
	if(!in_array($type, $fileTypes)){
		$result['code'] = 30001;
		$result['msg'] = '上传文件类型不是图片类型';
		return $result;
	}
	// 拼接文件全路径
	$new_file = $up_dir.date('YmdHis').'_'.rand(100,999).'.'.$type;
	if(!file_put_contents($new_file, base64_decode(str_replace($res[1], '', $base64_img)))){
		$result['code'] = 30002;
		$result['msg'] = '图片上传失败';
		return $result;
	}
	$result['code'] = 10000;
	$result['msg'] = '图片上传成功';
	$result['data']['filepath'] = str_replace('../../..', '', $new_file);
	return $result;
}


// 调用
$result = fileuploads();
echo json_encode($result);return;
?>


如果想实现远程提交,在后端php文件里添加head头:header("Access-Control-Allow-Origin: *");


上一篇:HTML PHP文件上传(二) iframe文件异步上传下一篇:HTML PHP文件上传(四) AJAX异步上传文件二进制数据流
赞(4) 踩(0)
您说多少就多少,您的支持是我最大的动力
赏金
微 信
赏金
支付宝
本文连接: https://www.yj521.com/article/34.html
版权声明: 本文为原创文章,版权归《越加网》所有,分享转载请注明出处!