有的时候我们不想让用户直接在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 这个名字的。
then why do you need duplicated info ?
can't you get the fileid from the filename ?
// 处理中文文件名
Page.Response.AddHeader("Content-Disposition","attachment; filename=" + HttpUtility.UrlEncode(fileName,Encoding.UTF8 ) );
还有一个问题:我想在ie中打开某个word文件,当在ie栏打入word文件的url地址(eg.http://192.168.0.222/upload/测试.doc)时,如果word文件的文件名含有偶数个汉字,必定是404错误(事实上对应url的word文件是真实存在的),excel文件也是如此.各位大侠有没有解决办法?
文件名改为奇数个汉字或英文也可解决,但我怎样才能不改名就能解决呢?
to: Truly--
[C#]
public static string UrlEncode(
string str
);
用URLEncode 文件名很容易就超长啊。而且Header长度有限制的.
ASP.NET 在Header 中始终不能用GB2312编码.
如果我的YourFileDate就是从文本里读出来的字符串,那这段“Response.BinaryWrite((byte[])YourFileData.Rows[0]["AttachmentContent"]);”该怎么写呢?
用了Response.End();结尾网页就不能往下执行了!
我的系统是winxp2003+ie6,是正常的
另一台机是win2kas + ie5,下载.doc文件时却时在ie中打开的
我想点击一次下载多个文件,每个文件下载时不弹出询问对话框,请问能实现吗?
Response.ContentType="application/ms-word";
String filename = Request.Params["filename"];
//中文文件名需要编码
Response.AddHeader( "content-disposition","attachment; filename="+HttpUtility.UrlEncode(filename,Encoding.UTF8 ) );
我想点击一次下载多个文件,每个文件下载时不弹出询问对话框,请问能实现吗?
用URLEncode 文件名很容易就超长啊。而且Header长度有限制的.
我是按照代码写的,但word就是不支持格式,我觉得是Response.contenttype 出错了,但不知道如何去改。还有,如果我的文件不只word的,还有PPt,text,jpg都已二进制存在数据库里,怎么下载。各位大哥在上,小妹有礼。请指教
如果希望用IE中打开WORD 而又不希望人家知道实际路径该怎么办呢?
为什么同一个文件用不同的文件名就不能下载了呢?
分机新新 .xls
分机新新+.xls
分机+新新.xls
用上面三个文件名下载失败。
分+机新新.xls
分机新+新.xls
用上面二个文件名下载成功。
在我下载完后,页面的左下方状态栏就出现错误“网页上有错误”,原因是在xx行拒绝访问。可能是由于ViewState。不知能否解决,请大家多多帮忙。
谢谢 HttpUtility.UrlEncode(fileName,Encoding.UTF8)
www.xmsongsheng.com
厦门松声宾馆由厦门扬帆电脑公司做的
有用到ASP
to truly:
你的那个偶数个汉字的问题解决了没有?
最近我也遇到了这个问题,希望大家帮忙!
谢谢
数据库中的文件路径是中文的,这样编码后就可以下载,不过文件名是乱码了
<a href ='<%#"admin/"+HttpUtility.UrlEncode(Eval("path").ToString(),Encoding.Default)%>'>本地下载</a>
能弄个例子上来吗!我试了,可是系统老是提醒我有问题,是不是那里没有做对!
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();
to:Carl
那個方法我用過,但是放到Excel中都是亂碼。怎麼辦?
下载EXE文件不行,生成的文件被破坏了,变成DOS文件,为什么呀?怎么样去掉下载框直接DOWN?
pFileName路径要怎么得到啊,我现在只能实现写绝对路径(譬如"d:\"+filename)到本地磁盘,没办法弹出系统的下载对话框耶.
各位高人指点下吧!
我想在客户端直接打开CHM文件不想让其弹出下载对话框我该怎么作呀?
请教高手指点
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();
小声的问:我现在的问题刚好相反:怎样把文件流(不要保存成服务端文件的)直接在IE中打开(如excel)?
用Response.Redirect("test.xls"),还是提示下载啊!
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
{
}
}
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
FileStream fileStream=new FileStream("C:\\doc\\test.doc",FileMode.Open);
这个需要是绝对地址,如果我发布后,这样用就不可以了吧,怎么改成相对地址啊?
高人们写东西就是有深度....虽然知道解决办法就在其中,可我就是看不懂.....真着急........
关于偶数个中文字符我实验了一下,如果上传文件是“你好.txt”,则不行,如果是“你好吗.txt”,则可以。但问题不在这里,我们看“你a好吗.txt”也不行,而“你好a吗.txt”则可以,所以问题的关键不在于汉字总数是否偶数个,而在于最后一个半角字符后面有偶数个还是奇数个全角字符,至于解决方法大家自己定吧,我就是在文件名后加个数字什么的然后又加了个“_”(全角)就可以了。其实最好还是用个linkbutton之类的
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();
评论