有的时候我们不想让用户直接在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

评论

 

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

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

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

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

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

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 minbear

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

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

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

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

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

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

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

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

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

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

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

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

YourFileData是什么?

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

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

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

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

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

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

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

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

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

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

# 好象跟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 Edison

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

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

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 yin

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

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

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

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

用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 xwycj

如果希望用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 gary

为什么下载框弹出2次

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

如何等到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 tt

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

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

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

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

谢谢 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 touch

to truly:

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

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

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

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

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

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

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

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

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

gghggh

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

gghggh

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

E3TGRETGR

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

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 swallow

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

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

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

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

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 meteor

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 xmliy

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

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

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

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

adf

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

shi ma

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

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

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

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 tim zhang

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 ddd

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

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

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

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

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

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

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

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

hrzsthsrtzht

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

hrzsthsrtzht

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

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

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

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

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

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:

http://matrix.foresee.cn/blogs/simon/archives/001680.html

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

 

----下面是我的代码--------------------------------------------------------------------------------------------

int id = int.Parse(context.Request.QueryString["id"]);
            string sendUserNo = context.Request.QueryString["sendUserNo"];
            string receiveUserNo = context.Request.QueryString["receiveUserNo"];
            Message message = new Message(id, sendUserNo, receiveUserNo);

            string name = context.Server.UrlEncode(message.FileName);

            string oppositeName = message.Filepath;
            string absoluteName = context.Server.MapPath(message.Filepath);
            FileStream fileStream = new FileStream(absoluteName, FileMode.Open,FileAccess.Read);
            long fileSize = fileStream.Length;

            context.Response.ContentType = "application/octet-stream";
            context.Response.AddHeader("Content-Disposition", "attachment;FileName=" + name);
            byte[] fileBuffer = new byte[fileSize];
            fileStream.Read(fileBuffer, 0, (int)fileSize);
            context.Response.BinaryWrite(fileBuffer);
            context.Response.End();


posted on 2006-07-20 16:58  阿米  阅读(6490)  评论(2编辑  收藏  举报