cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.IO;
using System.Security.Cryptography;
using System.Text;
namespace WebApplication1.handle
{
/// <summary>
/// serverDownLoad 的摘要说明
/// </summary>
public class serverDownLoad : IHttpHandler
{ public void ProcessRequest(HttpContext context)
{ string id = context.Request.Params["Id"].ToString();
string name = context.Request.Params["name"].ToString();
Console.WriteLine(id);
Console.WriteLine(name);
using (FileStream fsRead = new FileStream(@"D:\1.xlsx", FileMode.Open))
{
//文件读入byte数组中
int fsLen = (int)fsRead.Length;
byte[] heByte = new byte[fsLen];
int r = fsRead.Read(heByte, , heByte.Length); //byte数组生成文件的MD5码
{
MD5 md5 = new MD5CryptoServiceProvider();
byte[] retVal = md5.ComputeHash(heByte);
StringBuilder sb = new StringBuilder();
for (int i = ; i < retVal.Length; i++)
{
sb.Append(retVal[i].ToString("x2"));
}
string fileMD5 = sb.ToString(); } fsRead.Close();//此代码是用using来定义的FileStream,所以可以忽略此行代码 //文件下载
context.Response.Buffer = true;
context.Response.Clear();
context.Response.ContentType = "application/octet-stream";
         //fileName = HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8);文件名是中文时就用这个防止乱码
context.Response.AddHeader("content-disposition", "attachment;filename=1.xlsx");
context.Response.BinaryWrite(heByte);
context.Response.Flush();
context.Response.End();
}
} public bool IsReusable
{
get
{
return false;
}
}
}
}

用using定义的FileStream会在using代码段执行结束之后执行FileStream的Dispose方法释放资源,而FileStream的Close方法也是调用Dispose释放资源,所以不用再次写Close方法

用using定义的类的对象需要类实现IDisposable接口,此接口提供了Dispose 方法,

PS:SqlConnection 的Close方法是指关闭连接,没有调用Dispose方法销毁对象,所以还可以通过Open方法来重新连接,但是使用using定义的时候或者自己调用Dispose方法的时候会销毁对象

其中sb.Append(retVal[i].ToString("x2"))的“x2”是一个string.Format,用来将转换成的字符串格式化的,“x2”是转换成16进制的字符串,而且每次都是两位

例如两个数10和26,正常情况十六进制显示0xA、0x1A,这样看起来不整齐,为了好看,我们可以指定X2,这样显示出来就是:0x0A、0x1A。

其他格式请看http://www.cnblogs.com/fuhai/p/5123593.html

使用的时候直接在a标签的href中指向该ashx就可以了,也可以用javascript来实现,href后面添加?ParamsName1=ParamsValue1&ParamsName2=ParamsValue2来实现传参

 window.location.href = "handle/serverDownLoad.ashx/DownLoad?Id=123&name=fuhai";

获取参数的时候用context.Request.Params[ParamsName]获取

当读取txt文件的时候可以将文件转换成字符串(目前测试只有txt文件有效)

                 //byte数组转换成字符串,读取txt文件时有效
heByte = System.Text.Encoding.Convert(System.Text.Encoding.GetEncoding("gb2312"), System.Text.Encoding.UTF8, heByte);
string myStr = System.Text.Encoding.UTF8.GetString(heByte);
string myStr1 = System.Text.Encoding.Unicode.GetString(heByte);
Console.WriteLine(myStr);

MD5码是同来识别相同文件的,相同的文件MD5码是相同的,即便命名不一样,下面是一组MD5码的测试数据

文件txt

测试数据

测试结果

文件:.txt
MD5码:057f9a55128fcd5448fdef8e56122125
文件:改名 .txt
MD5码:057f9a55128fcd5448fdef8e56122125
文件:修改后缀10.xlsx
MD5码:057f9a55128fcd5448fdef8e56122125
文件:压缩
MD5码:4b27cc178681336f52bef782d30187ae
文件:第二次压缩
MD5码:4b27cc178681336f52bef782d30187ae
文件:加密压缩 密码123
MD5码:311a42b3946fc8c36cf7df59f10fd5f0
文件:第二次加密压缩 密码123456
MD5码:c097d1a3e69a64d402102d9740294532

由此可见,一个相同的文件,即便你更改了文件名和后缀,文件大的MD5码还是相同的,经过压缩后,MD5码会改变,加密压缩时,密码不同,MD5码也不同

顺便说一句,百度云盘的极速上传就是用MD5码校验的,当你上传一个文件的时候,会在服务器中查找是否有相同MD5码的文件,如果有,那就不同直接从本地上传到服务器,而是直接让你的账号指向该服务器的文件,实现秒速上传(其实根本没有上传),当然,如果服务器的文件因被举报而被限制下载,那么拥有该文件的所有用户都不能下载该文件了,所以,如果有什么重要的文件,可以加密压缩再上传到服务器,虽然上传有点慢,但是上传后,你将是服务器上该文件的唯一使用者,不用担心因被举报而被限制下载(当然前提是不分享出去),所以大家都懂的。

