`
fp_moon
  • 浏览: 983101 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

解决webserver在IE下载文件,文件名为乱码问题

c 
阅读更多
通常使用以下代码就能导出为流的文件,而不是打开文件
	websWrite(wp, T("HTTP/1.1 200 OK\n"));
	websWrite(wp, T("Pragma: no-cache\n"));
	websWrite(wp, T("Cache-control: no-cache\n"));
	websWrite(wp, T("Content-Length: %ld\n"),sbufs.st_size);
	websWrite(wp, T("Content-Type: application/force-download\n"));
	websWrite(wp, T("Content-Type: application/vnd.ms-excel; charset=utf-8\n"));
//	websWrite(wp, T("Content-type: application/octet-stream\n"));
	websWrite(wp, T("Content-Transfer-Encoding: binary\r\n"));
	websWrite(wp, T("Content-Disposition: attachment; filename=\"%s\"\n\n"),pname);

webserver支持下载的函数:
/** 
* @brief URLEncode 对字符串URL编码 
* 
* @param str 原字符串 
* @param strSize 原字符串长度(不包括最后的\0) 
* @param result 结果缓冲区的地址 
* @param resultSize 结果缓冲区的大小(包括最后的\0) 
* 
* @return: >0:resultstring 里实际有效的长度 
*            0: 解码失败. 
*/  
int URLEncode(const char* str, const int strSize, char* result, const int resultSize)  
{  
    int i;  
    int j = 0;//for result index  
    char ch;  
  
    if ((str==NULL) || (result==NULL) || (strSize<=0) || (resultSize<=0)) {  
        return 0;  
    }  
  
    for ( i=0; (i<strSize)&&(j<resultSize); ++i) {  
        ch = str[i];  
        if (((ch>='A') && (ch<'Z')) ||  
            ((ch>='a') && (ch<'z')) ||  
            ((ch>='0') && (ch<'9'))) {  
            result[j++] = ch;  
        } else if (ch == ' ') {  
            result[j++] = '+';  
        } else if (ch == '.' || ch == '-' || ch == '_' || ch == '*') {  
            result[j++] = ch;  
        } else {  
            if (j+3 < resultSize) {  
                sprintf(result+j, "%%%02X", (unsigned char)ch);  
                j += 3;  
            } else {  
                return 0;  
            }  
        }  
    }  
  
    result[j] = '\0';  
    return j;  
}  
#define BUFFER_SIZE 2048
static void downloadFiles(webs_t wp, char_t *path, char_t *query) 
{
	char _filePath[1024]={0},encodFilename[1024]={0};
	char *fileName,*file_path,*browser,*pname;
	unsigned char data[BUFFER_SIZE]={0};
	char err_msg[256];
	long  count;
	struct stat sbufs;
	FILE  *src;
	
	fileName = websGetVar(wp, T("downFileName"), T(""));
	file_path = websGetVar(wp, T("download_path"), T(""));
	browser = websGetVar(wp, T("browserType"), T("")); //浏览器类型
	sprintf(_filePath,"/media%s",file_path);
	memset(&sbufs,0,sizeof(sbufs));
	
	
	src = fopen(_filePath, "r");
	if (!src) {
		websWrite(wp, T("HTTP/1.1 200 OK\nContent-type: text/plain\nPragma: no-cache\nCache-Control: no-cache\n\n"));
		sprintf (err_msg, "Can't fopen %s: %s\n", _filePath, strerror(errno));
		websWrite(wp,T("%s"),err_msg); 
		websDone(wp, 200);
		goto error;
	}
	if(!strcmp(browser,"IE")){
		URLEncode(fileName, strlen(fileName), encodFilename, sizeof(encodFilename));
		pname=encodFilename;
	}else{
		pname=fileName;
	}
	
	stat(_filePath, &sbufs);
	websWrite(wp, T("HTTP/1.1 200 OK\n"));
	websWrite(wp, T("Pragma: no-cache\n"));
	websWrite(wp, T("Cache-control: no-cache\n"));
	websWrite(wp, T("Content-Length: %ld\n"),sbufs.st_size);
	websWrite(wp, T("Content-Type: application/force-download\n"));
	websWrite(wp, T("Content-Type: application/vnd.ms-excel; charset=utf-8\n"));
//	websWrite(wp, T("Content-type: application/octet-stream\n"));
	websWrite(wp, T("Content-Transfer-Encoding: binary\r\n"));
	websWrite(wp, T("Content-Disposition: attachment; filename=\"%s\"\n\n"),pname);
		
	while ((count = fread(data, 1, BUFFER_SIZE, src)) > 0) {
		websWriteBlock(wp, data, count);
	}
	fclose(src);

error:
	return;
	//websDone(wp, 200);
}




但是,如果fileName是UTF-8编码的,比如文件名为测试.html;
ie这时就搞些小情绪,文件名变成了乱码了

在RFC2231的定义里面, 多语言编码的Content-Disposition应该这么定义:
Content-Disposition: attachment; filename*="utf8''%E6%B5%8B%E8%AF%95.html"
即:
filename后面的等号之前要加 *
filename的值用单引号分成三段,分别是字符集(utf8)、语言(空)和urlencode过的文件名。
所以这时应该对文件名进行url编码转换 ,使用urlencode很轻松就搞定了

因此,以上代码应该加上url编码转换
分享到:
评论

相关推荐

    php中强制下载文件的代码(解决了IE下中文文件名乱码问题)

    在PHP中实现文件下载功能,并确保在不同浏览器尤其是Internet Explorer (IE) 中处理中文文件名不出现乱码问题,是一项常见的Web开发任务。从提供的文件信息中,我们可以提炼出关于实现文件下载以及如何处理IE下中文...

    jsp中文显示问号问题解决方法.docx

    如果已经存在的 JSP 文件中出现了中文显示问号问题,可以通过修改 JSP 文件的编码方式来解决问题。具体步骤如下: 1. 打开 JSP 文件,添加以下代码:; charset=GB18030" pageEncoding="GB18030"%&gt; 2. 将各种编码...

    Get中文乱码IE浏览器Get中文乱码解决方案

    在IT行业中,尤其是在Web开发领域,中文乱码问题是一个常见的挑战,特别是在涉及到GET请求和不同浏览器的兼容性时。本文将深入探讨“Get中文乱码”以及如何在IE浏览器上解决这个问题。 首先,让我们理解为什么会...

    SpaceBuilder_V2.3_SP1

    3.IIS7用户如果出现Handler不能使用问题,请手动修改web.config中 &lt;system.webServer&gt;节点下的,为每个子节点添加 preCondition="integratedMode" 属性 已有的不需要添加该属性 4.重启IIS SDK版用户: 1.用...

    ssh(structs,spring,hibernate)框架中的上传下载

     本文选用的数据库为Oracle 9i,当然你可以在不改动代码的情况下,通过配置文件的调整将其移植到任何具有Blob字段类型的数据库上,如MySQL,SQLServer等。  总体实现  上传文件保存到T_FILE表中,T_FILE表结构...

    jsp 实现的 EXT Grid 导出excel 例子

    在IT行业中,Web开发是一项关键任务,而JSP(JavaServer Pages)作为一种强大的服务器端脚本语言,常常被用于创建动态网页。EXT Grid是EXT JS库中的一个组件,它提供了丰富的数据展示和交互功能,广泛应用于数据管理...

    java面试题

    为了解决这一问题,可以考虑绕过DNS查询,直接在`winnt\system32\drivers\etc\hosts`或`windowshosts`文件中添加IP地址与主机名的映射记录,从而加速RMI的远程调用过程,提高应用的响应速度和可靠性。 #### 八、...

    2021-2022计算机二级等级考试试题及答案No.17072.docx

    10. VFP(Visual FoxPro)中的表单文件扩展名为.SCX。 11. 控件的Enabled属性设置为False,可以防止用户与其交互。 12. 电子邮件的乱码通常是由于编码不统一导致的,比如发送方和接收方的字符编码不匹配。 13. ...

    XML轻松学习手册--XML肯定是未来的发展趋势,不论是网页设计师还是网络程序员,都应该及时学习和了解

    DTD文件也是一个ASCII的文本文件,后缀名为.dtd。例如:myfile.dtd。 为什么要用DTD文件呢?我的理解是它满足了网络共享和数据交互,使用DTD最大的好处在于DTD文件的共享。(就是上文DTD说明语句中的PUBLIC属性)。...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    本书是第I卷,以开发人员在项目开发中经常遇到的问题和必须掌握的技术为中心,介绍了应用PHP进行Web开发的各个方面的知识和技巧,主要包括开发环境、PHP基础、Web页面交互、文件操作、会话应用、图形图像处理及面向...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    本书是第I卷,以开发人员在项目开发中经常遇到的问题和必须掌握的技术为中心,介绍了应用PHP进行Web开发的各个方面的知识和技巧,主要包括开发环境、PHP基础、Web页面交互、文件操作、会话应用、图形图像处理及面向...

    jquery中ajax学习笔记4

    经过这样的修改,无论在IE、360还是Firefox等浏览器中,只要请求的URL发生变化(通过添加时间戳),浏览器都会重新向服务器发起请求,解决了缓存问题。 #### 中文问题解析 在使用Ajax进行数据交互时,经常会出现...

    靠谱软件测试工程师必备抓包神器Fiddler教程

    - **Response乱码解决**: - 点击“Response body is encoded. Click to decode.”来解压缩。 - 使用工具栏中的“Decode”按钮自动解压缩。 - **HTTPS请求监听**: - 在`Tools &gt; Fiddler Options &gt; HTTPS`选项卡中...

    C#编程经验技巧宝典

    112 &lt;br&gt;0188 如何在ASP.NET中显示当前IE浏览器头信息 113 &lt;br&gt;5.6 其他应用技巧 114 &lt;br&gt;0189 如何判断年份是否为闰年 114 &lt;br&gt;0190 如何根据年份判断十二生肖 114 &lt;br&gt;0191 如何根据IP...

    CM6安装调试白皮书汇编.pdf

    1. 通过putty安装系统:在安装CM6时,推荐使用putty而非Windows自带的telnet,因为putty可以避免出现乱码问题。在设置putty时,需将translation选项的字符集设为UTF-8,并连接到S8300或S8800的服务端口(S8800通常是...

Global site tag (gtag.js) - Google Analytics