手机端利用JS压缩图片并上传

该博客介绍了一种在手机端使用JavaScript对图片进行压缩,然后通过AJAX上传到服务器的方法。服务器端使用ASP接收并保存图片,同时对图片格式和大小进行了限制。整个过程包括前端图片选择、压缩、上传以及服务器端的接收和保存策略。
摘要由CSDN通过智能技术生成

本人水平有限,如有错误,欢迎指正,谢谢!

思路:

1、手机端选择图片或拍照后,由于体积过大,上传到服务器端后,不仅占用服务器磁盘空间,而且打开速度慢,所以采用前端JS对图片进行压缩后上传。

2、服务器端用ASP进行接收并保存,返回上传后的图片文件名,手机端获取到图片后,利用URL即可打开上传后的图片。

3、可对图片文件格式及大小进行限制。

手机端:

<%@codepage="65001"%> 
<%response.charset="utf-8"%> 
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="initial-scale=1, maximum-scale=1">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<script type="text/javascript" src="js/jquery.min.js"></script>
<script language="javascript">

function right(mainStr,lngLen) {
 if (mainStr.length-lngLen>=0 && mainStr.length>=0 && mainStr.length-lngLen<=mainStr.length) {
 return mainStr.substring(mainStr.length-lngLen,mainStr.length)}
 else{return null}
 }
 var fileext="";
 
window.οnlοad=function(){
    var eleFile = document.querySelector('#jjfxSoft_iconPath');
    // 压缩图片需要的一些元素和对象
    var reader = new FileReader(), 
        img = new Image();
    // 选择的文件对象
    var file = null;
    // 缩放图片需要的canvas
    var canvas = document.createElement('canvas');
    var context = canvas.getContext('2d');
    // base64地址图片加载完毕后
    img.onload = function () {
        debugger
        // 图片原始尺寸
        var originWidth = this.width;
        var originHeight = this.height;
        // 最大尺寸限制
        var maxWidth = 1000, maxHeight = 1000;
        // 目标尺寸
        var targetWidth = originWidth, targetHeight = originHeight;
        // 图片尺寸超过300x300的限制
        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 type = 'image/jpeg';
        //将canvas元素中的图像转变为DataURL
        var dataurl = canvas.toDataURL(type);
        $("#ceshi1").attr("src",dataurl);
        //抽取DataURL中的数据部分,从Base64格式转换为二进制格式
        var bin = atob(dataurl.split(',')[1]);
        //创建空的Uint8Array
        var buffer = new Uint8Array(bin.length);
        //将图像数据逐字节放入Uint8Array中
        for (var i = 0; i < bin.length; i++) {
            buffer[i] = bin.charCodeAt(i);
        }
        //利用Uint8Array创建Blob对象
        var blob = new Blob([buffer.buffer], {type: type});
        var url = window.URL.createObjectURL(blob);
      //  $("#ceshi").attr("src",url);
        //在这里上传blob
        var formData=new FormData();
        formData.append("file",blob,"abc.jpg");
       $.ajax({
        type: 'post',
        url: "SavePhoto.asp?bs="+$("#bs").text()+"&fileext="+fileext, //上传文件的请求路径必须是绝对路劲
         data: formData,
         cache: false,
         processData: false,
         contentType: false,
          }).success(function (data) {
              if(data==-1){
                  alert("对不起,上传资质文件最大为6MB!");
                  return;
              }else{
                  //$("#mpic").attr("src","/Upload/"+data);
                  alert("照片上传成功!");
              }
          }).error(function () {
             alert("照片上传失败");
         });
        };
 

    // 文件base64化,以便获知图片原始尺寸
    reader.onload = function(e) {
        img.src = e.target.result;
    };
    eleFile.addEventListener('change', function (event) {
        file = event.target.files[0];
        
       fileext=right($("#jjfxSoft_iconPath").val(),4).toUpperCase();
       if((fileext!=".JPG")&&(fileext!=".PNG")){
           alert("对不起,文件格式不正确,只能上传JPG或PNG文件!");
           return;
       }        
        
        // 选择的文件是图片
        if (file.type.indexOf("image") == 0) {
            reader.readAsDataURL(file);    
        }
    });
}

  function up(){
      $("#jjfxSoft_iconPath").click();
  }
</script>
<title>物品照片上传</title>
</head>
<body style="list-style:none; color:#666; line-height:35px;">
<span id="bs" style="display:none;"><%=request.querystring("bs")%></span>
<img id="ceshi" style="display:none;">
<div style="width:100%;">
<li style=" width:90%; margin-left:5%;">点击图片上传照片</li>
<img id="ceshi1" src="images/uploadpic.png" style="width:90%; margin-left:5%;" onClick="up();">
<li style="width:90%; margin-left:5%;">文件大小不超过6MB,JPG或PNG格式</li>
</div>
<input name="file" type="file" id="jjfxSoft_iconPath" style="display:none;">
</body>
</html>

服务器接收端:SavePhoto.asp

<%@codepage="65001"%> 
<%response.charset="utf-8"%> 
<%
  Randomize
  
 function GetRndFileName(namelen)
   clist="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
   jg=""
   for i=1 to namelen
     p=INT(62*RND())+1
     jg=jg&mid(clist,p,1)
   next
   GetRndFileName=jg
 end function
 
 fileext=request.querystring("FileExt")
 BS=request.querystring("bs")
 filename="P"&GetRndFileName(10)&fileext

 Dim FormData, FormSize , DataStart , CLStr
 FormSize = Request.TotalBytes 
 FormData = Request.BinaryRead(FormSize)
 set alldata=server.createobject("ADODB.Stream")
 alldata.Type=1
 alldata.open
 
 alldata.Write FormData
 
 dim Binary
 alldata.position=0
 Binary=alldata.Read 
 
 CLStr=ChrB(13)&ChrB(10)
 DataStart=InStrB(Binary,CLStr&CLStr)+4
 DivStr = LeftB(Binary,InStrB(Binary,CLStr)-1)
 DataSize=InStrB(DataStart+1,Binary,DivStr)-DataStart-2 
 
 if fix(DataSize/1024)>6144 then
   alldata.close
   set alldata=nothing
   response.write "-1"
   response.end
 end if
 
 
 set st=Server.CreateObject("ADODB.Stream")
 st.Type=1
 st.Mode=3
 st.open
 alldata.position=DataStart-1
 alldata.copyto st,DataSize
 st.SaveToFile Server.MapPath("/Upload/"&filename),2
 st.close
 set st=nothing
 alldata.close
 set alldata=nothing
 response.write filename
 response.end 

%>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

锋回路转2022

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值