首页技术asp.net下载(一个关于asp.net(c#)下载文件的问题)

asp.net下载(一个关于asp.net(c#)下载文件的问题)

编程之家2023-11-01142次浏览

大家好,今天我将为大家揭秘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等

asp.net下载(一个关于asp.net(c#)下载文件的问题)

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.net下载(一个关于asp.net(c#)下载文件的问题)

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下载的问题进行探讨,为您提供了一些有用的见解和解决方案。如果您需要更多帮助或者有其他疑问,请不要犹豫与我们联系。

curl_exec?PHP中的curl_exec英文谷歌优化 英文网站该如何优化,怎么做谷歌seo排名