WEB开发网
开发学院WEB开发ASP 用asp获取文件md5值 阅读

用asp获取文件md5值

 2008-09-01 10:37:26 来源:WEB开发网   
核心提示:网上asp加密字符的md5很多,也很普遍,用asp获取文件md5值,但是对文件进行md5的确很少,因为受到asp语言本身的限制,可以应用在2台不同的服务器上面进行数据交互,可广泛应用于各种异构平台,我们知道字符串的md5可以对明文进行不可逆的加密,从而保证数据储存或者传送的安全性

网上asp加密字符的md5很多,也很普遍,但是对文件进行md5的确很少,因为受到asp语言本身的限制。我们知道字符串的md5可以对明文进行不可逆的加密,从而保证数据储存或者传送的安全性。同样的,对文件进行md5加密也是为了保证在网络传送时不被修改和校验,另外还有一个用途就是在个人站点里面的应用:可以保证上传的图片或文件具有唯一性。原理是,上传到服务器之后,同时在数据库中记录该上传文件的md5值,这样在下次传同样文件的时候,可以通过查询数据库是否是相同的文件,md5值相同,我们就认为它是相同的文件,md5值就是文件的“身份证”,其实百度也有这方面的应用,在百度搜索图片,点开图片后,有时候会出现“您还可以点击以下链接查看到这张图片:XXX网址”,原理也是一样,对文件进行md5。
废话少说,开始正文。
一、asp通过xml交互方式调用.Net程序实现文件md5
asp由于本身语言的限制,无法实现文件的md5,但是.net确可以,那是不是可以通过.net对文件进行md5,然后发送信息给asp接收,这样就可以做到asp的md5了呢,答案是肯定的。这里涉及到asp与.net程序间的交互,我以前写过一个asp的类:《asp处理xml数据的发送、接收类》,可以上我的百度空间看:http://hi.baidu.com/manbutianmi/blog/item/dec182fc6db36587b801a0f6.html,讲的是asp处理xml数据的发送与接收,可用于各种异构系统之间API接口间通讯。本文正好是这个类的一个应用。代码如下:

asp端代码

xmlcls.asp
<%
Rem 处理xml数据的发送、接收类
'--------------------------------------------------
'转载的时候必须保留此版权信息
'作者:walkman
'网址:手机主题网:http://www.shouji138.com
'版本:ver1.0
'--------------------------------------------------
Class XmlClass
 
 Rem 变量定义
 PRivate XmlDoc,xmlhttp
 Private MessageCode,SysKey,XmlPath
 Private m_GetXmlDoc,m_url
 Private m_XmlDocAccept

 Rem 初始化
 Private Sub Class_Initialize()
  On Error Resume Next
  MessageCode = ""
  XmlPath = ""
  Set XmlDoc = Server.CreateObject("msxml2.FreeThreadedDOMDocument.3.0")
  XmlDoc.ASYNC = False
 End Sub
 
 Rem 销毁对象
 Private Sub Class_Terminate()
  If IsObject(XmlDoc) Then Set XmlDoc = Nothing
  If IsObject(m_XmlDocAccept) Then Set m_XmlDocAccept = Nothing
  If IsObject(m_GetXmlDoc) Then Set m_GetXmlDoc = Nothing 
 End Sub

 
 '公共属性定义开始--------------------------
 Rem 错误信息
 Public Property Get Message()
  Message = MessageCode
 End Property


 Rem 发送xml的地址
 Public Property Let  URL(str)
  m_url = str
 End Property
 '公共属性定义结束--------------------------

 
 '私有过程、方法开始--------------------------
 Rem 加载xml
 Private  Sub LoadXmlData()
  If XmlPath <> "" Then
  If Not XmlDoc.Load(XmlPath) Then
   XmlDoc.LoadXml "<?xml version=""1.0"" encoding=""gb2312""?><root/>"
  End If
  Else
  XmlDoc.LoadXml "<?xml version=""1.0"" encoding=""gb2312""?><root/>"
  End If
 End Sub

 Rem 字符转化
 Private Function AnsiToUnicode(ByVal str)
  Dim i, j, c, i1, i2, u, fs, f, p
  AnsiToUnicode = ""
  p = ""
  For i = 1 To Len(str)
  c = Mid(str, i, 1)
  j = AscW(c)
  If j < 0 Then
   j = j + 65536
  End If
  If j >= 0 And j <= 128 Then
   If p = "c" Then
   AnsiToUnicode = " " & AnsiToUnicode
   p = "e"
   End If
   AnsiToUnicode = AnsiToUnicode & c
  Else
   If p = "e" Then
   AnsiToUnicode = AnsiToUnicode & " "
   p = "c"
   End If
   AnsiToUnicode = AnsiToUnicode & ("&#" & j & ";")
  End If
  Next
 End Function
 
 Rem 字符转化
 Private Function strAnsi2Unicode(asContents)
  Dim len1,i,varchar,varasc
  strAnsi2Unicode = ""
  len1=LenB(asContents)
  If len1=0 Then Exit Function
   For i=1 to len1
  varchar=MidB(asContents,i,1)
  varasc=AscB(varchar)
  If varasc > 127  Then
   If MidB(asContents,i+1,1)<>"" Then
   strAnsi2Unicode = strAnsi2Unicode & chr(ascw(midb(asContents,i+1,1) & varchar))
   End If
   i=i+1
   Else
   strAnsi2Unicode = strAnsi2Unicode & Chr(varasc)
   End If
  Next
 End Function


 Rem 往文件中追加字符
 Private Sub WriteStringToFile(filename,str)
  On Error Resume Next
  Dim fs,ts
  Set fs= createobject("script_ing.filesystemobject")
  If Not IsObject(fs) Then Exit Sub 
  Set ts=fs.OpenTextFile(Server.MapPath(filename),8,True)
  ts.writeline(str)
  ts.close
  Set ts=Nothing
  Set fs=Nothing
 End Sub
 '私有过程、方法结束--------------------------
 

 '公共方法开始--www.devdao.com------------------------
 
 '''''''''''发送xml部分开始
 Rem 从外部xml文件填充XmlDoc对象
 Public Sub LoadXmlFromFile(path)
  XmlPath =  Server.MapPath(path)
  LoadXmlData()
 End Sub
 
 Rem 用字符串填充XmlDoc对象
 Public Sub LoadXmlFromString(str)
  XmlDoc.LoadXml str
 End Sub
 
 Rem  设置node的参数 如 NodeValue "appID",AppID,1,False
 '--------------------------------------------------
 '参数 :
 'NodeName 节点名
 'NodeText 值
 'NodeType 保存类型 [text=0,cdata=1]
 'blnEncode 是否编码 [true,false]
 '--------------------------------------------------
 Public Sub NodeValue(Byval NodeName,Byval NodeText,Byval NodeType ,Byval blnEncode)
  Dim ChildNode,CreateCDATASection
  NodeName = Lcase(NodeName)
  If XmlDoc.documentElement.selectSingleNode(NodeName) is nothing Then
  Set ChildNode = XmlDoc.documentElement.appendChild(XmlDoc.createNode(1,NodeName,""))
  Else
  Set ChildNode = XmlDoc.documentElement.selectSingleNode(NodeName)
  End If
  If blnEncode = True Then
  NodeText = AnsiToUnicode(NodeText)
  End If
  If NodeType = 1 Then
  ChildNode.Text = ""
  Set CreateCDATASection = XmlDoc.createCDATASection(Replace(NodeText,"]]>","]]>"))
  ChildNode.appendChild(createCDATASection)
  Else
  ChildNode.Text = NodeText
  End If
 End Sub


 '--------------------------------------------------
 '获取发送包XML中节点的值
 '参数 :
 'Str 节点名
 '--------------------------------------------------
 Public Property Get XmlNode(Byval Str)
  If XmlDoc.documentElement.selectSingleNode(Str) is Nothing Then
  XmlNode = "Null"
  Else
  XmlNode = XmlDoc.documentElement.selectSingleNode(Str).text
  End If
 End Property

 '--------------------------------------------------
 '获取返回XML数据对象
 '例:
 '当GetXmlData不为NULL时,GetXmlData为XML对象
 '--------------------------------------------------
 Public Property Get GetXmlData()
  Set GetXmlData = m_GetXmlDoc
 End Property


 '--------------------------------------------------
 '发送xml包
 '--------------------------------------------------
 Public Sub SendHttpData()
  Dim i,GetXmlDoc,LoadAppid
  Set Xmlhttp = Server.CreateObject("MSXML2.ServerXMLHTTP.3.0")
  Set GetXmlDoc = Server.CreateObject("msxml2.FreeThreadedDOMDocument.3.0") ' 返回xml包
  XmlHttp.Open "POST", m_url, false
  XmlHttp.SetRequestHeader "content-type", "text/xml"
  XmlHttp.Send XmlDoc
  'Response.Write strAnsi2Unicode(xmlhttp.responseBody)
  If GetXmlDoc.load(XmlHttp.responseXML) Then
   Set m_GetXmlDoc = GetXmlDoc
  Else
   MessageCode = "请求数据错误!"
   Exit Sub
  End If
  Set GetXmlDoc = Nothing
  Set XmlHttp = Nothing
 End Sub
 
 
 

 '--------------------------------------------------
 '打印发送请求XML数据
 '--------------------------------------------------
 Public Sub PrintSendXmlData()
  Response.Clear
  Response.ContentType = "text/xml"
  Response.CharSet = "gb2312"
  Response.Expires = 0
  Response.Write "<?xml version=""1.0"" encoding=""gb2312""?>"&vbNewLine
  Response.Write XmlDoc.documentElement.XML
 End Sub
 
 '--------------------------------------------------
 '打印返回XML数据
 '--------------------------------------------------
 Public Sub PrintGetXmlData()
 
  Response.Clear
  Response.ContentType = "text/xml"
  Response.CharSet = "gb2312"
  Response.Expires = 0
  If IsObject(m_GetXmlDoc) Then
  Response.Write "<?xml version=""1.0"" encoding=""gb2312""?>"&vbNewLine
  Response.Write m_GetXmlDoc.documentElement.XML
  Else
  Response.Write "<?xml version=""1.0"" encoding=""gb2312""?><root></root>"
  End If
 End Sub


 Rem  保存发送请求xml数据到文件,文件名为sendxml_日期.txt
 Public Sub SaveSendXmlDataToFile()
  Dim filename,str
  filename = "sendxml_" & DateValue(now) & ".txt"
  str = ""
  str = str & ""& Now() & vbNewLine
  str = str & "---------------------------------------------"& vbNewLine
  str = str &  "<?xml version=""1.0"" encoding=""gb2312""?>" & vbNewLine
  str = str &  XmlDoc.documentElement.XML & vbNewLine
  str = str & "---------------------------------------------"& vbNewLine
  str = str &  vbNewLine & vbNewLine & vbNewLine
  WriteStringToFile filename,str
 End Sub
 


 Rem  保存返回XML数据到文件,文件名为getxml_日期.txt
 Public Sub SaveGetXmlDataToFile()
  Dim filename,str
  filename = "getxml_" & DateValue(now) & ".txt"
  str = ""
  str = str & ""& Now() & vbNewLine
  str = str & "---------------------------------------------"& vbNewLine
  If IsObject(m_GetXmlDoc) Then
  str = str & "<?xml version=""1.0"" encoding=""gb2312""?>" & vbNewLine
  str = str & m_GetXmlDoc.documentElement.XML
  Else
  str = str & "<?xml version=""1.0"" encoding=""gb2312""?>" & vbNewLine & "<root>" & vbNewLine & "</root>"
  End If
  str = str & vbNewLine
  str = str & "---------------------------------------------"& vbNewLine
  str = str &  vbNewLine & vbNewLine & vbNewLine
  WriteStringToFile filename,str
 End Sub

 
 
 '--------------------------------------------------
 '获取返回xml的节点信息
 'XmlClassObj.GetSingleNode("//msg")
 '--------------------------------------------------
 Public Function GetSingleNode(nodestring)
  If IsObject(m_GetXmlDoc) Then
  GetSingleNode = m_GetXmlDoc.documentElement.selectSingleNode(nodestring).text
  Else
  GetSingleNode = ""
  End If
 End Function
 ''''''''''''''''''发送xml部分结束
 
 


 ''''''''''''''''''接收xml部分开始
 '--------------------------------------------------
 '接收XML包,错误信息通过Message对象获取
 '--------------------------------------------------
 Public Function AcceptHttpData()
  Dim XMLdom
  Set XMLdom = Server.CreateObject("Microsoft.XMLDOM")
  XMLdom.Async = False
  XMLdom.Load(Request)
  If XMLdom.parseError.errorCode <> 0 Then
  MessageCode =  "不能正确接收数据" & "Descript_ion: " & XMLdom.parseError.reason & "<br>Line: " & XMLdom.parseError.Line
  Set m_XmlDocAccept = Null
  Else
  Set m_XmlDocAccept = XMLdom
  End If
 End Function

 '--------------------------------------------------
 '返回接收XML包节点信息
 'XmlClassObj.GetSingleNode("//msg")
 '--------------------------------------------------
 Public Function AcceptSingleNode(nodestring)
  If IsObject(m_XmlDocAccept) Then
  AcceptSingleNode = m_XmlDocAccept.documentElement.selectSingleNode(nodestring).text
  Else
  AcceptSingleNode = ""
  End If
 End Function

 
 '--------------------------------------------------
 '打印接收端接收到的XML数据
 '--------------------------------------------------
 Public Sub PrintAcceptXmlData()
  Response.Clear
  Response.ContentType = "text/xml"
  Response.CharSet = "gb2312"
  Response.Expires = 0
  If IsObject(m_XmlDocAccept) Then
  Response.Write "<?xml version=""1.0"" encoding=""gb2312""?>"&vbNewLine
  Response.Write m_XmlDocAccept.documentElement.XML
  Else
  Response.Write "<?xml version=""1.0"" encoding=""gb2312""?><root></root>"
  End If
 End Sub


 Rem  保存接收的XML包数据到文件,文件名为acceptxml_日期.txt
 Public Sub SaveAcceptXmlDataToFile()
  Dim filename,str
  filename = "acceptxml_" & DateValue(now) & ".txt"
  str = ""
  str = str & ""& Now() & vbNewLine
  str = str & "---------------------------------------------"& vbNewLine
  If IsObject(m_XmlDocAccept) Then
  str = str & "<?xml version=""1.0"" encoding=""gb2312""?>" & vbNewLine
  str = str & m_XmlDocAccept.documentElement.XML
  Else
  str = str & "<?xml version=""1.0"" encoding=""gb2312""?>" & vbNewLine & "<root>" & vbNewLine & "</root>"
  End If
  str = str & vbNewLine
  str = str & "---------------------------------------------"& vbNewLine
  str = str &  vbNewLine & vbNewLine & vbNewLine
  WriteStringToFile filename,str
 End Sub
 
 ''''''''''''''''''接收xml部分结束

 Rem  保存调试数据到文件,文件名为debugnote_日期.txt
 Public Sub SaveDebugStringToFile(debugstr)
  Dim filename,str
  filename = "debugnote_" & DateValue(now) & ".txt"
  str = ""
  str = str & ""& Now() & vbNewLine
  str = str & "---------------------------------------------"& vbNewLine
  str = str & debugstr  & vbNewLine
  str = str & "---------------------------------------------"
  str = str &  vbNewLine & vbNewLine & vbNewLine
  WriteStringToFile filename,str
 End Sub

 '公共方法结束--------------------------
 
End Class
%>

filemd5fun.asp

<!--#Include File="xmlcls.asp"-->
<%
Rem  取得文件的md5,参数为文件名
Function GetFileMD5(filename)
 Const Apisysno = "k8n6g2b0m1a6b0f6e8" '接口的Key值,防止被非法适用 接口应该保持一致
 Dim XmlClassObj
 Set XmlClassObj  = new XmlClass '创建对象
 XmlClassObj.LoadXmlFromString("<?xml version=""1.0"" encoding=""gb2312""?><root/>") '用xml字符填充XMLDOC对象,用来发送xml
 XmlClassObj.URL = "http://www.shouji138.com/aspnet2/FileMD5.aspx" '设置响应的url,这里应该改成你的网址


 Rem xml格式
 Rem "<?xml version="1.0" encoding="gb2312"?>
 Rem   <root>
 Rem    <sysno></sysno>
 Rem    <apiaction></apiaction>
 Rem     <filename></filename>
 Rem  </root>
 

 XmlClassObj.NodeValue "sysno",Apisysno,0,False   '接口的Key值,防止被非法适用
 XmlClassObj.NodeValue "apiaction","createfilemd5",0,False  '接口的响应动作,用于定义一个接口用于多种用途
 XmlClassObj.NodeValue "filename",filename,0,False   '文件路径和文件名,用相对路径

 'XmlClassObj.SaveSendXmlDataToFile()    '将发送的xml数据库包存入txt文件,用于调试之用 
 XmlClassObj.SendHttpData()     '发送xml数据
 'XmlClassObj.SaveGetXmlDataToFile()    '保存接收到的xml数据
 

 Rem  处理结果

 Dim message,status
 status =  XmlClassObj.GetSingleNode("//status")  '显示状态,如果为OK则表示成功,否则有错误发生
 message =  XmlClassObj.GetSingleNode("//message")  '显示取到的MD5值,如果status不为OK,则message为错误信息
 Set XmlClassObj = Nothing

 If status = "OK" Then
  GetFileMD5 = message
 Else
  GetFileMD5 = ""
 End If 
End Function

%>

test.asp
<!--#Include File="filemd5fun.asp"-->

<% 
 Response.Write "web.config的md5值是:" & GetFileMD5("web.config")  & "<br />"
 Response.Write "files/logo-yy.gif的md5值是:" & GetFileMD5("files/logo-yy.gif") & "<br />"
 Response.Write "xmlcls.asp的md5值是:" & GetFileMD5("xmlcls.asp") & "<br />"
%>


.net端代码:
MD5.cs
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

namespace Winsteps.FileMD5
{
   public class MD5
   {
     public static string md5_hash(string path)
     {
       try
       {
         FileStream get_file = new FileStream(path, FileMode.Open, Fileaccess.Read, FileShare.Read);
         System.Security.Cryptography.MD5CryptoServiceProvider get_md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
         byte[] hash_byte = get_md5.ComputeHash(get_file);
         string resule = System.BitConverter.ToString(hash_byte);
         resule = resule.Replace("-", "");
         return resule;
       }
       catch (Exception e)
       {
         return e.Message;
       }
     }
   }
}

FileMD5.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="FileMD5.aspx.cs" Inherits="Winsteps.FileMD5.FileMD5" %>
<!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 runat="server">
   <title>手机主题网:http://www.shouji138.com</title>
</head>
<body>
   <form id="form1" runat="server">
   <div>
  
   </div>
   </form>
</body>
</html>

FileMD5.aspx.cs

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

using System.Xml;
using System.Configuration;

namespace Winsteps.FileMD5
{
   public partial class FileMD5 : System.Web.UI.Page
   {
     protected void Page_Load(object sender, EventArgs e)
     {
       string sysno = "11111";
       string status = "False";
       string message = "未指定的错误";
       string net2sysno = ConfigurationManager.AppSettings["sysno"];
       XmlDocument doc = new XmlDocument();
       try
       {
        
         doc.Load(Request.InputStream);
         sysno = doc.SelectSingleNode("//sysno").InnerText.Trim();
         if (net2sysno != sysno)
         {
           message = "非法适用!";
         }
         else
         {
           string filename = Server.MapPath(doc.SelectSingleNode("//filename").InnerText.Trim());
           message = MD5.md5_hash(filename);
           status = "OK";
         }

     }
       catch(Exception ex)
       {
         message = ex.Message;
       }
       finally
       {
         if (doc != null)
           doc = null;
       }
       Response.Clear();  //清楚html字符
       Response.ContentType = "text/xml";
       Response.Charset = "GB2312";//如果xml字符串中包含中文
       Response.Write("<?xml version=\"1.0\" encoding=\"GB2312\"?>");
       Response.Write("<root>");
       Response.Write("  <status>" + status + "</status>");
       Response.Write("  <message>" + message + "</message>");
       Response.Write("</root>");
       Response.End();

   }
   }
}


Web.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <appSettings>
   <add key="sysno" value="k8n6g2b0m1a6b0f6e8"></add>
  </appSettings>
  <system.web>
   <httpRuntime executionTimeout="3600" maxRequestLength="1048576"/>
   <compilation debug="true" defaultLanguage="c#" />
   <customErrors mode="Off" />
   <identity impersonate="true"/>
   <authentication mode="Forms">
    <forms name="forums" path="/" loginUrl="Login.aspx" protection="All" timeout="40">
    </forms>
   </authentication>
   <pages validateRequest="false"></pages>
   <globalization requestEncoding="gb2312" responseEncoding="gb2312" culture="zh-CN" uiCulture="zh-CN"/>
  </system.web>
</configuration>


web.config的sysno要跟filemd5fun.asp里面的Apisysno保持一致,具体应用时应该要把这个key改成你自己的值来保证安全。
演示地址:http://www.shouji138.com/aspnet2/filemd5.asp
代码虽然长,但是原理简单,asp发送xml数据给asp.net(xml中包含了要md5的文件名)->asp.net接收xml对文件进行md5->asp.net将结果通过xml返回给asp(xml中包含了获取到的md5值)->asp获取返回的xml,解析出md5值。
应用范围:
1. 在两个系统之间传送文件时,可以在传送前进行文件md5,传送后进行文件md5,检查两值是否相等,如果相等则表示在传送过程中没有被修改。
2. 做上传系统中,如果要求不能上传同文件的话,可以在上传之后的文件进行md5存入数据库中,这样下次上传同样文件,则md5会相同,拒绝上传。
3. 在搜索引擎、迅雷本b2b软件中,对文件md5,具有相同md5的文件被认为是相同文件,而不管文件名是否相同,可以从多个源来分享文件。
4. 其他应用。。。。。


二、asp通过COM组件实现md5(需要在服务器上注册组件)

注册一个asp的文件md5组件,下载地址:http://www.shouji138.com/aspnet2/files/aspmd5.rar

然后将PARmf.dll文件拷贝到服务器的c:\WINDOWS\system32目录,运行regsvr32 parmf.dll进行注册,重启IIS。

调用代码:
<%
Set DelphiASPObj = Server.CreateObject("PARmf.md5file")
  DelphiASPObj.in_path=Server.Mappath("Web.config")    '文件路径
  Response.Write "web.config的md5值是:" & DelphiASPObj.get_path_md5  & "<br />"
  Set DelphiASPObj=nothing
%>

三、两种方式获取文件md5的对比

第一种方法通过与asp.net程序交互xml数据来得到文件的md5,需要服务器支持asp.net,一般的虚拟主机都提供asp.net环境,但是价格高点;
第二种方法通过注册COM组件实现,需要有服务器的权限,对于拥有服务器的比较合适。
另外第一种方式的这种交互方法使得asp具有更大的灵活性,可以应用在2台不同的服务器上面进行数据交互,可广泛应用于各种异构平台。

 
四、下载地址
请到偶的小站,手机主题网查看演示和下载程序包
演示地址:http://www.shouji138.com/aspnet2/filemd5.asp
程序下载打包下载:http://www.shouji138.com/aspnet2/files/FileMD5.rar
asp的文件md5组件:http://www.shouji138.com/aspnet2/files/aspmd5.rar

Tags:asp 获取 文件

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接