httpHandlers文件下载
来源:互联网 发布:个人资源下载网站源码 编辑:程序博客网 时间:2024/06/06 20:30
1:编写一个实现IHttpHandler的类。
public class DownloadFileProcesser : IHttpHandler
...{
private DownLoadData logdata = new DownLoadData();
public DownloadFileProcesser()
...{
}
public void ProcessRequest(HttpContext context)
...{
string fileName = context.Request.Url.OriginalString; //获取请求的url
string ORIGINALURL = fileName; //完整的请求路径
int index = fileName.LastIndexOf("/"); //取最后一个/的未知
fileName = fileName.Substring(index + 1); string filepath = fileName;
int iBegin = fileName.LastIndexOf("_"); //取"_"之前和"."后面的,组成aaa.dd
int iEnd = fileName.LastIndexOf(".");
string localPath = System.Configuration.ConfigurationManager.AppSettings["downLoadPath"]; //下载文件的存放路径
if (iBegin >= 0)
...{
filepath = fileName.Substring(0, iBegin) + fileName.Substring(iEnd);
filepath = context.Server.MapPath(localPath + filepath);
}
else
...{
// filepath = Path.Combine(localPath, fileName);
filepath = context.Server.MapPath(localPath + fileName);
}
// downLoadHandle aa = new downLoadHandle(outputBinary);
if (File.Exists(filepath)) //文件是否存在。不存在的话按照真实文件名下载
...{
outputBinary(fileName, filepath, context);
sendState = 1;
}
else
...{
context.Response.Status = "404 Not Found ";
sendState = 0;
}
logdata.SENDSTATE = sendState;
int indexLfn = filepath.LastIndexOf("/");
string localFileName = filepath.Substring(index1 + 1);
logdata.LOCALFILENAME = localFileName;
logdata.ORIGINALURL = ORIGINALURL;
WriteDownLoadLog();
}
// 文件按照二进制流循环输出。其实没必要这么写。
public void outputBinary(string fileName, string filepath, HttpContext context)
...{
context.Response.ContentType = "application/octet-stream";
context.Response.AppendHeader("Content-Disposition", "attachment; filename=" + fileName);
using (System.IO.FileStream fs = new System.IO.FileStream(filepath, System.IO.FileMode.Open, System.IO.FileAccess.Read))
...{
byte[] aLogData = new byte[1024];
int len;
//设定每次读取1024个字节。避免多人下载时过慢。
while ((len = fs.Read(aLogData, 0, aLogData.Length)) > 0)
...{
context.Response.BinaryWrite(_FixBuffer(aLogData, len));
}
}
}
/**//// <summary>
/// 取指定长度的文件
/// </summary>
/// <param name="aLogData"></param>
/// <param name="len"></param>
/// <returns></returns>
private byte[] _FixBuffer(byte[] aLogData, int len)
...{
if (aLogData.Length == len)
return aLogData;
byte[] buffer = new byte[len];
Array.Copy(aLogData, buffer, len);
return buffer;
}
public bool IsReusable
...{
get
...{
return true;
}
}
}
...{
private DownLoadData logdata = new DownLoadData();
public DownloadFileProcesser()
...{
}
public void ProcessRequest(HttpContext context)
...{
string fileName = context.Request.Url.OriginalString; //获取请求的url
string ORIGINALURL = fileName; //完整的请求路径
int index = fileName.LastIndexOf("/"); //取最后一个/的未知
fileName = fileName.Substring(index + 1); string filepath = fileName;
int iBegin = fileName.LastIndexOf("_"); //取"_"之前和"."后面的,组成aaa.dd
int iEnd = fileName.LastIndexOf(".");
string localPath = System.Configuration.ConfigurationManager.AppSettings["downLoadPath"]; //下载文件的存放路径
if (iBegin >= 0)
...{
filepath = fileName.Substring(0, iBegin) + fileName.Substring(iEnd);
filepath = context.Server.MapPath(localPath + filepath);
}
else
...{
// filepath = Path.Combine(localPath, fileName);
filepath = context.Server.MapPath(localPath + fileName);
}
// downLoadHandle aa = new downLoadHandle(outputBinary);
if (File.Exists(filepath)) //文件是否存在。不存在的话按照真实文件名下载
...{
outputBinary(fileName, filepath, context);
sendState = 1;
}
else
...{
context.Response.Status = "404 Not Found ";
sendState = 0;
}
logdata.SENDSTATE = sendState;
int indexLfn = filepath.LastIndexOf("/");
string localFileName = filepath.Substring(index1 + 1);
logdata.LOCALFILENAME = localFileName;
logdata.ORIGINALURL = ORIGINALURL;
WriteDownLoadLog();
}
// 文件按照二进制流循环输出。其实没必要这么写。
public void outputBinary(string fileName, string filepath, HttpContext context)
...{
context.Response.ContentType = "application/octet-stream";
context.Response.AppendHeader("Content-Disposition", "attachment; filename=" + fileName);
using (System.IO.FileStream fs = new System.IO.FileStream(filepath, System.IO.FileMode.Open, System.IO.FileAccess.Read))
...{
byte[] aLogData = new byte[1024];
int len;
//设定每次读取1024个字节。避免多人下载时过慢。
while ((len = fs.Read(aLogData, 0, aLogData.Length)) > 0)
...{
context.Response.BinaryWrite(_FixBuffer(aLogData, len));
}
}
}
/**//// <summary>
/// 取指定长度的文件
/// </summary>
/// <param name="aLogData"></param>
/// <param name="len"></param>
/// <returns></returns>
private byte[] _FixBuffer(byte[] aLogData, int len)
...{
if (aLogData.Length == len)
return aLogData;
byte[] buffer = new byte[len];
Array.Copy(aLogData, buffer, len);
return buffer;
}
public bool IsReusable
...{
get
...{
return true;
}
}
}
2:配置webconfitg
<httpHandlers>
<!--当请求的后缀为.cab的时候,调用DownloadFileProcesser这个继承IHttpHandler接口的类-!>
<add verb="GET,POST" path="*.cab" type="DownloadFileProcesser"/>
</httpHandlers>
3:运行IIS服务管理器,右键点击默认Web站点,选择属性,移动到Home目录选项页,并点击配置按钮。应用程序配置对话框弹出来了。点击添加按钮并在可执行字段输入aspnet_isapi.dll文件路径,在扩展字段输入.kim
ps:如果你的操作系统是XP SP2的话,在输入aspnet_isapi.dll路径时需要手工输入,不能用复制粘贴的形式,否则保存按钮变灰。浏览时去掉check file exit选项。
- httpHandlers文件下载
- HttpHandlers
- HttpHandlers元素
- HttpHandlers 2
- 使用httpHandlers
- HttpHandlers httpModules
- httpModules与httpHandlers之httpHandlers
- HTTPModules VS. HTTPHandlers
- httpHandlers使用和问题
- httpHandlers使用和问题
- HttpContext, HttpModules 和 HttpHandlers
- httpHandlers使用和问题
- HttpModule 和 HttpHandlers
- HttpModule 和 HttpHandlers
- httphandlers 与 httpmodules
- HttpHandlers、HttpModules介绍
- httpModules与httpHandlers
- httphandlers 与 httpmodules
- 怎样取得表中不存在月份数据?
- 利用JAVA操作EXCEL文件
- 配置Asp.net2.0服务器
- [收藏]C/C++ 字符编码的转换(ut8、gb2312)
- Web 2.0
- httpHandlers文件下载
- 在Forms验证模式下,实现多个站点(SubDomain相同)共享同一用户登录状态
- 全文翻译专家(SenTrans)设计2_目录
- WebWork中的xwork.xml
- 递归解决汉诺塔问题
- NHibernate1.2 的配置和简单应用!!!!
- 全文翻译专家(SenTrans)设计3_系统框架
- 全文翻译专家(SenTrans)设计4_类设计
- ADO关联