You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

90 lines
2.5 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.IO;
namespace NetWorkHard.GlobalAshx
{
/// <summary>
/// DownFile 的摘要说明
/// </summary>
public class DownFile : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
HttpFileCollection files = context.Request.Files;
string FilePath = context.Server.UrlDecode(context.Request.QueryString["FilePath"]);
string FileName = context.Server.UrlDecode(context.Request.QueryString["FileName"]);
if (FilePath == "") return;
FilePath = AppDomain.CurrentDomain.BaseDirectory + FilePath;
string ext = Path.GetExtension(FilePath);
if (ext == ".aspx" || ext == ".config" || ext == ".dll" || FilePath == "/Setup.ini" || FilePath == "Setup.ini")
{
context.Response.End();
return;
}
context.Response.Clear();
context.Response.ClearHeaders();
context.Response.Buffer = true;
context.Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(FileName, System.Text.Encoding.GetEncoding("utf-8")));
context.Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312"); //设置输出流为简体中文
context.Response.ContentType = "application/octet-stream";
if (Path.GetExtension(FileName) == ".doc") context.Response.ContentType = "application/ms-word";
if (Path.GetExtension(FileName) == ".xls") context.Response.ContentType = "application/ms-excel";
if (Path.GetExtension(FileName) == ".pdf") context.Response.ContentType = "application/pdf";
if (System.IO.File.Exists(FilePath) == true)
{
FileInfo fi = new FileInfo(FilePath);
FileStream fs = null;
byte[] buffer = new Byte[10000];
int length;
long dataToRead;
try
{
fs = fi.Open(FileMode.Open, FileAccess.Read, FileShare.Read);
context.Response.AppendHeader("Content-Length", fs.Length.ToString());
dataToRead = fs.Length;
while (dataToRead > 0)
{
if (context.Response.IsClientConnected)
{
length = fs.Read(buffer, 0, 10000);
context.Response.OutputStream.Write(buffer, 0, length);
context.Response.Flush();
buffer = new Byte[10000];
dataToRead = dataToRead - length;
}
else
{
dataToRead = -1;
}
}
}
catch { }
finally
{
if (fs != null)
{
fs.Close();
}
context.Response.End();
}
}
}
public bool IsReusable
{
get
{
return false;
}
}
}
}