• 文件下载时,只弹出下载框,不在页面打开的方法。


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


  • 相关阅读:
    JUC学习
    java反射学习
    JSON入门学习
    redis
    NoSQ学习
    手写Lockl锁
    MapReduce过程
    scala学习
    idea jetty 配置
    java 基础--理论知识
  • 原文地址:https://www.cnblogs.com/ami/p/455760.html
Copyright © 2020-2023  润新知