asp.net下载(一个关于asp.net(c#)下载文件的问题)
大家好,今天我将为大家揭秘asp.net下载和一个关于asp.net(c#)下载文件的问题的奥秘,希望我的分享能给你带来新的启发和知识。
如何在ASP.NET中下载文件
但是这样的下载有几个问题: 1.无法下载不存在的文件:例如,我们若是想把程序动态(临时)产生的文字,当作一个文件下载的时候(也就是该文件其实原先并不是真的存在,而是动态产生的),就无法下载。 2.无法下载存储于数据库中的文件:这是类似的问题,该文件并没有真的存在,只是被存放在数据库中的某个位置(某笔记录中的某个栏位)的时候,就无法下载。 3.无法下载不存在于Web文件夹中的文件:文件确实存在,但该文件夹并不是可以分享出来的Web文件夹,例如,该文件的位置在C:/winnt,您总不会想要把该文件夹当作Web文件夹吧?这时候,由于您无法使用Redirect指向该位置,所以无法下载。 4.下载文件后,原本的页面将会消失。 1.这个文件可能是通过ASP.NET程序动态产生的,而不是确实存在于Server端的文件; 2.或是它虽然存在于伺服器端的某个实体位置,但我们并不想暴露这个位置(如果这个位置公开,很可能没有权限的用户也可以在网址栏上输入URL直接取得!!!) 3.或是这个位置并不在网站虚拟路径所在的文件夹中。(例如C:/Windows/System32...)这时候,我们就得采用不同的方式: Shared Function DownloadFile(ByVal WebForm As System.Web.UI.Page, ByVal FileNameWhenUserDownload As String, ByVal FileBody As String)WebForm.Response.ClearHeaders() WebForm.Response.Clear() WebForm.Response.Expires= 0 WebForm.Response.Buffer= True WebForm.Response.AddHeader(Accept-Language, zh-tw)'文件名称WebForm.Response.AddHeader(content-disposition, attachment; filename=& Chr(34)& System.Web.HttpUtility.UrlEncode(FileNameWhenUserDownload, System.Text.Encoding.UTF8)& Chr(34)) WebForm.Response.ContentType= Application/octet-stream'文件内容WebForm.Response.Write(FileBody)WebForm.Response.End() End Function上面这段代码是下载一个动态产生的文本文件,若这个文件已经存在于服务器端的实体路径,则可以通过下面的函数: Shared Sub DownloadFile(ByVal WebForm As System.Web.UI.Page, ByVal FileNameWhenUserDownload As String, ByVal FilePath As String)WebForm.Response.ClearHeaders() WebForm.Response.Clear() WebForm.Response.Expires= 0 WebForm.Response.Buffer= True WebForm.Response.AddHeader(Accept-Language, zh-tw)'文件名称WebForm.Response.AddHeader(content-disposition, attachment; filename=& Chr(34)& System.Web.HttpUtility.UrlEncode(FileNameWhenUserDownload, System.Text.Encoding.UTF8)& Chr(34))
asp.net与.net的区别是什么
分析你的问题,你所谓C#.net大概是指在.net平台下使用C#做开发,这个说法就包括了在.net平台下用C#做B/S模式开发也就是包括Asp.net开发。
C#只是一种开发语言,而.net是一个开发和用户体验环境。
.net体验包括:
1.使用平台,如个人电脑台式机,装有.net FrameWork的手机,PDA等。
2.开发工具,如Visual Studio.net 2005等
3..net framework,即我们开发人员使用的类库。
4.配套的数据库系统,如SQL SERVER
等等。搞开发主要学习和使用的就是.net framework。而所谓的ado.net,asp.net,xml,sql server的数据访问接口,oracle的数据访问接口等技术,在.net frame都有其实现的类库。比如ado.net技术是由common language runtime支持,并由System.Data和System.Data.SqlClient以及System.Data.Oricle还有System.Data.OleDB等命名空间实现其功能;Sql server数据库的连接就是由System.DataSqlClient命名空间支持的
知道了这些,再来说Asp.net和C#.net。Asp.net则主要是有.net framework中的System.Web;System.Web.Control;等命名空间支持和实现,由Common Language Runtime(公共语言运行环境)解析。Asp.net在对应的类库支持上是.net类库的子集,Asp.net技术包括前台标记,即类似<asp:lable id="lable1" runat="server" text="aa"/>的标记,是微软最新的不同于以前HTML原始标记的一套新的标记规则,Asp.net后台代码可以使用C#等语言编写。你所谓C#.net应该就是指在.net环境(common language runtime,.net frame)下使用C#语言做开发。
就说这么多了,希望对你有帮助,也希望能得点积分!
一个关于asp.net(c#)下载文件的问题
文件路径是不是有中文啊?zh-tw这是繁体的!
asp.net2.0以后,我们有了很多种文件下载的选择。
public partial class FileDownLoad: System.Web.UI.Page
{
//提供下载的文件,不编码的话文件名会乱码
private string fileName= HttpContext.Current.Server.UrlEncode("规范.rar");
private string filePath= HttpContext.Current.Server.MapPath("规范.rar");
//使用TransmifFile下载文件
protected void btnDL1_Click(object sender, EventArgs e)
{
FileInfo info= new FileInfo(filePath);
long fileSize= info.Length;
Response.Clear();
Response.ContentType="application/x-zip-compressed";
Response.AddHeader("Content-Disposition","attachment;filename="+ fileName);
//不指明Content-Length用Flush的话不会显示下载进度
Response.AddHeader("Content-Length", fileSize.ToString());
Response.TransmitFile(filePath, 0, fileSize);
Response.Flush();
Response.Close();
}
//使用WriteFile下载文件
protected void btnDL2_Click(object sender, EventArgs e)
{
FileInfo info= new FileInfo(filePath);
long fileSize= info.Length;
Response.Clear();
Response.ContentType="application/octet-stream";
Response.AddHeader("Content-Disposition","attachement;filename="+ fileName);
//指定文件大小
Response.AddHeader("Content-Length", fileSize.ToString());
Response.WriteFile(filePath, 0, fileSize);
Response.Flush();
Response.Close();
}
//使用OutputStream.Write分块下载文件
protected void btnDL3_Click(object sender, EventArgs e)
{
//指定块大小
long chunkSize= 102400;
//建立一个100K的缓冲区
byte[] buffer= new byte[chunkSize];
//已读的字节数
long dataToRead= 0;
FileStream stream= null;
try
{
//打开文件
stream= new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
dataToRead= stream.Length;
//添加Http头
Response.ContentType="application/octet-stream";
Response.AddHeader("Content-Disposition","attachement;filename="+ fileName);
Response.AddHeader("Content-Length", dataToRead.ToString());
while(dataToRead> 0)
{
if(Response.IsClientConnected)
{
int length= stream.Read(buffer, 0, Convert.ToInt32(chunkSize));
Response.OutputStream.Write(buffer, 0, length);
Response.Flush();
Response.Clear();
dataToRead-= length;
}
else
{
//防止client失去连接
dataToRead=-1;
}
}
}
catch(Exception ex)
{
Response.Write("Error:"+ ex.Message);
}
finally
{
if(stream!= null)
{
stream.Close();
}
Response.Close();
}
}
//使用BinaryWrite下载文件,大文件效率不行
protected void btnDL4_Click(object sender, EventArgs e)
{
FileStream stream= null;
try
{
//读文件,大文件一次读入会占用大量内存
stream= new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
byte[] bytes= new byte[stream.Length];
stream.Read(bytes, 0, bytes.Length);
stream.Close();
//添加Http头
Response.ContentType="application/octet-stream";
Response.AddHeader("Content-Disposition","attachement;filename="+ fileName);
Response.AddHeader("Content-Length", bytes.Length.ToString());
Response.BinaryWrite(bytes);
Response.Flush();
}
catch(Exception ex)
{
Response.Write("Error:"+ ex.Message);
}
finally
{
if(stream!= null)
{
stream.Close();
}
Response.Close();
}
}
//使用BinaryWrite分块下载文件
protected void btnDL5_Click(object sender, EventArgs e)
{
//指定区块和缓冲区
long chunkSize= 102400;
byte[] buffer= new byte[chunkSize];
FileStream stream= null;
long dataToRead= 0;
try
{
stream= new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
dataToRead= stream.Length;
//添加Http头
Response.ContentType="application/octet-stream";
Response.AddHeader("Content-Disposition","attachement;filename="+ fileName);
Response.AddHeader("Content-Length", dataToRead.ToString());
while(dataToRead> 0)
{
if(Response.IsClientConnected)
{
int length= stream.Read(buffer, 0, Convert.ToInt32(chunkSize));
Response.BinaryWrite(buffer);
Response.Flush();
Response.Clear();
dataToRead-= length;
}
else
{
dataToRead=-1;
}
}
}
catch(Exception ex)
{
Response.Write("Error:"+ ex.Message);
}
finally
{
if(stream!= null)
{
stream.Close();
}
Response.Close();
}
}
}
public partial class FileDownLoad: System.Web.UI.Page{//提供下载的文件,不编码的话文件名会乱码 private string fileName= HttpContext.Current.Server.UrlEncode("规范.rar"); private string filePath= HttpContext.Current.Server.MapPath("规范.rar");//使用TransmifFile下载文件 protected void btnDL1_Click(object sender, EventArgs e){ FileInfo info= new FileInfo(filePath); long fileSize= info.Length; Response.Clear(); Response.ContentType="application/x-zip-compressed"; Response.AddHeader("Content-Disposition","attachment;filename="+ fileName);//不指明Content-Length用Flush的话不会显示下载进度 Response.AddHeader("Content-Length", fileSize.ToString()); Response.TransmitFile(filePath, 0, fileSize); Response.Flush(); Response.Close();}//使用WriteFile下载文件 protected void btnDL2_Click(object sender, EventArgs e){ FileInfo info= new FileInfo(filePath); long fileSize= info.Length; Response.Clear(); Response.ContentType="application/octet-stream"; Response.AddHeader("Content-Disposition","attachement;filename="+ fileName);//指定文件大小 Response.AddHeader("Content-Length", fileSize.ToString()); Response.WriteFile(filePath, 0, fileSize); Response.Flush(); Response.Close();}//使用OutputStream.Write分块下载文件 protected void btnDL3_Click(object sender, EventArgs e){//指定块大小 long chunkSize= 102400;//建立一个100K的缓冲区 byte[] buffer= new byte[chunkSize];//已读的字节数 long dataToRead= 0; FileStream stream= null; try{//打开文件 stream= new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read); dataToRead= stream.Length;//添加Http头 Response.ContentType="application/octet-stream"; Response.AddHeader("Content-Disposition","attachement;filename="+ fileName); Response.AddHeader("Content-Length", dataToRead.ToString()); while(dataToRead> 0){ if(Response.IsClientConnected){ int length= stream.Read(buffer, 0, Convert.ToInt32(chunkSize)); Response.OutputStream.Write(buffer, 0, length); Response.Flush(); Response.Clear(); dataToRead-= length;} else{//防止client失去连接 dataToRead=-1;}}} catch(Exception ex){ Response.Write("Error:"+ ex.Message);} finally{ if(stream!= null){ stream.Close();} Response.Close();}}//使用BinaryWrite下载文件,大文件效率不行 protected void btnDL4_Click(object sender, EventArgs e){ FileStream stream= null; try{//读文件,大文件一次读入会占用大量内存 stream= new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read); byte[] bytes= new byte[stream.Length]; stream.Read(bytes, 0, bytes.Length); stream.Close();//添加Http头 Response.ContentType="application/octet-stream"; Response.AddHeader("Content-Disposition","attachement;filename="+ fileName); Response.AddHeader("Content-Length", bytes.Length.ToString()); Response.BinaryWrite(bytes); Response.Flush();} catch(Exception ex){ Response.Write("Error:"+ ex.Message);} finally{ if(stream!= null){ stream.Close();} Response.Close();}}//使用BinaryWrite分块下载文件 protected void btnDL5_Click(object sender, EventArgs e){//指定区块和缓冲区 long chunkSize= 102400; byte[] buffer= new byte[chunkSize]; FileStream stream= null; long dataToRead= 0; try{ stream= new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read); dataToRead= stream.Length;//添加Http头 Response.ContentType="application/octet-stream"; Response.AddHeader("Content-Disposition","attachement;filename="+ fileName); Response.AddHeader("Content-Length", dataToRead.ToString()); while(dataToRead> 0){ if(Response.IsClientConnected){ int length= stream.Read(buffer, 0, Convert.ToInt32(chunkSize)); Response.BinaryWrite(buffer); Response.Flush(); Response.Clear(); dataToRead-= length;} else{ dataToRead=-1;}}} catch(Exception ex){ Response.Write("Error:"+ ex.Message);} finally{ if(stream!= null){ stream.Close();} Response.Close();}}}
以上除了第四种不推荐以外,其他的都可以,但是个人感觉分块下载的要好一点。没有仔细测试,所以可能有问题。
注意:对于中文文件名要编码才能正确显示。对于长中文文件名(UTF8编码后大于153字节的中文)即使编码了,还是有问题的,大家可以参考这个链接。
http://hi.baidu.com/river_5566/blog/item/d66804cef8afb031b700c863.html
感谢您花时间阅读本文!我们希望通过对asp.net下载的问题进行探讨,为您提供了一些有用的见解和解决方案。如果您需要更多帮助或者有其他疑问,请不要犹豫与我们联系。