分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 网页技术

使用ajax上传图片,支持图片即时浏览,支持js图片压缩后上传给服务器

发布时间:2023-09-06 01:51责任编辑:熊小新关键词:js上传图片

使用ajax上传图片,支持图片即时浏览,支持js图片压缩后上传给服务器

ajax上传主要使用了 var reader = new FileReader() 此方法

js图片压缩主要是利用canvas进行的

源码:

/** * js使用form上传图片,支持本地预览选中的图片,支持携带自定义参数* @param {string} ???params.previewImgId ?????预览图片控件id,可以预览上传图片* @param {string} ???params.url ??????????????提交上传的url* @param {function} ?params.success ??????????上传接口的回调函数* @param {boolean} ??params.params ???????????上传时提交的其它参数 有几个传几个,系统会把 previewImgId ?url success 这三个参数过滤后的其它参数传给服务器 ?使用示例: ?<img src="" id="yulan"> ?<div onclick="shangchuan()">上传</div> function shangchuan(){ ???????jsUploadImage({"diyparam":"1111","diyparam1":"222","previewImgId":"yulan","url":"user.php?act=photosave","success":function(data){ ???????????console.log(data); ???????}}) ??};*/function jsUploadImage(params){ ??????//初始化数据 ???params.previewImgId = params.previewImgId || ""; ???params.url = params.url || ""; ???params.success = params.success || ""; ???//创建file上传控件 ????if(document.getElementById("imgFile")==null){ ????????var ?inputEle=document.createElement("input"); //创建input ??????????inputEle.id="imgFile"; ??????????inputEle.type="file"; ?????????inputEle.accept="image/png,image/jpeg,image/jpeg,DCIM/*;capture=camera"; ?????????inputEle.style="display:none;"; ?????????inputEle.onchange = function(){ ????????????showPhoto() ????????}; ????????inputEle.multiple = false; ????????document.body.appendChild(inputEle); ?????????????} ???var ?imgFile = document.getElementById("imgFile"); ????imgFile.click(); ?????????????//选中文件后的预览图片 ???function showPhoto(){ ???????//文件对象 ?????????var file = document.getElementById("imgFile").files[0]; ???????????????//读取后辍,判断是否允许的文件 ???????var fileSuffix = file.name.substring(file.name.length-4); ???????var allowFile = ".jpg|.png|.gif"; ???????if(allowFile.indexOf(fileSuffix.toLowerCase())==-1) { ???????????alert("请使用"+allowFile+"后辍的文件"); ???????????return false; ???????} ???????????????//如果传了显示控件的id,显示本地预览 ???????var reader = new FileReader() ???????reader.readAsDataURL(file); ???????reader.onload = function(e){ ????????????var imgBase64Data = e.target.result; ???????????????????????//显示预览 ??????????if("" != ?params.previewImgId) ?document.getElementById(params.previewImgId).src = imgBase64Data; ?????????????????????//如果不压缩直接上传 ???????????//savePhoto(imgBase64Data) ??????????????????????//对图片进行缩小处理,然后再上传 ???????????compressPhoto(imgBase64Data,1000,1000,function(imgBase64DataBack){ ???????????????????????????????????????????????//提交服务保存数据 ???????????????savePhoto(imgBase64DataBack) ???????????}); ?????????????????????} ???????????????????} ???????//提交数据 ???function savePhoto(base64Data){ ???????var formData = new FormData(); ????????????????//加入其它参数 ???????for(var key in params){ ?????????if(key!="previewImgId" && key!="url" && key!="success" ){ ?????????????formData.append(key, params[key]); ?????????} ???????} ???????????????//加入文件参数 ?利用base64 ???????formData.append("imgFile",encodeURIComponent(base64Data)); ???????//加入文件参数 ?file控件上传 , 但这种试就不支持对图片压缩了,所以手机端不采用这种方式 ???????//formData.append(‘imgFile‘, file); ???????????????//ajax上传 ???????$.ajax({ ???????????url:params.url, ???????????type: ‘POST‘, ???????????cache: false, ???????????dataType:"json", ???????????data: formData, ???????????processData: false, ???????????contentType: false ???????}).done(function(res) { ???????????if(params.success!=""){ ???????????????params.success(res); ???????????} ???????}).fail(function(res) { ??????????alert("上传失败"); ???????}); ???}} ??/** * js利用canvas对图像进行压缩处理* @param {string} ???imgBase64Data ????图像base64数据* @param {string} ???maxWidth ?????????最大高度* @param {function} ?maxHeight ????????最大宽度* @param {boolean} ??fun ??????????????回调函数,参数为处理后的图像数据 ?使用示例: ?compressPhoto(imgBase64Data,maxWidth,maxHeight,function(imgBase64Data){ ?????//返回图片数据后的处理 ?})*/function compressPhoto(imgBase64Data,maxWidth,maxHeight,fun){ ???var ?img = new Image(); ???// 缩放图片需要的canvas ???var canvas = document.createElement(‘canvas‘); ???var context = canvas.getContext(‘2d‘); ???// base64地址图片加载完毕后 ???img.onload = function () { ???????// 图片原始尺寸 ???????var originWidth = this.width; ???????var originHeight = this.height; ???????????????????// 目标尺寸 ???????var targetWidth = originWidth, targetHeight = originHeight; ???????// 图片尺寸超过400x400的限制 ???????if (originWidth > maxWidth || originHeight > maxHeight) { ???????????if (originWidth / originHeight > maxWidth / maxHeight) { ???????????????// 更宽,按照宽度限定尺寸 ???????????????targetWidth = maxWidth; ???????????????targetHeight = Math.round(maxWidth * (originHeight / originWidth)); ???????????} else { ???????????????targetHeight = maxHeight; ???????????????targetWidth = Math.round(maxHeight * (originWidth / originHeight)); ???????????} ???????} ???????// canvas对图片进行缩放 ???????canvas.width = targetWidth; ???????canvas.height = targetHeight; ???????// 清除画布 ???????context.clearRect(0, 0, targetWidth, targetHeight); ???????// 图片压缩 ???????context.drawImage(img, 0, 0, targetWidth, targetHeight); ???????var base=canvas.toDataURL("image/jpeg",0.7);//canvas转码为base64 ???????????????????????fun(base);//返回处理 ????}; ???img.src = imgBase64Data;}

使用示例:

<img src="" id="yulan"><div onclick="shangchuan()">上传</div><script type="text/javascript"> function shangchuan(){ ???????jsUploadImage({"diyparam":"1111","diyparam1":"222","previewImgId":"yulan","url":"user.php?act=photosave","success":function(data){ ???????????console.log(data); ???????}}) ??};</script>

来源:jsfun.cn
http://www.jsfun.cn/#codecollect

使用ajax上传图片,支持图片即时浏览,支持js图片压缩后上传给服务器

原文地址:https://www.cnblogs.com/jsfuns/p/8969131.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved