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


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

通常使用以下代码就能导出为流的文件,而不是打开文件 <br />

  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$amp; <apos> </apos> <apos> </apos> <apos> </apos>





但是,如果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编码转换

Web开发 程序开发 Web前端

jjgzs 11 years, 9 months ago

Your Answer