首页 新闻 赞助 找找看

下载远程服务器的文件,内容乱码

0
悬赏园豆:50 [待解决问题]


protected void Button1_Click()
{

//这个地址是内网的,外网无法访问
string fullfilename = "http://fileserver2.mm.gmcc.net/WorkFlowFilesNew/201602/c9e2eef3b4994daeb505a5a0012dc710.xls";
System.Net.WebClient net = new System.Net.WebClient();
Response.ClearHeaders();
Response.Clear();
Response.Expires = 0;
Response.Buffer = true;
//Response.ContentEncoding = Encoding.UTF8;
Response.AddHeader("Accept-Language", "zh-CN");
//获得文件类型
String strContentType = GetFileContentType(fullfilename.Substring(fullfilename.LastIndexOf(".")));
Response.ContentType = strContentType;
Response.AddHeader("Content-Disposition", "Attachment;FileName=" + fullfilename.Substring(fullfilename.LastIndexOf("/") + 1));
Response.BinaryWrite(net.DownloadData(fullfilename));
Response.End();
}

private string GetFileContentType(string fileExt)
{

string defaultContentType = "application/octet-stream";

RegistryKey hkcr = Registry.ClassesRoot;

RegistryKey filetype = hkcr.OpenSubKey(fileExt, false);
if (filetype != null)
{
object value = filetype.GetValue("Content Type");
if (value != null)
return (string)value;
else
return defaultContentType;
}
else
return defaultContentType;
}

 

通过以上代码,下载远程服务器的文件(内网的服务器,外网访问不了),下载过来之后,txt文件可以正常显示,但是其他的如xls,doc,zip文件都是乱码或者文件无法使用。

然后我把这段代码放去一个新建的项目,下载之后又都可以正常显示。我估计应该是编码的问题,我看了一下,在web.config文件,只有一个<globalization requestEncoding="utf-8" responseEncoding="utf-8"/>这里设置了编码,然后各种尝试了Response.ContentEncoding都不行,有没有大神有点思路的。

人者后卫的主页 人者后卫 | 初学一级 | 园豆:129
提问于:2017-12-11 09:01
< >
分享
所有回答(3)
1

DownloadData 原始获取即可。Stream是什么样就直接写成什么样。

花飘水流兮 | 园豆:13560 (专家六级) | 2017-12-11 11:14

你好,可以说详细点吗,接触.net不太久,不是非常熟悉。

因为是需要在手机网页打开,只能用浏览器自己的下载功能,stream流好像是需要指定保存路径的吧

支持(0) 反对(0) 人者后卫 | 园豆:129 (初学一级) | 2017-12-11 11:29

@人者后卫: 你愿意用webclient ,那么搜索“webclient 下载文件”,如:

http://www.cnblogs.com/x4646/archive/2013/04/11/3014634.html

这种编程设计模型很多语言都差不。

支持(0) 反对(0) 花飘水流兮 | 园豆:13560 (专家六级) | 2017-12-11 11:33

@花飘水流兮: 用webclient或者stream去下载的文件都可以正常显示,但是因为是手机网页打开,需要让浏览器自己去下载,我了解到的只有用Response输出流,但是Response下载的文件确一直都是乱码(框架是别人写的,我只是改功能,所以不太清楚他在其他地方设置了什么编码的东西,因为我在项目另外新建一个类然后用这个代码下载的文件也是乱码,但是我重新建一个新的项目用这个代码下载的文件就可以正常打开),所以想找一下编码方面的原因

支持(0) 反对(0) 人者后卫 | 园豆:129 (初学一级) | 2017-12-11 11:51

@人者后卫: 函数都有问题,你随便怎么调肯定都出问题。—— 除非你知道他怎么写的,再把编码反运算一次,然后把buffer写成文件。既然别人封装的,你就让他测试一个文件下载,而不是你去找问题。

支持(0) 反对(0) 花飘水流兮 | 园豆:13560 (专家六级) | 2017-12-11 12:59

@花飘水流兮: 函数是没问题的,因为我把这个下载函数放去一个新建的项目,下载文件后是可以正常打开的。而我在当前项目中,用stream或者webclient下载文件也没问题,但是我不想要自己设置下载路径,需要调用浏览器的下载功能(在手机网页打开),所以用了Response,就是用Response下载才会乱码的,所以想知道有什么地方是设置Response编码(我有设置Response.ContentEncoding = System.Text.Encoding.GetEncoding("UTF-8"),但是没用)

支持(0) 反对(0) 人者后卫 | 园豆:129 (初学一级) | 2017-12-11 15:09
0

如果你网页是GBK,默认解码成UTF8肯定乱码。
统一使用UTF8可以减少乱码的问题。

墨镜带佬星 | 园豆:2294 (老鸟四级) | 2017-12-13 01:55

不是网页啊,是下载某个doc或者xls之类的文件后文件内容乱码,但是下载txt的文件可以正常打开

支持(0) 反对(0) 人者后卫 | 园豆:129 (初学一级) | 2017-12-15 09:00
0

手机网页打开,不是一个超链接就可以了?

AshEs丶 | 园豆:251 (菜鸟二级) | 2017-12-25 14:50

这个是需要在微信企业号打开的,微信内部浏览器屏蔽掉了超链接之类的,只能通知浏览器自己下载

支持(0) 反对(0) 人者后卫 | 园豆:129 (初学一级) | 2017-12-26 11:16
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册