(一)一般处理程序(ashx)分段下载文件

<a class="fancylink" href="../../infrastructure/handlers/file-download.ashx?id=29d7a2a3-ee66-4f24-af7c-2ad9fbb779bf">xxxx</a>

 

public class file_download : IHttpHandler
{

public void ProcessRequest(HttpContext context)
{
var req = context.Request.QueryString;
string id = req["id"], relId = req["relId"], relType = req["relType"];
InfrastructureFiles file = null;

if (id.Is<Guid>())
file = InfrastructureFiles.GetById(new Guid(id));
else if (!string.IsNullOrEmpty(relId) && relType.Is<short>())
file = InfrastructureFiles.GetByRel(relId, relType.SafeParseEnum<FileRelTypes, short>());

if (file != null)
{
file.UpdateDownload();
try
{
string filename = file.FileName;
switch (file.RelType)
{
case (short)FileRelTypes.XheditorReceipt:
case (short)FileRelTypes.XheditorTrendOfWork:
case (short)FileRelTypes.XheditorProjData: break;
default: filename += Path.GetExtension(file.FileUrl); break;
}
long chunkSize = 204800;
byte[] buffer = new byte[chunkSize];
long dataToRead = 0;
FileStream stream = null;
try
{
string filePath = context.Server.MapPath(file.FileUrl);//路径
stream = new FileStream(filePath, FileMode.Open);
dataToRead = stream.Length;
context.Response.ContentType = "application/octet-stream";
//通知浏览器下载文件而不是打开
context.Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(filename, System.Text.Encoding.UTF8));
context.Response.AddHeader("Content-Length", dataToRead.ToString());
while (dataToRead > 0)
{
if (context.Response.IsClientConnected)
{


int length = stream.Read(buffer, 0, Convert.ToInt32(chunkSize));
context.Response.OutputStream.Write(buffer, 0, length);
context.Response.Flush();
buffer = new Byte[chunkSize];
dataToRead = dataToRead - length;

}
else
{
dataToRead = -1;
}
}
}
catch (Exception)
{


throw;
}

finally
{
if (stream != null)
{
stream.Close();
}
context.Response.Close();
}

//string filePath = context.Server.MapPath(file.FileUrl);//路径
//FileStream fs = new FileStream(filePath, FileMode.Open);
//byte[] bytes = new byte[(int)fs.Length];
//fs.Read(bytes, 0, bytes.Length);
//fs.Dispose();
//fs.Close();
//context.Response.ContentType = "application/octet-stream";
////通知浏览器下载文件而不是打开
//context.Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(filename, System.Text.Encoding.UTF8));
//context.Response.BinaryWrite(bytes);
////context.Response.WriteFile(file.FileUrl);
//context.Response.Flush();
//context.Response.End();

 

//new HtmlOutput().TransmitFile(file.FileUrl,filename);
}
catch (HttpException)
{
}
}
else
new HtmlOutput().TransmitFile(null, null); // 找不到文件
}

public bool IsReusable
{
get
{
return false;
}
}
}

上一篇:Flask中的request和response


下一篇:文件上传与下载