ashx实现文件下载以及文件MD5码测试的更多相关文章

  1. winrt获取文件MD5码

    //小文件 public static string ComputeMD5(byte[] bytes) { var alg = HashAlgorithmProvider.OpenAlgorithm( ...

  2. Windows命令查看文件MD5码

    D:\>certutil -hashfile md5test.txt MD5 MD5 哈希(文件 md5test.txt): d6 f6 bb 38 b5 6b 67 8f 34 9b e4 d ...

  3. C# 计算文件MD5

    因工作需要对文件进行是否被修改判断,整理的一段生成文件MD5码的代码: 1: public class FileHelper 2: { 3: /// <summary> 4: /// 对文 ...

  4. 文件 MD5 SHA1 SHA256 SHA512 校验码生成工具 V1.3

    [程序介绍]免费开源的 文件 MD5 SHA1 SHA256 SHA512 校验码生成工具 V1.3 这是一个有意思的程序,同一个程序,即是图形程序,又是命令行程序.程序作用:输入一个文件的路径,输出 ...

  5. Java计算文件的SHA码和MD5码

    可参考:http://blog.csdn.net/hudashi/article/details/8394158 /** * 计算文件的MD5码 * @param file * @return */ ...

  6. 文件MD5查看器工具与源码实现及下载

    由于工作中经常需要查看文件的MD5值,先前网上找了几个MD5值查看工具,但基本都是选择文件,还没有复制功能,于是今天我就自己编写了个MD5查看工具,支持文件拖拽查看,并可以复制功能. 由于本工具比较小 ...

  7. Java 获取 文件md5校验码

    讯雷下载的核心思想是校验文件的md5值,两个文件若md5相同则为同一文件. 当得到用户下载某个文件的请求后它根据数据库中保留的文件md5比对出拥有此文件的url, 将用户请求挂接到此url上并仿造一个 ...

  8. HTML5 file api读取文件的MD5码工具

    1.工具的用途:用HTML5 file api读取文件的MD5码.MD5码在文件的唯一性识别上有很重要的应用,业内常用MD5进行文件识别.文件秒传.文件安全性检查等: 2.适用性:IE.Chrome皆 ...

  9. 扫描某目录下的所有文件的MD5码并导出文件【可执行jar】

    pom <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http:// ...

随机推荐

  1. CareerCup Chapter 9 Sorting and Searching

    9.1 You are given two sorted arrays, A and B, and A has a large enough buffer at the end to hold B. ...

  2. 简析MFC中CString用作C字符串

      MFC中CString是一个方便的字符串操作的类, 然而很多函数需要传递字符指针, 这就需要进行CString和普通字符串的转换. 1.CString用作C字符串常量. 直接使用强制类型转换即可, ...

  3. sun.misc.BASE64Encoder是内部专用 API, 可能会在未来发行版中删除

    简介 MEVAN打包遇到问题“sun.misc.BASE64Encoder是内部专用 API, 可能会在未来发行版中删除”,属于警告!项目虽然能正常运行,但是有警告就是一种隐患,要将隐患消灭在萌芽中. ...

  4. iscc2016 mobile1-TurtleShell.apk解题过程

    拿到程序先运行,简单的验证输入的flag正确与否.jeb加载apk文件 实在库文件里面验证,所以ida加载之,so文件是加密的,所以看不到关键验证函数,百度搜了下libhackme.so,出来这篇文章 ...

  5. jquery之遍历展示title

    //遍历展示title {field:'couponsList',title:'优惠劵类型',width:250,align:'center',sortable:true, formatter:fun ...

  6. Python 类 --基础与要点

    1:2.x与3.x区别: 2.x:老式类,都继承自object,继承机制为深度优先 3.x:新式类不需要写(object),继承机制为广度优先 2:类说明: 在定义类下用""&qu ...

  7. Android-兼容问题

    兼容性问题从何而来?答:使用了低版本没有的功能,可是目标设备包括低版本. 那我们如何解决兼容性问题? 1.如果是JAVA代码 1.1 使用TargetApi(x)注解,避免Android Lint报错 ...

  8. 截取字符串 substring substr slice

    截取字符串   substring 方法用于提取字符串中介于两个指定下标之间的字符  substring(start,end) 开始和结束的位置,从零开始的索引 参数     描述 start     ...

  9. java基础学习----String

    旨在从内存方面看String类的知识点: 1.为何不能被继承(final类) 2.字符拼接时,String类的内存分配问题. 3.String的intern()方法 关于String类经常出现的面试题 ...

  10. bestcoder r44 p3 hdu 5270 ZYB loves Xor II

    这是昨晚队友跟我说的题,不知道当时是什么玄幻的事件发生了,,我看成了两两相乘的XOR 纠结了好长时间间 不知道该怎么办 今天早上看了下这道题,发现是两两相加的XOR  然后就想了想昨晚的思路 发现可做 ...