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码的文件,如果有,那就不同直接从本地上传到服务器,而是直接让你的账号指向该服务器的文件,实现秒速上传(其实根本没有上传),当然,如果服务器的文件因被举报而被限制下载,那么拥有该文件的所有用户都不能下载该文件了,所以,如果有什么重要的文件,可以加密压缩再上传到服务器,虽然上传有点慢,但是上传后,你将是服务器上该文件的唯一使用者,不用担心因被举报而被限制下载(当然前提是不分享出去),所以大家都懂的。

最新文章

  1. lambda表达式
  2. boost相关
  3. 介绍开源的.net通信框架NetworkComms框架 源码分析(七)ProtobufSerializer
  4. Git使用方法
  5. DAS、SAN、NAS的区别
  6. php常量的声明和使用
  7. Oracle基础 PL-SQL编程基础(1) 变量和常量
  8. C#通过代码注册COM组件
  9. 【Xamarin挖墙脚系列:Android最重要的命令工具ADB】
  10. SilkTest天龙八部系列6-用open agent进行测试
  11. xshell 快速复制打开之前用过的ssh
  12. ILRuntime官方Demo笔记
  13. python第五十三天--进程,协程.select.异步I/O...
  14. Window应急响应(二):蠕虫病毒
  15. 自己动手破解rar密码-ruby脚本实现
  16. android开发(25) - 推送的实现,使用百度云推送
  17. python转义符的使用
  18. 关于jsp页面中时间显示问题
  19. 2017年12月14日 LinQ高级查&amp;&amp;Asp.net WebForm Asp.net MVC
  20. H5应用程序缓存浅谈及实际测试

热门文章

  1. Windows移动开发(二)——闭关修炼
  2. [小技巧][ASP.Net MVC Hack] 使用 HTTP 报文中的 Header 字段进行身份验证
  3. 怎么样学好C++
  4. 当setTimeout遇到闭包
  5. ASP.NET常用编程代码(二)
  6. 委托与Lambda-浅谈
  7. PL/SQL Developer主界面窗口左边窗口默认设置
  8. 一个模拟时钟的时间选择器 ClockPicker
  9. webstrom的注释
  10. zlog小试(C语言日志工具)