柚子Nan--回归原点

Everything can be as easy as you like or as complex as you need.
posts - 232, comments - 983, trackbacks - 17, articles - 29
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

服务器上有很多文件,目前考虑的格式有:

.bmp  .jpg    .gif    .doc    .xls   .txt    .pdf   .ppt   

我可以得到这些文件的路径,要求是在页面上显示这些文件的内容,我测试了所有格式的图片都是可以用Response.WriteFile(fileName)写到浏览器上。

但是其他格式的文件都是乱码?请问怎么解决啊?

 

代码如下:

protected System.Web.UI.WebControls.DropDownList drpFileList;
private void Page_Load(object sender, System.EventArgs e)
        
{
            
if(!IsPostBack)
            
{
                drpFileList.Items.Add(
"");
                drpFileList.Items.Add(
@"D:\TestMM\pic31673.JPG");
                drpFileList.Items.Add(
@"D:\TestMM\test.txt");
                drpFileList.Items.Add(
@"D:\TestMM\test.doc");
                drpFileList.Items.Add(
@"D:\TestMM\test.xls");
                drpFileList.Items.Add(
@"D:\TestMM\test.ppt");
                drpFileList.Items.Add(
@"D:\TestMM\test.pdf");
                drpFileList.SelectedIndex 
= 0;
            }

        }


private void drpFileList_SelectedIndexChanged(object sender, System.EventArgs e)
        
{
            Response.Clear();
            Response.Charset 
= "utf-8";
            Response.Buffer
= true;
            
this.EnableViewState = false;
            Response.ContentEncoding 
= System.Text.EncodingL.UTF8;            

            
// 昨天晚上在问灵感之源和dudu的时候把inline写成了online,一直出错!
             // 网上有些例子是错误的,例如http://www.knowsky.com/list.asp?id=4870
            Response.AppendHeader("Content-Disposition","inline;filename=" + drpFileList.SelectedItem.Text); 
            Response.WriteFile(drpFileList.SelectedItem.Text);    

            Response.End();
        }

 

 

昨天晚上问了灵感之源dudu,目前还没有解决!

我在想,如果不管什么格式的文件都显示,这样的需求可以实现吗?

之所以可以Response.WriteFile(fileName)显示图片,是因为浏览器默认可以打开图片,而其他格式的文件都不可以,但是.txt也不可以就有点奇怪了?

 

Feedback

#1楼    回复  引用    

2004-10-14 16:45 by 问题男 [未注册用户]
首先说明一下,本人不懂asp.net,仅从http协议来谈一谈

在协议包头中设定Content-Type可以告知浏览器传回数据的类型,比如pdf文件,就设为Content-Type: application/pdf,不知道是不是这个问题呢

具体如何用.net实现,而且”能否不考虑文件的类型”,我就不知道了

不知楼主“直接把文件显示到浏览器”是什么意思,是否是让浏览器以一堆文本乱码的形式显示比如一个doc

#2楼    回复  引用  查看    

