[.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