ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2022-01-27 18:01:08  阅读:187  来源: 互联网

标签:context 分段 stream filename 处理程序 file new ashx Response


<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;
}
}
}

标签:context,分段,stream,filename,处理程序,file,new,ashx,Response
来源: https://www.cnblogs.com/yingxianqi/p/15850671.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有