2004-10-14 16:47 by caca      
.txt默认 也可以打开吧
其他的文件格式例如.doc里面包含特定文件格式代码,例如:
{\rtf1\ansi\ansicpg936\deff0\deflang1033\deflangfe2052{\fonttbl{\f0\fmodern\fprq6\fcharset134 \'cb\'ce\'cc\'e5;}}
{\*\generator Msftedit 5.41.21.2500;}\viewkind4\uc1\pard\lang2052\f0\fs20 dfdfdsfdsf\par
\par
}
所以,用Response.WriteFile也不行,只有抽取里面的特定文本来显示了。

#3楼    回复  引用  查看    

2004-10-14 16:48 by caca      
晕,rtf参见
http://www.cnblogs.com/MyDreamMyLife/archive/2004/10/14/52320.aspx

#4楼 [楼主]   回复  引用  查看    

2004-10-14 17:03 by 柚子Nan      
@问题男
要求就是把文件的内容按照正确的格式显示到页面上!


@caca
txt默任打开以后,汉字是乱码,我用的是utf-8

#5楼    回复  引用    

2004-10-14 17:28 by 问题男 [未注册用户]
那就是,比如一个pdf,则要求浏览器创建一个内嵌的reader来阅读之了?

那么我想我先前所描述的方法就可以实现,也看到你使用了,就是HttpResponse.AppendHeader这个方法

可以简单的根据扩展名设置不同的Content-Type。比如pdf文件,Response.AppendHeader("Content-Type","application/pdf");

其他的可以参见rfc

#6楼    回复  引用    

2004-10-14 17:32 by 问题男 [未注册用户]
查了查msdn,有HttpResponse.ContentType属性,那就无需用HttpResponse.AppendHeader了

文件不要加编码,直接writefile

#7楼 [楼主]   回复  引用  查看    

2004-10-15 09:35 by 柚子Nan      
谢谢问题男 ,
我已经解决了msword,vnd.ms-excel,vnd.ms-powerpoint和各种图片,
但是有个这样的问题,每次打开文件都会提示你保存还是打开!
有没有办法不让弹出这个对话矿,默认直接打开?

另外,pdf还没有找到正确的Content-Type是什么?

#8楼 [楼主]   回复  引用  查看    

2004-10-15 10:05 by 柚子Nan      
如果txt文件设置Response.ContentType="text/plain";
那么显示的是乱码,如果使用默认的Response.ContentType = "text/HTML"; 那么显示出来汉字,但是格式丢失了,我的意思是回车和tab都都是了

Response.ContentType="application/pdf";这个好象不正确!

#9楼    回复  引用    

2004-10-15 14:18 by 问题男 [未注册用户]
呵呵,毕竟不是搞这方面应用的,我所知有限

先前我是在google上随便搜了一个pdf,打开后就是你所需要的效果,于是我想只要封包和这个一样效果必然也是一样的,然后在打开这个文件的同时截获了网络封包,看到ContentType: application/pdf,如果不是我也不清楚该是什么了,呵呵

这样吧,我在帮你看看rfc,如果有什么收获再来交流

#10楼 [楼主]   回复  引用  查看    

2004-10-15 14:24 by 柚子Nan      
如果不使用这种方式,另外一种方式真的可以不用关心文件的类型

关键点: 用脚本控制,在本窗口打开window.location.href=文件名,
在新窗口打开window.open(‘文件名’),

另外,rtf,doc,ppt,xls,xml,html用
Response.ContentType="application/msword";
Response.ContentType="application/vnd.ms-excel";
Response.ContentType="application/vnd.ms-powerpoint";
Response.ContentType = "text/xml";
Response.ContentType = "text/HTML";

#11楼    回复  引用    

2004-10-15 14:24 by 问题男 [未注册用户]
quote:
但是有个这样的问题,每次打开文件都会提示你保存还是打开!
有没有办法不让弹出这个对话矿,默认直接打开?
----------------------------------------------------------------------------

有哪几种格式会有提示?还是全部都有?

#12楼    回复  引用    

2004-10-15 14:41 by 问题男 [未注册用户]
qoute:
如果不使用这种方式,另外一种方式真的可以不用关心文件的类型

关键点: 用脚本控制,在本窗口打开window.location.href=文件名,
在新窗口打开window.open(‘文件名’),
------------------------------------------------------------------------------------------

这种方式就是直接向http服务器请求资源了,服务器发现不是网页也不是支持的脚本(aspx、asp、php等等)会自动设置文件的content type和你主动设置是一样的

你不妨截获封包看看两种方式的差别,就能找到原因了,毕竟http包是一致的在client端就不会有不同

btw:
我刚刚看了看
http://www.faqs.org/rfcs/rfc1521.html 介绍mime的
http://www.isi.edu/in-notes/iana/assignments/media-types/media-types 蛮全的列表
好像pdf就是application/pdf

#13楼 [楼主]   回复  引用  查看    

2004-10-15 14:44 by 柚子Nan      
doc xls ppt rtf 都会弹出对话框,但是还是可以打开的
pdf估计是ContentType没有设置正确
我使用string strScript = "<script>window.location.href='"+"test.pdf"+"'; </script>";
Response.Write(strScript);
可以打开了pdf,没有问题的,这样就不属于同一种机制了

xml不会,而且格式正确
txt,html不会,但是格式错误,把回车都删除了

#14楼    回复  引用    

2004-10-15 14:48 by 问题男 [未注册用户]
如果可以,你将两种方法都做一个页面,就用pdf好了,我帮你看看

#15楼    回复  引用    

2005-05-14 11:32 by 袁龙友 [未注册用户]
Response.Clear();
Response.AppendHeader("Content-Disposition","inline;filename=result.doc");
Response.ContentType="application/ms-word";
Response.WriteFile(Server.MapPath("Yuan.doc"));

#16楼    回复  引用    

2005-07-20 09:47 by flying88 [未注册用户]
ContentType可以在注册表的CLASSES_ROOT中查到。

#17楼    回复  引用  查看    

2005-08-28 13:14 by 卡卡.net      
今天我遇到的这个问题,在这里说一下,我想让用户点击一个Button然后,直接保存一个Bmp图片(不是直接在网页中打开),不知道怎样设置。
BTW:设置为“application/bmp”,默认会用Mspaint直接打开.

#18楼    回复  引用  查看    

2005-08-29 09:29 by 柚子Nan      
Response.AppendHeader("Content-Disposition","inline;filename=" + drpFileList.SelectedItem.Text);
你把inline;改成另外一个attachment试试看

#19楼    回复  引用  查看    

2005-09-08 22:03 by 周奔驰      
http://www.utoronto.ca/ian/books/xhtml1/mime/mimetype.html

#20楼    回复  引用  查看    

2005-09-09 00:29 by 周奔驰      
在数据库中保存下HtmlInputFile.PostedFile.ContentType就可以实现打开任何类型的文件了
Response.Clear();
Response.AppendHeader("Content-Disposition","inline;filename=result.doc");
Response.ContentType=数据库中的类型值;
Response.WriteFile(Server.MapPath("Yuan.doc"));

#21楼    回复  引用    

2006-02-05 15:17 by dwhou [未注册用户]
打开注册表的HKEY_CLASSES_ROOT分支,就可以看到所有的Content-Type了。
不知道我说的对不对呢??

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2004-10-15 14:58 编辑过


相关链接: