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都不行,有没有大神有点思路的。
DownloadData 原始获取即可。Stream是什么样就直接写成什么样。
你好,可以说详细点吗,接触.net不太久,不是非常熟悉。
因为是需要在手机网页打开,只能用浏览器自己的下载功能,stream流好像是需要指定保存路径的吧
@人者后卫: 你愿意用webclient ,那么搜索“webclient 下载文件”,如:
http://www.cnblogs.com/x4646/archive/2013/04/11/3014634.html
这种编程设计模型很多语言都差不。
@花飘水流兮: 用webclient或者stream去下载的文件都可以正常显示,但是因为是手机网页打开,需要让浏览器自己去下载,我了解到的只有用Response输出流,但是Response下载的文件确一直都是乱码(框架是别人写的,我只是改功能,所以不太清楚他在其他地方设置了什么编码的东西,因为我在项目另外新建一个类然后用这个代码下载的文件也是乱码,但是我重新建一个新的项目用这个代码下载的文件就可以正常打开),所以想找一下编码方面的原因
@人者后卫: 函数都有问题,你随便怎么调肯定都出问题。—— 除非你知道他怎么写的,再把编码反运算一次,然后把buffer写成文件。既然别人封装的,你就让他测试一个文件下载,而不是你去找问题。
@花飘水流兮: 函数是没问题的,因为我把这个下载函数放去一个新建的项目,下载文件后是可以正常打开的。而我在当前项目中,用stream或者webclient下载文件也没问题,但是我不想要自己设置下载路径,需要调用浏览器的下载功能(在手机网页打开),所以用了Response,就是用Response下载才会乱码的,所以想知道有什么地方是设置Response编码(我有设置Response.ContentEncoding = System.Text.Encoding.GetEncoding("UTF-8"),但是没用)
如果你网页是GBK,默认解码成UTF8肯定乱码。
统一使用UTF8可以减少乱码的问题。
不是网页啊,是下载某个doc或者xls之类的文件后文件内容乱码,但是下载txt的文件可以正常打开
手机网页打开,不是一个超链接就可以了?
这个是需要在微信企业号打开的,微信内部浏览器屏蔽掉了超链接之类的,只能通知浏览器自己下载