ASP 抓取 enctype="multipart/form-data" 编码过的数据

上传文件uploadImage.asp代码:

<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
<script type="text/javascript">
/*
三个参数
file:一个是文件(类型是图片格式),
w:一个是文件压缩的后宽度,宽度越小,字节越小
objDiv:一个是容器或者回调函数
photoCompress() */
function photoCompress(file,w){
var ready=new FileReader();
//console.log(ready);
  /*开始读取指定的Blob对象或File对象中的内容. 当读取操作完成时,readyState属性的值会成为DONE,如果设置了onloadend事件处理程序,则调用之.同时,result属性中将包含一个data: URL格式的字符串以表示所读取文件的内容.*/
/*	readAsDataURL 方法会读取指定的 Blob 或 File 对象。读取操作完成的时候,readyState 会变成已完成DONE,并触发 loadend 事件,同时 result 属性将包含一个data:URL格式的字符串(base64编码)以表示所读取文件的内容。*/
ready.readAsDataURL(file);
ready.onload=function(){
var re=this.result;
canvasDataURL(re, w);
}
}
function canvasDataURL(path, obj){
var img = new Image();
img.src = path;
img.onload = function(){
var that = this;
// 默认按比例压缩
var w = that.width,
h = that.height,
scale = w / h;
w = obj.width || w;
h = obj.height || (w / scale);
var quality = 0.7;  // 默认图片质量为0.7
//生成canvas
var canvas = document.createElement('canvas');
var ctx = canvas.getContext('2d');
 // 创建属性节点
var anw = document.createAttribute("width");
anw.nodeValue = w;
var anh = document.createAttribute("height");
anh.nodeValue = h;
canvas.setAttributeNode(anw);
canvas.setAttributeNode(anh);
ctx.drawImage(that, 0, 0, w, h);//把大图片画在一张小画布上,压缩就这么实现了
// 图像质量
if(obj.quality && obj.quality <= 1 && obj.quality > 0){
quality = obj.quality;
 }
 // quality值越小,所绘制出的图像越模糊
 var base64 = canvas.toDataURL('image/jpeg', quality);
var bl = convertBase64UrlToBlob(base64);
var form = new FormData(); // FormData 对象
//使用append()方法时,可以通过第三个可选参数设置发送请求的头 Content-Disposition 指定文件名。如果不指定文件名(或者不支持该参数时),将使用名字“blob”。
form.append('name','xiaohong');
form.append('hh', bl);
form.append('class','835');
xhr = new XMLHttpRequest();  // XMLHttpRequest 对象
xhr.responseType = 'arraybuffer';	//用于输出二进制流,如果是文本,则不需要设置
xhr.open("post", "acceptImage.asp", true); //post方式,url为服务器请求地址,true 该参数规定请求是否异步处理。
xhr.onload = function()
{
if(xhr.readyState==4)
{
if(xhr.status==200)
{
var uInt8Array = new Uint8Array(this.response);
var i = uInt8Array.length;
var binaryString = new Array(i);
while (i--)
 {
 binaryString[i] = String.fromCharCode(uInt8Array[i]);
 }
var data = binaryString.join('');
 var base64 = window.btoa(data);
document.getElementById("result3").innerHTML='<img src = "data:image/jpg;base64,'+ base64 + '" style="width: 80%; height: 75%"/>';
}
else
{
alert("超时");
}
}
}
xhr.onerror =  uploadFailed; //请求失败
xhr.send(form); //开始上传,发送form数据
}
}
function convertBase64UrlToBlob(urlData){
var arr = urlData.split(','), mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
while(n--){
 u8arr[n] = bstr.charCodeAt(n);
}
return new Blob([u8arr], {type:mime});
}
//上传文件方法
function UpladFile() {
var fileObj = document.getElementById("file").files[0]; // js 获取文件对象
photoCompress(fileObj, {quality: 0.2});
 }
//上传成功响应
function uploadComplete(evt) {
 //服务断接收完文件返回的结果
var data = JSON.parse(evt.responseText);
 if(data.success) {
alert("上传成功!");
}else{
alert("上传失败!");
}
}
//上传失败
function uploadFailed(evt) {
 alert("上传失败!");
}
</script>
    
</head>

<body>

