本人水平有限,如有错误,欢迎指正,谢谢!
思路:
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
%>