存在数据库中的文件,当用户点击下载该文件时,被迅雷拦截,而用迅雷下下来的缺是aspx页面文件

bluemoon0001 2010-03-14 06:11:21
我们的附件文件被上传到数据库里,在页面上用<a href="DownFile.aspx?id=12">点击下载</a>这种方式供用户下载,这种下载如果用户使用浏览本身下载是没有问题的,可是如果用户电脑上装了迅雷,迅雷会自动拦截,而用迅雷下下来的缺是DownFile.aspx文件,而不是直正的附件文件。
注:DownFile.aspx是一个输出文件流的aspx页面。

现有的方案是,当用户浏览带有“<a href="DownFile.aspx?id=12">点击下载</a>”的页面时,把这个链接所对应的文件,在服务器上生成一个物理文件,假设叫作 fujian.rar,那么再把DownFile.aspx?id=12 直接换成 fujian.rar即可,可是这样改动起来有点麻烦,而且影响性能。

请问有没有更好的并且快捷的方式来解决这个问题?
...全文
375 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
blsegirl 2010-06-24
  • 打赏
  • 举报
回复
解决了吗,我这里也是这个错误
hztltgg 2010-05-10
  • 打赏
  • 举报
回复
DownFile.aspx 你这个里面的代码没有给出文件名吧
bluemoon0001 2010-05-10
  • 打赏
  • 举报
回复
不好意思,有位兄弟没有给到分,对不起。。。
bluemoon0001 2010-05-10
  • 打赏
  • 举报
回复
对不起各位,到现在没有结贴。
YnSky 2010-03-15
  • 打赏
  • 举报
回复
下载代码,把2010.xls换成要下载的文件的路径即可.
Response.Clear();
Response.Buffer = true;
Response.Charset = "GB2312";
Response.AppendHeader("Content-Disposition", "attachment; filename=PrizeInput.xls");
Response.TransmitFile(Server.MapPath("2010.xls"));
Response.End();
telankes2000 2010-03-15
  • 打赏
  • 举报
回复


public class DownloadHandler : IHttpHandler
{
/// <summary>
/// 讀取文件
/// </summary>
/// <param name="filePath">文件路徑</param>
/// <param name="context">下載頁面</param>
/// <param name="downLoadType">下載類型</param>
private void ReadFile(string filePath,HttpContext context,string downLoadType)
{
try
{
using(FileStream fs= new FileStream(filePath,FileMode.Open,FileAccess.Read, FileShare.Read))
{
string fileName = Path.GetFileName(filePath);
string encodeFileName = HttpUtility.UrlEncode(System.Text.Encoding.UTF8.GetBytes(Path.GetFileNameWithoutExtension(filePath)));
string fileExtension = Path.GetExtension(filePath);
if(fileExtension == ".xls" && encodeFileName.Length > 215)
encodeFileName = encodeFileName.Substring(0,210);
context.Response.ClearContent();
context.Response.Clear();
context.Response.ContentEncoding = System.Text.Encoding.UTF8;
context.Response.AddHeader("Content-Length", fs.Length.ToString());
context.Response.ContentType = "application/octet-stream";
context.Response.AddHeader("Content-Disposition", ""+downLoadType+"; filename=" + encodeFileName + fileExtension+"");
int readLength = 0;
byte[] buffer = new Byte[10240];//緩沖區大小 10k
while(true)
{
if(context.Response.IsClientConnected)
{
readLength = fs.Read(buffer,0,10240);
if(readLength == 0)break;
context.Response.OutputStream.Write(buffer, 0, readLength);
context.Response.Flush();
}
else
{
break;
}
}

context.Response.Close();
}
}
catch(Exception ex)
{
throw ex;
}
if(this.IsDelete){
DeleteFile(filePath);
}
}
private void DeleteFile(string filePath){
try{
if(System.IO.File.Exists(filePath)){
System.IO.File.Delete(filePath);
}
}
catch{}
}
private bool _isDelete;
private bool IsDelete{
get{return this._isDelete;}
}
public void ProcessRequest(HttpContext context)
{
if(context.Request["fn"] != null)
{
string filePath = Utils.Util.DecryptFileName(context.Request.QueryString["fn"].ToString().Trim()); //通过解密得到文件名
this._isDelete = context.Request.QueryString["d"] != null;
ReadFile(filePath,context,context.Request.QueryString["t"] == null ? "attachment" : "inline");//attachment:附件模式;inline在線模式
}
}
public bool IsReusable
{
get{return true;}
}
}

這是我常用的下載代碼
用迅雷5可以正確下載
你試試
aotian16 2010-03-15
  • 打赏
  • 举报
回复
0.0
bluemoon0001 2010-03-15
  • 打赏
  • 举报
回复
好,谢谢各位,我试一下,如果问题解决就结贴了。
dcbr4 2010-03-14
  • 打赏
  • 举报
回复
你把你的附件直接存文件,路径存数据库

文件存数据库慢,影响io直接读硬盘比较快
sunnj87 2010-03-14
  • 打赏
  • 举报
回复
不知道你所说的“在服务器上生成一个物理文件”是什么意思


是根据id生成一个文件吗?

然后就是要下载这个文件嘛?

可以直接获取该文件的物理路径

然后定义文件流发送到客户端就行了
空心兜兜 2010-03-14
  • 打赏
  • 举报
回复
没有截取到文件流

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