频繁操作下载文件,就会出现如题BUG。请问改如何解决,请高手赐教?谢谢!代码如下:
protected void ResponseFile(string filepath)
{
FileInfo file = new FileInfo(filepath);//创建一个文件对象
Response.Clear();//清除所有缓存区的内容
Response.Charset = "GB2312";//定义输出字符集
Response.ContentEncoding = Encoding.Default;//输出内容的编码为默认编码
Response.AddHeader("Content-Disposition", "attachment;filename=" + file.Name);
//添加头信息。为“文件下载/另存为”指定默认文件名称
Response.AddHeader("Content-Length", file.Length.ToString());
//添加头文件,指定文件的大小,让浏览器显示文件下载的速度
Response.WriteFile(file.FullName);// 把文件流发送到客户端
Response.End();
}
protected void BtnDownload_Click(object sender, EventArgs e)
{
string rarpath = @"c:\tz\temp.rar";
ResponseFile(rarpath);
}
我测试了兄弟们给的代码,但是还是会存在以上错误。最后,我在IIS里新增了一个虚拟目录(及下载目录),错误提示有时还会存在,但是不影响下载(点2次下载即可)。不管使用我原先的代码还是轻风拂夏 兄弟提供的代码,都可以下载。
试试在 Response.End() 前面加上 Response.Flush();
问题依旧,,一频繁操作就出现问题。而且无规律的报以上错误。谢谢
@james-ye: 可不可以不要使用同一文件名c:\tz\temp.rar,给个随机的 , 用完删除
@Yu: 我测试过。代码如下:
String Now = DateTime.Now.ToString("yyyymmddhhmmss");
string filepath = @"c:\tz\temp" + Now + ".rar";
这样好像也存在问题。
/// <summary> /// 用流的方式下载文件 /// </summary> /// <param name="filepath_name">文件路径及文件名</param> public static void FileDownLoad(string filepath_name) { System.IO.Stream iStream = null; //以10K为单位缓存: byte[] buffer = new Byte[10000]; int length; long dataToRead; // 制定文件路径. string filepath = filepath_name; // 得到文件名. string filename = System.IO.Path.GetFileName(filepath); try { // 打开文件. iStream = new System.IO.FileStream(filepath, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read); // 得到文件大小: dataToRead = iStream.Length; System.Web.HttpContext.Current.Response.ContentType = "application/octet-stream"; System.Web.HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=" + filename); while (dataToRead > 0) { //保证客户端连接 if (System.Web.HttpContext.Current.Response.IsClientConnected) { length = iStream.Read(buffer, 0, 10000); System.Web.HttpContext.Current.Response.OutputStream.Write(buffer, 0, length); System.Web.HttpContext.Current.Response.Flush(); buffer = new Byte[10000]; dataToRead = dataToRead - length; } else { //结束循环 dataToRead = -1; } } } catch (Exception ex) { // 出错. System.Web.HttpContext.Current.Response.Write("Error : " + ex.Message); } finally { if (iStream != null) { //关闭文件 iStream.Close(); } } }
行,我用你的这个方式来测试测试。谢谢!
@james-ye: 行的话,记得回来给分哦。
@轻风拂夏: 恩,我在测试环境中试了下,目前没有出现以上问题。我今天更新下使用环境,让他们跑几天看看,没问题收了。嘿嘿~~
是不是你这个C盘没有权限访问?
应该是流文件没有关闭的原因造成的,往往你自己以为关了
第一,文件没有关闭,第二,同时访问一个文件,而且是独占的,这种情况可以尝试使用回复中的FileDownLoad方法,不独占打开文件。
FileShare.Read 关键是这个