ashx实现文件下载以及文件MD5码测试
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码测试的更多相关文章
- winrt获取文件MD5码
//小文件 public static string ComputeMD5(byte[] bytes) { var alg = HashAlgorithmProvider.OpenAlgorithm( ...
- Windows命令查看文件MD5码
D:\>certutil -hashfile md5test.txt MD5 MD5 哈希(文件 md5test.txt): d6 f6 bb 38 b5 6b 67 8f 34 9b e4 d ...
- C# 计算文件MD5
因工作需要对文件进行是否被修改判断,整理的一段生成文件MD5码的代码: 1: public class FileHelper 2: { 3: /// <summary> 4: /// 对文 ...
- 文件 MD5 SHA1 SHA256 SHA512 校验码生成工具 V1.3
[程序介绍]免费开源的 文件 MD5 SHA1 SHA256 SHA512 校验码生成工具 V1.3 这是一个有意思的程序,同一个程序,即是图形程序,又是命令行程序.程序作用:输入一个文件的路径,输出 ...
- Java计算文件的SHA码和MD5码
可参考:http://blog.csdn.net/hudashi/article/details/8394158 /** * 计算文件的MD5码 * @param file * @return */ ...
- 文件MD5查看器工具与源码实现及下载
由于工作中经常需要查看文件的MD5值,先前网上找了几个MD5值查看工具,但基本都是选择文件,还没有复制功能,于是今天我就自己编写了个MD5查看工具,支持文件拖拽查看,并可以复制功能. 由于本工具比较小 ...
- Java 获取 文件md5校验码
讯雷下载的核心思想是校验文件的md5值,两个文件若md5相同则为同一文件. 当得到用户下载某个文件的请求后它根据数据库中保留的文件md5比对出拥有此文件的url, 将用户请求挂接到此url上并仿造一个 ...
- HTML5 file api读取文件的MD5码工具
1.工具的用途:用HTML5 file api读取文件的MD5码.MD5码在文件的唯一性识别上有很重要的应用,业内常用MD5进行文件识别.文件秒传.文件安全性检查等: 2.适用性:IE.Chrome皆 ...
- 扫描某目录下的所有文件的MD5码并导出文件【可执行jar】
pom <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http:// ...
随机推荐
- 从不同层面看cocos2d-x
一 框架层面 二 Lua层面 三 工具层面 四 android打包 一 框架层 总体来说,cocos2dX提供的一个简便的框架,包括了渲染,动画,事件分发,网络还有UI,物理引擎等几大 ...
- [Docker] Install Docker on Windows (hp) and start with Kitematic
Well, on Windows costs a little bit effort to run docker. 1. You need to enable Virtulization: Oh hp ...
- 服务 进程间通讯 IPC AIDL Parcelable 简介
1.IBinder和Binder是什么鬼? 我们来看看官方文档怎么说: 中文翻译: IBinder是远程对象的基本接口,是为了高性能而设计的轻量级远程调用机制的核心部分. 但他不仅用于远程调用,也用 ...
- 关于Lambda表达式的理解
在.NET 1.0的时候,大家都知道我们经常用到的是委托.有了委托呢,我们就可以像传递变量一样的传递方法.在一定程序上来讲,委托是一种强类型的托管的方法指 针,曾经也一时被我们用的那叫一个广泛呀,但是 ...
- Chrome: Shockwave Flash isn't responding
这个问题问 Google 解决得比较快,百度里尽是转载党的东西! 1. 到 chrome://settings/content 找到 Plug-ins 项目 2. 点击 Plug-ins 里的 Exc ...
- ORACLE创建OEM是老爱报的错误【weber出品】
还是采用静默安装,手工建库完成后.在安装的OEM的时候一直报这个错误.这里稍微记载以下解决方案: Database connection through listener failed. Fix th ...
- java比较器Comparator 使用
PresonDemo package cn.stat.p5.person.demo; public class PresonDemo implements Comparable { private S ...
- 《Spring敲门砖之基础教程第一季》 第一章 概要介绍
百度百科say: Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson创建.简单来说,Spring是一个分层的JavaSE/EEful ...
- 文成小盆友python-num5 -装饰器回顾,模块,字符串格式化
一.装饰器回顾与补充 单层装饰器: 如上篇文章所讲单层装饰器指一个函数用一个装饰器来装饰,即在函数执行前或者执行后用于添加相应的操作(如判断某个条件是否满足). 具体请见如下: 单层装饰器 双层装饰器 ...
- C程序设计语言练习题1-9
练习1-9 编写一个将输入复制到输出的程序,并将其中连续的多个空格用一个空格代替. 代码如下: #include <stdio.h> // 包含标准库的信息. int main() // ...