首页 新闻 会员 周边 捐助

请指点下。我在asp.net上下载一个.TXT文件 直接打开了是怎么回事?

0
悬赏园豆:10 [已解决问题] 解决于 2015-07-18 15:32

<a href="../help/一键录入格式.txt">下载模版</a> 一开始的时候可以实现的。而现在 直接打开了那个文件? 怎么回事?

凡事无绝对!的主页 凡事无绝对! | 初学一级 | 园豆:6
提问于:2015-07-15 16:40
< >
分享
最佳答案
1

首先a标签是用来打开指定href,不是用来下载   你给出的路径xx.txt浏览器会直接向iis请求这个文件(页面),然而你并没有在后台做处理所以iis按照默认的方式发送这个文件(Content-Type:text/plain),然后浏览器识别到这个txt/plain是直接呈现内容,不会下载

解决方案:

一般来说下载应该提供下载函数

public ActionResult Download()
{
    string path = Server.MapPath("/1.txt");
    return File(path, "application/octet-stream", "1.txt"); //application/octet-stream这个就是content-type告诉浏览器是下载而不是txt/plain打开
}
<a href="/Home/Download" target="_blank">下载</a>

提供下载函数的好处是你可以在代码中限制下载权限,公用就在download中价格参数,下载指定文件

收获园豆:5
jio92 | 小虾三级 |园豆:1064 | 2015-07-15 16:58

 Download() 在新打开的页面的 load 中 运行?ActionResult 是是什么东西?

凡事无绝对! | 园豆:6 (初学一级) | 2015-07-15 17:16

@凡是无绝对!: 他的意思是,你不应该直接将文件路径交给浏览器,让浏览器通过扩展名解析文件。而应该在你的后台建立一个方法,是用方法来读取文件,然后包装为你自己定义的数据类型,交给浏览器。而且在方法中还可以加入权限控制。

飞扬的尘埃 | 园豆:1318 (小虾三级) | 2015-07-15 17:20

@凡是无绝对!: 这个是mvc的action,就相当于一个页面或者是一般处理程序,你要是用的webform就写一个一般处理程序

public class download : IHttpHandler
    {

        public void ProcessRequest(HttpContext context)
        {
            string name = "1.txt";
            context.Response.ContentType = "application/octet-stream";
            context.Response.AddHeader("Content-Disposition", "attachment; filename=" + context.Server.UrlEncode(name));
            string path = context.Server.MapPath("/" + name);
            context.Response.WriteFile(path);
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
jio92 | 园豆:1064 (小虾三级) | 2015-07-15 17:24

@飞扬的尘埃: 那个方法的返回值是啥啊、 那个方法  报错了。     我真不明白这个ActionResult 咋 回事? 我不是用的mvc 。、 

凡事无绝对! | 园豆:6 (初学一级) | 2015-07-15 17:29

@凡是无绝对!: 一般处理程序你不晓得?  看不出上面那段代码是一般处理程序的结构?

jio92 | 园豆:1064 (小虾三级) | 2015-07-15 17:33

@jio92:  我 知道。

凡事无绝对! | 园豆:6 (初学一级) | 2015-07-15 17:42

@jio92: 这个还得再页面中还得处理么? 怎么处理啊?

凡事无绝对! | 园豆:6 (初学一级) | 2015-07-15 18:10
其他回答(2)
0

直接点击链接,浏览器会按照默认请求的ContentType进行文件处理,有个“另存为”选项我会乱说?

JeffWong | 园豆:2328 (老鸟四级) | 2015-07-15 17:16
0

直接原因就是 IIS 中 .txt 扩展名文件的 mime-type 默认是 text/plain
而浏览器对 text/plain 类型数据的默认解析方式是直接显示内容。

收获园豆:5
飞扬的尘埃 | 园豆:1318 (小虾三级) | 2015-07-15 17:18

那怎么解决啊?我看他们一般的处理方法是  生成压缩文件 。 。

支持(0) 反对(0) 凡事无绝对! | 园豆:6 (初学一级) | 2015-07-15 17:20

@凡是无绝对!: 如上所述,在后台方法中读取文件,包装为你自己定义的数据类型,压缩包也好,其他可下载的数据流也好,都可以。

支持(0) 反对(0) 飞扬的尘埃 | 园豆:1318 (小虾三级) | 2015-07-15 17:21

@飞扬的尘埃:  上述的代码是否 有问题。 我老是报错的。ActionResult 这个类型是什么我没看懂啊?好像是 mvc  里边的东西吧。

支持(0) 反对(0) 凡事无绝对! | 园豆:6 (初学一级) | 2015-07-15 17:25

@凡是无绝对!: 那个是MVC的写法,后台处理文件的方法可以写在任意位置,请求下载的时候,可以调用这个方法就行。

支持(0) 反对(0) 飞扬的尘埃 | 园豆:1318 (小虾三级) | 2015-07-15 17:31
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册