ASP.NET直接下载一个文件,而不是在IE中打开它

转载 2006年06月10日 04:11:00

[.NET Tips 1001]ASP.NET直接下载一个文件,而不是在IE中打开它

有的时候我们不想让用户直接在IE中打开已知类型的文件,比如Word,而希望能直接下载,这时候可用下面代码来替换Response.Redirect

Response.ContentType = "application/octet-stream";
Response.AddHeader("Content-Disposition", "attachment;FileName="+YourFileName);
Response.BinaryWrite((byte[])YourFileData.Rows[0]["AttachmentContent"]);
Response.End();

发表于 2004年5月25日 15:00

评论

 

补充一下。通常我喜欢把链接做成这样:

<a href="download.aspx/hello.chm?fileid=12345">hello.chm</a>

这样客户端下载的时候默认是 hello.chm 这个名字的。

 回复: [.NET Tips 1001]ASP.NET直接下载一个文件,而不是在IE中打开它 2004-5-25 16:07

then why do you need duplicated info ?
can't you get the fileid from the filename ?

 回复: [.NET Tips 1001]ASP.NET直接下载一个文件,而不是在IE中打开它 2004-5-25 20:27

如果有中文名称是需要做编码转换的,要不可能会出现乱码~

 回复: [.NET Tips 1001]ASP.NET直接下载一个文件,而不是在IE中打开它 2004-5-25 23:23

而且文件名中间有空格是没有办法处理的

 回复: [.NET Tips 1001]ASP.NET直接下载一个文件,而不是在IE中打开它 2004-5-26 9:36

// 处理中文文件名
Page.Response.AddHeader("Content-Disposition","attachment; filename=" + HttpUtility.UrlEncode(fileName,Encoding.UTF8 ) );

 回复: [.NET Tips 1001]ASP.NET直接下载一个文件,而不是在IE中打开它 2004-5-26 9:42

还有一个问题:我想在ie中打开某个word文件,当在ie栏打入word文件的url地址(eg.)时,如果word文件的文件名含有偶数个汉字,必定是404错误(事实上对应url的word文件是真实存在的),excel文件也是如此.各位大侠有没有解决办法?
文件名改为奇数个汉字或英文也可解决,但我怎样才能不改名就能解决呢?

 回复: [.NET Tips 1001]ASP.NET直接下载一个文件,而不是在IE中打开它 2004-5-26 21:28

