帝国软件
  设为首页 加入收藏 关于我们
 
解密帝国网站管理系统
栏 目:
 
您的位置:首页 > 技术文档 > ASP编程
支持中文的无组件文件上传:upload.inc
作者: 发布时间:2005-03-12 来源:
文件名:upload.inc
说明:支持中文的无组件文件上传ASP函数,由于ASP不支持二进制写入文件,所以存成文件时必须使用组件,本函数只提供截取上传文件的数据,可以写入到数据库。

<SCRIPT RUNAT=SERVER LANGUAGE=VBSCRIPT>
Function GetUpload(FormData)
    Dim DataStart,DivStr,DivLen,DataSize,FormFieldData
    '分隔标志串(+CRLF)
    DivStr = LeftB(FormData,InStrB(FormData,str2bin(VbCrLf)) + 1)
    '分隔标志串长度
    DivLen = LenB(DivStr)
    PosOpenBoundary = InStrB(FormData,DivStr)
    PosCloseBoundary = InStrB(PosOpenBoundary + 1,FormData,DivStr)
    Set Fields = CreateObject("Scripting.Dictionary")
   
    While PosOpenBoundary > 0 And PosCloseBoundary > 0
       'name起始位置(name="xxxxx"),加6是因为[name="]长度为6
       FieldNameStart = InStrB(PosOpenBoundary,FormData,str2bin("name=")) + 6
       FieldNameSize = InStrB(FieldNameStart,FormData,ChrB(34)) - FieldNameStart '(")的ASC值=34
       FormFieldName = bin2str(MidB(FormData,FieldNameStart,FieldNameSize))
       
       'filename起始位置(filename="xxxxx")
       FieldFileNameStart = InStrB(PosOpenBoundary,FormData,str2bin("filename=")) + 10
       If FieldFileNameStart < PosCloseBoundary And FieldFileNameStart > PosopenBoundary Then
          FieldFileNameSize = InStrB(FieldFileNameStart,FormData,ChrB(34)) - FieldFileNameStart '(")的ASC值=34
          FormFileName = bin2str(MidB(FormData,FieldFileNameStart,FieldFileNameSize))
       Else
          FormFileName = ""
       End If
       
       'Content-Type起始位置(Content-Type: xxxxx)
       FieldFileCTStart = InStrB(PosOpenBoundary,FormData,str2bin("Content-Type:")) + 14
       If FieldFileCTStart < PosCloseBoundary  And FieldFileCTStart > PosOpenBoundary Then
          FieldFileCTSize = InStrB(FieldFileCTStart,FormData,str2bin(VbCrLf & VbCrLf)) - FieldFileCTStart
          FormFileCT = bin2str(MidB(FormData,FieldFileCTStart,FieldFileCTSize))
       Else
          FormFileCT = ""
       End If
       
       '数据起始位置:2个CRLF开始
       DataStart = InStrB(PosOpenBoundary,FormData,str2bin(VbCrLf & VbCrLf)) + 4
       If FormFileName <> "" Then
          '数据长度,减1是因为数据文件的存取字节数问题(可能是AppendChunk方法的问题):
          '由于字节数为奇数的图象存到数据库时会去掉最后一个字符导致图象不能正确显示,
          '字节数为偶数的数据文件就不会出现这个问题,因此必须保持字节数为偶数。
          DataSize = InStrB(DataStart,FormData,DivStr) - DataStart - 1
          FormFieldData = MidB(FormData,DataStart,DataSize)
       Else
          '数据长度,减2是因为分隔标志串前有一个CRLF
          DataSize = InStrB(DataStart,FormData,DivStr) - DataStart - 2
          FormFieldData = bin2str(MidB(FormData,DataStart,DataSize))
       End If

       '建立一个Dictionary集存储Form中各个Field的相关数据
       Set Field = CreateUploadField()
       Field.Name = FormFieldName
       Field.FilePath = FormFileName
       Field.FileName = GetFileName(FormFileName)
       Field.ContentType = FormFileCT
       Field.Length = LenB(FormFieldData)
       Field.Value = FormFieldData
       
       Fields.Add FormFieldName, Field
       
       PosOpenBoundary = PosCloseBoundary
       PosCloseBoundary = InStrB(PosOpenBoundary + 1,FormData,DivStr)
    Wend
    Set GetUpload = Fields