<input type="file" id="file" name="myfile" accept="image/x-png, image/jpg, image/jpeg, image/gif"/>
<input type="button" onclick="UpladFile()" value="上传" />


<div id="result"  ></div>
<div id="result2"  ></div>
<div id="result3"  ></div>
<!--
<img src="" id="myImage" style="width: 80%; height: 75%" />
-->
</body>
</html>

接收图片文件acceptImage.asp代码:

<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>


<%
Dim FormData, FormSize, Divider, bCrLf   
FormSize = Request.TotalBytes   
FormData = Request.BinaryRead(FormSize)   
bCrLf = ChrB(13) & ChrB(10)   
Divider = LeftB(FormData, InStrB(FormData, bCrLf) - 1)   
'asp有个函数是instr,而instrb和这个函数相似 instrb判断第二个字符串是否包含在第一个字符串中,如果存在则返回第二个字符串在第一个中的位置。 'instrb([开始位置],第一个字符串,第二个字符串,[对比方式]) 和instr一样,只是如果对比方式省略,则表示采用二进制的方式比较。 '对比方式参数有二进制的方式与文字且区分大小写的方式比较,其所表示的值分别为0与1。
Function GetFormFile(FormName)   
     StartPos = LenB(Divider) + 2   
     FormName = Chr(34) & FormName & Chr(34)   
    Do While StartPos > 0   
         strlen = InStrB(StartPos, FormData, bCrLf) - StartPos   
         SearchStr = MidB(FormData, StartPos, strlen)   
        If InStr(bin2str(SearchStr), FormName) > 0 Then  
             ValStart = InStrB(StartPos, FormData, bCrLf & bCrLf) + 4   
             ValLen = InStrB(StartPos, FormData, Divider) - 2 - ValStart   
             ValContent = MidB(FormData, ValStart, ValLen)   

              GetFormFile = ValContent 
        End If  
        If InStrB(StartPos, FormData, Divider) < 1 Then  
            Exit Do  
        End If  
         StartPos = InStrB(StartPos, FormData, Divider) + LenB(Divider) + 2   
    Loop  
End Function  
  
Function GetFormVal(FormName)   
     GetFormVal = ""  
     StartPos = LenB(Divider) + 2   
     FormName = Chr(34) & FormName & Chr(34)   
    Do While StartPos > 0   
         strlen = InStrB(StartPos, FormData, bCrLf) - StartPos   
         SearchStr = MidB(FormData, StartPos, strlen)   
        If InStr(bin2str(SearchStr), FormName) > 0 Then  
             ValStart = InStrB(StartPos, FormData, bCrLf & bCrLf) + 4   
             ValLen = InStrB(StartPos, FormData, Divider) - 2 - ValStart   
             ValContent = MidB(FormData, ValStart, ValLen)   
            If GetFormVal <> "" Then  
                 GetFormVal = GetFormVal & "," & bin2str(ValContent)   
            Else  
                 GetFormVal = bin2str(ValContent)   
            End If  
        End If  
        If InStrB(StartPos, FormData, Divider) < 1 Then  
            Exit Do  
        End If  
         StartPos = InStrB(StartPos, FormData, Divider) + LenB(Divider) + 2   
    Loop  
End Function  
  
Function bin2str(binstr)   
    Dim varlen, clow, ccc, skipflag   
     skipflag = 0   
     ccc = ""  
     varlen = LenB(binstr)   
    For i = 1 To varlen   
        If skipflag = 0 Then  
             clow = MidB(binstr, i, 1)   
            If AscB(clow) > 127 Then  
                 ccc = ccc & Chr(AscW(MidB(binstr, i + 1, 1) & clow))   
                 skipflag = 1   
            Else  
                 ccc = ccc & Chr(AscB(clow))   
            End If  
        Else  
             skipflag = 0   
        End If  
    Next  
     bin2str = ccc   
End Function  
  
Function str2bin(str)   
    For i = 1 To Len(str)   
         str2bin = str2bin & ChrB(Asc(Mid(str, i, 1)))   
    Next  
End Function  
%>


<%
ss = GetFormFile("hh") 
response.BinaryWrite(ss)

%> 


参考链接:http://www.360doc.com/content/10/1102/22/4222766_65902834.shtml

https://blog.csdn.net/weixin_34378969/article/details/91455988?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值