to: Truly--
[C#]
public static string UrlEncode(
string str
);

 回复: [.NET Tips 1001]ASP.NET直接下载一个文件,而不是在IE中打开它 2004-5-28 11:38

我可不可以再IE中直接链接打开服务器端的chm文件?

 回复: [.NET Tips 1001]ASP.NET直接下载一个文件,而不是在IE中打开它 2004-5-30 14:09

YourFileData是什么?

 回复: [.NET Tips 1001]ASP.NET直接下载一个文件,而不是在IE中打开它 2004-6-10 13:08

用URLEncode 文件名很容易就超长啊。而且Header长度有限制的.

 回复: [.NET Tips 1001]ASP.NET直接下载一个文件,而不是在IE中打开它 2004-6-10 13:09

ASP.NET 在Header 中始终不能用GB2312编码.

 回复: [.NET Tips 1001]ASP.NET直接下载一个文件,而不是在IE中打开它 2004-7-14 21:35

如果我的YourFileDate就是从文本里读出来的字符串,那这段“Response.BinaryWrite((byte[])YourFileData.Rows[0]["AttachmentContent"]);”该怎么写呢?

 一定要用Response.End();结尾吗? 2004-8-6 11:44

用了Response.End();结尾网页就不能往下执行了!

 一定要用Response.End();结尾吗? 2004-8-6 11:48

我想在下载完毕后自动刷新当前页就不行了!

 好象跟IE版本有关 2004-8-18 22:39

我的系统是winxp2003+ie6,是正常的

另一台机是win2kas + ie5,下载.doc文件时却时在ie中打开的

 re: [.NET Tips 1001]ASP.NET直接下载一个文件,而不是在IE中打开它 2004-8-20 12:02

我想点击一次下载多个文件,每个文件下载时不弹出询问对话框,请问能实现吗?

 re: [.NET Tips 1001]ASP.NET直接下载一个文件,而不是在IE中打开它 2004-8-23 11:34

怎样把当前网页转换成word文档下载呢?

 re: [.NET Tips 1001]ASP.NET直接下载一个文件,而不是在IE中打开它 2004-9-1 10:43

Response.ContentType="application/ms-word";
String filename = Request.Params["filename"];
//中文文件名需要编码
Response.AddHeader( "content-disposition","attachment; filename="+HttpUtility.UrlEncode(filename,Encoding.UTF8 ) );

 re: [.NET Tips 1001]ASP.NET直接下载一个文件,而不是在IE中打开它 2004-9-1 16:33

YourFileData:是怎么得来的啊,纳闷

 re: [.NET Tips 1001]ASP.NET直接下载一个文件,而不是在IE中打开它 2004-9-3 15:57

我想点击一次下载多个文件,每个文件下载时不弹出询问对话框,请问能实现吗?

 re: [.NET Tips 1001]ASP.NET直接下载一个文件,而不是在IE中打开它 2004-9-7 18:41

用URLEncode 文件名很容易就超长啊。而且Header长度有限制的.

 re: [.NET Tips 1001]ASP.NET直接下载一个文件,而不是在IE中打开它 2004-9-11 20:31

我是按照代码写的,但word就是不支持格式,我觉得是Response.contenttype 出错了,但不知道如何去改。还有,如果我的文件不只word的,还有PPt,text,jpg都已二进制存在数据库里,怎么下载。各位大哥在上,小妹有礼。请指教

 re: [.NET Tips 1001]ASP.NET直接下载一个文件,而不是在IE中打开它 2004-9-19 21:42

如果希望用IE中打开WORD 而又不希望人家知道实际路径该怎么办呢?

 re: [.NET Tips 1001]ASP.NET直接下载一个文件,而不是在IE中打开它 2004-9-21 17:12

可以参考以下邮件的附件下载方式吗

 re: [.NET Tips 1001]ASP.NET直接下载一个文件,而不是在IE中打开它 2004-10-8 12:42

为什么同一个文件用不同的文件名就不能下载了呢?
分机新新 .xls
分机新新+.xls
分机+新新.xls
用上面三个文件名下载失败。
分+机新新.xls
分机新+新.xls
用上面二个文件名下载成功。

 re: [.NET Tips 1001]ASP.NET直接下载一个文件,而不是在IE中打开它 2004-10-14 14:32

为什么下载框弹出2次

 re: [.NET Tips 1001]ASP.NET直接下载一个文件,而不是在IE中打开它 2004-10-20 10:19

如何等到YourFileData??

 re: [.NET Tips 1001]ASP.NET直接下载一个文件,而不是在IE中打开它 2004-10-25 10:02

在我下载完后,页面的左下方状态栏就出现错误“网页上有错误”,原因是在xx行拒绝访问。可能是由于ViewState。不知能否解决,请大家多多帮忙。

 re: [.NET Tips 1001]ASP.NET直接下载一个文件,而不是在IE中打开它 2004-11-5 16:00

弄个例子贴上阿,怎么说的不明不白的,难道这样才有深度么。

 re: [.NET Tips 1001]ASP.NET直接下载一个文件,而不是在IE中打开它 2004-11-19 15:09

对于你们我没什么要求,但是我看不懂不什么意思啊

 re: [.NET Tips 1001]ASP.NET直接下载一个文件,而不是在IE中打开它 2004-11-21 11:45

谢谢 HttpUtility.UrlEncode(fileName,Encoding.UTF8)

 re: [.NET Tips 1001]ASP.NET直接下载一个文件,而不是在IE中打开它 2004-12-15 13:51

www.xmsongsheng.com
厦门松声宾馆由厦门扬帆电脑公司做的
有用到ASP

 re: [.NET Tips 1001]ASP.NET直接下载一个文件,而不是在IE中打开它 2004-12-17 11:15

to truly:

你的那个偶数个汉字的问题解决了没有?
最近我也遇到了这个问题,希望大家帮忙!
谢谢

 re: [.NET Tips 1001]ASP.NET直接下载一个文件,而不是在IE中打开它 2004-12-23 16:54

我也遇到了偶数个汉字问题,希望大家帮忙

 re: [.NET Tips 1001]ASP.NET直接下载一个文件,而不是在IE中打开它 2004-12-25 19:34

数据库中的文件路径是中文的,这样编码后就可以下载,不过文件名是乱码了

<a href ='<%#"admin/"+HttpUtility.UrlEncode(Eval("path").ToString(),Encoding.Default)%>'>本地下载</a>

 re: [.NET Tips 1001]ASP.NET直接下载一个文件,而不是在IE中打开它 2005-4-18 10:17

能弄个例子上来吗!我试了,可是系统老是提醒我有问题,是不是那里没有做对!

 re: [.NET Tips 1001]ASP.NET直接下载一个文件,而不是在IE中打开它 2005-4-26 19:06

gghggh

 re: [.NET Tips 1001]ASP.NET直接下载一个文件,而不是在IE中打开它 2005-4-26 19:06

gghggh

 re: [.NET Tips 1001]ASP.NET直接下载一个文件,而不是在IE中打开它 2005-4-26 19:08

E3TGRETGR

 re: [.NET Tips 1001]ASP.NET直接下载一个文件,而不是在IE中打开它 2005-5-18 9:14

FileStream fileStream=new FileStream(pFileName,FileMode.Open)
long fileSize = fileStream.Length;
Context.Response.ContentType="application/octet-stream";
Context.Response.AddHeader("Content-Disposition","attachment; filename=/"" + fileName + "/";");
Context.Response.AddHeader("Content-Length",fileSize.ToString());
byte[] fileBuffer=new byte[fileSize];
fileStream.Read(fileBuffer, 0, (int)fileSize);
Context.Response.BinaryWrite(fileBuffer);
Context.Response.End();

 re: [.NET Tips 1001]ASP.NET直接下载一个文件,而不是在IE中打开它 2005-6-3 13:53

to:Carl
那個方法我用過,但是放到Excel中都是亂碼。怎麼辦?

 re: [.NET Tips 1001]ASP.NET直接下载一个文件,而不是在IE中打开它 2005-7-8 16:55

下载EXE文件不行,生成的文件被破坏了,变成DOS文件,为什么呀?怎么样去掉下载框直接DOWN?

 re: [.NET Tips 1001]ASP.NET直接下载一个文件,而不是在IE中打开它 2005-7-20 10:31

pFileName路径要怎么得到啊,我现在只能实现写绝对路径(譬如"d:/"+filename)到本地磁盘,没办法弹出系统的下载对话框耶.
各位高人指点下吧!

 re: [.NET Tips 1001]ASP.NET直接下载一个文件,而不是在IE中打开它 2005-7-27 12:11

我想在客户端直接打开CHM文件不想让其弹出下载对话框我该怎么作呀?
请教高手指点

 re: [.NET Tips 1001]ASP.NET直接下载一个文件,而不是在IE中打开它 2005-8-12 15:04

FileStream fileStream=new FileStream("C://doc//test.doc",FileMode.Open);
long fileSize = fileStream.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",fileSize.ToString());
byte[] fileBuffer=new byte[fileSize];
fileStream.Read(fileBuffer, 0, (int)fileSize);
fileStream.Close();
Context.Response.BinaryWrite(fileBuffer);
Context.Response.End();

 re: [.NET Tips 1001]ASP.NET直接下载一个文件,而不是在IE中打开它 2005-10-27 10:12

下载完后如何才能关掉当前页

 re: [.NET Tips 1001]ASP.NET直接下载一个文件,而不是在IE中打开它 2005-11-4 12:06

这个方法可以下载,文件名称过长(大于17个汉字)怎么处理?

 re: [.NET Tips 1001]ASP.NET直接下载一个文件,而不是在IE中打开它 2005-11-9 10:33

adf

 re: [.NET Tips 1001]ASP.NET直接下载一个文件,而不是在IE中打开它 2005-11-16 23:39

shi ma

 re: [.NET Tips 1001]ASP.NET直接下载一个文件,而不是在IE中打开它 2005-11-18 13:18

小声的问:我现在的问题刚好相反:怎样把文件流(不要保存成服务端文件的)直接在IE中打开(如excel)?
用Response.Redirect("test.xls"),还是提示下载啊!

 re: [.NET Tips 1001]ASP.NET直接下载一个文件,而不是在IE中打开它 2005-12-2 14:29

private void Button1_Click(object sender, System.EventArgs e)
{
try
{

string str = "<html>";
for(int page=0; page<4; page++)
{
str += "<TABLE borderColor='black' cellSpacing='0' borderColorDark='white' cellPadding='3' border='1'>";
str += "<tr><th>描述</th></tr>";
for(int i=1; i< 10; i++)
{
str =str + "<tr><td>测试" + i.ToString() + "</td></tr>";

}
str +="</table>";

//.doc 换页
str +="<br clear=all style='mso-special-character:line-break;page-break-before:always'>";
}

str += "</html>";

byte[] buff = System.Text.Encoding.Unicode.GetBytes(str);
//byte[] buff = System.Text.Encoding.UTF8.GetBytes(str);

byte[] outBuff = new byte[buff.Length + 2];

// 使用文件流方式写入UniCode编码的doc文件。
byte[] mark = {0xFF,0xFE} ;
outBuff[0] = mark[0];
outBuff[1] = mark[1];

for(int i=0; i< buff.Length; i++)
{
outBuff[i+2] = buff[i];
}

Context.Response.ContentType="application/octet-stream";
string fileName = "测试.doc";
Context.Response.AddHeader("Content-Disposition","attachment; filename=/"" + HttpUtility.UrlEncode(fileName,System.Text.Encoding.UTF8) + "/"");

Context.Response.AddHeader("Content-Length",outBuff.Length.ToString());
Response.BufferOutput = true;
Response.Clear();
Context.Response.BinaryWrite(outBuff);
Context.Response.End();




}
catch(Exception ex)
{
ex.ToString();
}
finally
{

}

}

 re: [.NET Tips 1001]ASP.NET直接下载一个文件,而不是在IE中打开它 VB Code 2005-12-8 18:17

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim FileName As String = "D:/wwwroot/classfile/1000000019.doc"
Dim fileStream As New FileStream(FileName, FileMode.Open)
Dim fileSize As Long = fileStream.Length
Dim inta As Integer = CInt(fileSize)

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", fileSize.ToString())
Dim fileBuffer(inta) As Byte
fileStream.Read(fileBuffer, 0, inta)
fileStream.Close()
Context.Response.BinaryWrite(fileBuffer)
Context.Response.End()

End Sub

 re: [.NET Tips 1001]ASP.NET直接下载一个文件,而不是在IE中打开它 2005-12-14 22:46

FileStream fileStream=new FileStream("C://doc//test.doc",FileMode.Open);
这个需要是绝对地址,如果我发布后,这样用就不可以了吧,怎么改成相对地址啊?

 re: [.NET Tips 1001]ASP.NET直接下载一个文件,而不是在IE中打开它 2005-12-24 13:19

高人们写东西就是有深度....虽然知道解决办法就在其中,可我就是看不懂.....真着急........

 re: [.NET Tips 1001]ASP.NET直接下载一个文件,而不是在IE中打开它 2006-2-16 13:06

忠心感谢各位,你们的讨论让我受益很多,真的感谢!

 re: [.NET Tips 1001]ASP.NET直接下载一个文件,而不是在IE中打开它 2006-2-17 16:47

YourFileData怎么得来的呀?????????

 re: [.NET Tips 1001]ASP.NET直接下载一个文件,而不是在IE中打开它 2006-2-25 0:02

hrzsthsrtzht

 re: [.NET Tips 1001]ASP.NET直接下载一个文件,而不是在IE中打开它 2006-2-25 0:02

hrzsthsrtzht

 re: [.NET Tips 1001]ASP.NET直接下载一个文件,而不是在IE中打开它 2006-3-1 14:55

关于偶数个中文字符我实验了一下,如果上传文件是“你好.txt”,则不行,如果是“你好吗.txt”,则可以。但问题不在这里,我们看“你a好吗.txt”也不行,而“你好a吗.txt”则可以,所以问题的关键不在于汉字总数是否偶数个,而在于最后一个半角字符后面有偶数个还是奇数个全角字符,至于解决方法大家自己定吧,我就是在文件名后加个数字什么的然后又加了个“_”(全角)就可以了。其实最好还是用个linkbutton之类的

 re: [.NET Tips 1001]ASP.NET直接下载一个文件,而不是在IE中打开它 2006-3-24 16:40

可能是我的道行不够吧!
没有一个看明白的

 re: [.NET Tips 1001]ASP.NET直接下载一个文件,而不是在IE中打开它 2006-4-19 10:01

Reference:



Net HttpUtility.UrlEncode 的一个问题
在用 ASP.Net 开发页面的时候, 我们常常通过 System.Web.HttpUtility.UrlEncode 和 UrlDecode 在页面间通过 URL 传递参数. 成对的使用 Encode 和 Decode 是没有问题的.

但是, 我们在编写文件下载的页面的时候, 常常用如下方法来指定下载的文件的名称:
Response.AddHeader("Content-Disposition","attachment; filename="
+ HttpUtility.UrlEncode(fileName, Encoding.UTF8));
之所以转换成 UTF8 是为了支持中文文件名.

这时候问题就来了, 因为 HttpUtility.UrlEncode 在 Encode 的时候, 将空格转换成加号('+'), 在 Decode 的时候将加号转为空格, 但是浏览器是不能理解加号为空格的, 所以如果文件名包含了空格, 在浏览器下载得到的文件, 空格就变成了加号.

一个解决办法是, 在 HttpUtility 的 UrlEncode 之后, 将 "+" 替换成 "%20"( 如果原来是 "+" 则被转换成 "%2b" ) , 如:
fileName = HttpUtility.UrlEncode(fileName, Encoding.UTF8);
fileName = fileName.Replace("+", "%20");
不明白微软为什么要把空格转换成加号而不是"%20". 记得 JDK 的 UrlEncoder 是将空格转换成 "%20"的.
经检查, 在 .Net 2.0 也是这样.

Blog url:



 re: [.NET Tips 1001]ASP.NET直接下载一个文件,而不是在IE中打开它 2006-6-3 13:39

ASDASDASD

# 回复: [tip 1001]ASP.NET直接下载一个文件,而不是在IE中打开它 2004-5-25 15:06 Lostinet

文件的上传与下载(备java基础,jsp,servlet,tomcat)

-
  • 1970年01月01日 08:00

vb.net or vb判断文件是否执行中(打开状态)

 Private Declare Function lopen Lib "kernel32" Alias "_lopen" _       (ByVal lpPathName As Strin...
  • jsjpanxiaoyu
  • jsjpanxiaoyu
  • 2016-01-20 16:33:59
  • 1871

VB.net 点击下载文件

 下载动态产生的文件可以用以下代码:         Response.ClearHeaders()        Response.Clear()        Response.Expires =...
  • stevenhzhang
  • stevenhzhang
  • 2008-01-17 07:24:00
  • 751

VB.net实现双击文件启动软件并打开文件

VB.net开发的应用程序是支持命令行参数的,可以用My.Application.CommandLineArgs()语句来判断软件启动时是否附带相应的命令行参数。 在windows操作系统环境下,当...
  • irix2008
  • irix2008
  • 2013-06-09 22:47:05
  • 1300

vb.net 读写文件

读取和写入文件  以下示例将一行文本写入文件。  ' Write text to a file Sub WriteTextToFile() Dim file As New System.I...
  • myinc
  • myinc
  • 2013-12-30 09:24:40
  • 1460

VB.net 文件读取、写入、追加操作

Dim PathUserData As String = Application.StartupPath & "\实操统计sql.txt" TextTB.Text = System.IO.File.R...
  • wang19850219
  • wang19850219
  • 2014-11-27 10:49:46
  • 7086

vb.net 打开pdf文件

Public Overloads Shared Function FN_ExecuteCmd(ByVal strFileName As String) As String         Dim m...
  • shuicaohui5
  • shuicaohui5
  • 2013-04-10 08:12:22
  • 2196

文件关联后vb.net 软件如何响应被关联文件的双击事件

Windows系统很早就加入了文件关联的功能,它大大增加了日常使用操作系统的便利性。所谓的文件关联就是指系统把指定扩展名的文件自动关联到相应的应用程序,比如.doc文件默认情况下就自动和Microso...
  • wang19850219
  • wang19850219
  • 2014-12-04 15:44:12
  • 849

VB.net文件操作

文件读写整理: 1.文件度
  • ecjtuAndy
  • ecjtuAndy
  • 2014-08-24 12:20:58
  • 2307

(VB6)如何默认点击使用Webbrowser打开Office时出现的“您要打开还是保存此文件?”的打开按钮

点击“打开”按钮的思路:       当跳出对话框的时候,程序被挂在,程序不能直接跑到点击代码里,需要开一个线程进行点击。在VB6里,可以用Timer控件进行定时执行点击动作,实现类似线程的功能。 ...
  • liang_tb
  • liang_tb
  • 2016-10-07 19:38:06
  • 946
收藏助手
不良信息举报
您举报文章:ASP.NET直接下载一个文件,而不是在IE中打开它
举报原因:
原因补充:

(最多只允许输入30个字)