End Function

'把二进制字符串转换成普通字符串函数
Function bin2str(binstr)
   Dim varlen,clow,ccc,skipflag
   '中文字符Skip标志
   skipflag=0
   ccc = ""
   If Not IsNull(binstr) Then
      varlen=LenB(binstr)
      For i=1 To varlen
          If skipflag=0 Then
             clow = MidB(binstr,i,1)
             '判断是否中文的字符
             If AscB(clow) > 127 Then
                'AscW会把二进制的中文双字节字符高位和低位反转,所以要先把中文的高低位反转
                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
   End If
   bin2str = ccc
End Function


'把普通字符串转成二进制字符串函数
Function str2bin(varstr)
   str2bin=""
   For i=1 To Len(varstr)
       varchar=mid(varstr,i,1)
       varasc = Asc(varchar)
       ' asc对中文字符求出来的值可能为负数,
       ' 加上65536就可求出它的无符号数值
       ' -1在机器内是用补码表示的0xffff,
       ' 其无符号值为65535,65535=-1+65536
       ' 其他负数依次类推。
       If varasc<0 Then
          varasc = varasc + 65535
       End If
       '对中文的处理:把双字节低位和高位分开
       If varasc>255 Then
          varlow = Left(Hex(Asc(varchar)),2)
          varhigh = right(Hex(Asc(varchar)),2)
          str2bin = str2bin & chrB("&H" & varlow) & chrB("&H" & varhigh)
       Else
          str2bin = str2bin & chrB(AscB(varchar))
       End If
   Next
End Function

'取得文件名(去掉Path)
Function GetFileName(FullPath)
   If FullPath <> "" Then
      FullPath = StrReverse(FullPath)
      FullPath = Left(FullPath, InStr(1, FullPath, "") - 1)
      GetFileName = StrReverse(FullPath)
   Else
      GetFileName = ""
   End If
End Function
</SCRIPT>
<SCRIPT RUNAT=SERVER LANGUAGE=JSCRIPT>
function CreateUploadField(){ return new uf_Init() }
function uf_Init(){
  this.Name = null
  this.FileName = null
  this.FilePath = null
  this.ContentType = null
  this.Value = null
  this.Length = null
}
</SCRIPT> 
  
评论】【加入收藏夹】【 】【打印】【关闭
※ 相关链接
 ·支持中文的无组件文件上传:示例  (2005-03-12)
 ·列出 IE5 所支持的所有server端变  (2005-03-12)
 ·ASP程序界面的多语言支持  (2005-03-12)
 ·判断客户端是否支持cookie的脚本  (2005-03-12)
 ·检测个人主页站点是否支持组件的  (2005-03-12)
 ·让您的主页支持各种浏览设备(AS  (2005-03-12)
 ·让您的主页支持各种浏览设备(AS  (2005-03-12)
 ·让您的主页支持各种浏览设备(AS  (2005-03-12)
 ·如何使ASP输出结果不支持html语法  (2005-03-12)
 ·判断访问者的浏览器是否支持Java  (2005-03-12)

   栏目导行
  PHP编程
  ASP编程
  ASP.NET编程
  JAVA编程
   站点最新
·致合作伙伴的欢迎信
·媒体报道
·帝国软件合作伙伴计划协议
·DiscuzX2.5会员整合通行证发布
·帝国CMS 7.0版本功能建议收集
·帝国网站管理系统2012年授权购买说
·PHPWind8.7会员整合通行证发布
·[官方插件]帝国CMS-访问统计插件
·[官方插件]帝国CMS-sitemap插件
·[官方插件]帝国CMS内容页评论AJAX分
   类别最新
·在ASP中使用数据库
·使用ASP脚本技术
·通过启动脚本来感受ASP的力量
·学习使用ASP对象和组件
·解析asp的脚本语言
·初看ASP-针对初学者
·ASP开发10条经验总结
·ASP之对象总结
·ASP与数据库应用(给初学者)
·关于学习ASP和编程的28个观点
 
关于帝国 | 广告服务 | 联系我们 | 程序开发 | 网站地图 | 留言板 帝国网站管理系统