很多情况下,我们在写程序的时候都会把代码设置为UTF-8的编码,可以在下载文件设置filename的时候却有违常理,竟然设置编码格式为ISO8859-1,代码如下(如是英文的话就不需要这样处理了):
response.setHeader("Content-disposition", "attachment; filename=" + new String("中文文件名".getBytes("utf-8"), "ISO8859-1"));
提取出来最核心的一点,filename=new String("中文文件名".getBytes("utf-8"), "ISO8859-1");
先说为什么使用 ISO8859-1 编码,这个主要是由于http协议,http header头要求其内容必须为iso8859-1编码,所以我们最终要把其编码为 ISO8859-1 编码的字符串;
但是前面为什么不直接使用 "中文文件名".getBytes("ISO8859-1"); 这样的代码呢?因为ISO8859-1编码的编码表中,根本就没有包含汉字字符,当然也就无法通过"中文文件名".getBytes("ISO8859-1");来得到正确的“中文文件名”在ISO8859-1中的编码值了,所以再通过new String()来还原就无从谈起了。 所以先通过 "中文文件名".getBytes("utf-8") 获取其 byte[] 字节,让其按照字节来编码,即在使用 new String("中文文件名".getBytes("utf-8"), "ISO8859-1") 将其重新组成一个字符串,传送给浏览器。
参考:http://jiapumin.iteye.com/blog/1006144
相关推荐
` 这行代码将从客户端传来的GBK编码的文件名(`sDownName`)先转为ISO8859-1编码,然后再用GBK解码。这是因为客户端发送的请求参数通常是GBK编码的,所以需要先转为ISO8859-1,然后才能正确地转换回GBK编码,以避免...
对于非IE浏览器,文件名直接用ISO-8859-1编码。这是因为ISO-8859-1编码可以将所有ASCII字符映射到单字节,包括空格,而不会引起问题。最后,将编码后的文件名包裹在双引号中,以解决文件名中空格导致的问题。 整个...
- **请求编码**:Struts2默认使用ISO-8859-1编码,如果上传文件名包含中文,需在Action中手动将文件名转换为UTF-8,例如使用`new String(file.getName().getBytes("ISO-8859-1"), "UTF-8")`。 - **文件存储**:...
filename = new String(filename.getBytes("UTF-8"), "ISO8859-1"); // Firefox } else if (request.getHeader("User-Agent").toUpperCase().indexOf("MSIE") > 0) { filename = URLEncoder.encode(filename, ...
- **Firefox**:使用ISO-8859-1编码。 - **Internet Explorer (IE)**:使用UTF-8编码并通过URL编码方式处理。 - **Safari/Chrome**:使用UTF-8编码,并通过MIME Utility进行Base64编码处理。 - **Opera**:与...
filename=" + newString(file.getName().getBytes("iso-8859-1"),"utf-8"))` 设置Content-Disposition响应头,`attachment`表示附件下载,`filename`是文件名,同样需要编码转换。 - `response.addHeader("Content-...
- Firefox支持使用`ISO-8859-1`编码格式的文件名。 - 示例代码: ```java response.setHeader("Content-Disposition", "attachment;filename=\"" + new String(fileName.getBytes("UTF-8"), "ISO-8859-1")....
filename = new String(filename.getBytes("iso-8859-1"), "utf-8"); String fileEncode = DownUtils.filenameEncoding(filename, request); response.setHeader("Content-Disposition", "attachment;filename=" + ...
- 使用 `new String(fileName.getBytes("GBK"), "ISO8859-1")` 转换文件名以兼容不同的浏览器。 2. **安全问题**: - 对于用户提交的文件名等参数进行校验,防止恶意操作。 - 确保文件路径的安全性,防止访问非...
这主要是因为HTTP协议在传输文件名时,默认使用的是ISO-8859-1编码,而中文字符在此编码下无法正确解析,从而导致乱码的出现。本文将深入探讨这一问题,并提供几种解决方案。 ### 一、问题分析 #### HTTP协议与...
2. 使用 `servlet.getWirter` 字符流输出中文时,需要注意默认的字符输出流是采用 ISO-8859-1 编码的,而 ISO-8859-1 编码不支持中文。解决方法是使用 `response.setContentType("text/html;charset=utf-8")`,以...
在本例中,由于文件名可能是中文,因此需要先将文件名的字节转换为ISO8859-1编码,这样在传输过程中可以正确地被接收方解码。 `Content-Disposition`中的`filename`参数用于指定下载后文件的默认名称,当用户在...
String encodedFileName = new String(fileName.getBytes(StandardCharsets.UTF_8), "ISO8859_1"); response.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + encodedFileName); ``` 接下来,...
fileName = new String(fileName.getBytes("GBK"), "ISO-8859-1"); } else { fileName = URLEncoder.encode(fileName, "UTF-8"); } } else if (clientInfo.toLowerCase().indexOf("firefox") > 0) { // Fire...
这段代码将文件名从`ISO-8859-1`编码转换回原始字符串,以便在设置`Content-Disposition`头时能正确显示文件名。 总的来说,解决Struts2下载文件不同浏览器兼容问题的关键在于理解`Content-Disposition`头的处理...
由于URL编码问题,先将参数从ISO8859-1编码解码为GBK编码,以适应中文环境。然后,结合硬编码的目录路径(`"D:/我.doc"`),构建完整的文件路径。 3. **检查文件存在性**: 创建`java.io.File`对象`ff`,并使用它...
- `filename=new String(filename.getBytes("iso8859-1"),"gb2312")` 这个转换是为了解决字符集兼容性问题,从ISO-8859-1编码转换为GBK(或GB2312)编码,以正确显示中文文件名。 6. **文件读取与发送**: - 使用...
在文件下载的过程中,我们通常会利用`HttpServletResponse`来设置响应头信息,如文件类型、编码方式等,以便浏览器能够正确地解析并下载文件。 ##### 2.2 FacesContext `FacesContext` 是JavaServer Faces (JSF) ...
在处理中文文件名时,需要进行编码转换,如使用`new String(fileName.getBytes("GBK"),"iso8859-1")`来避免乱码问题。 四、打开方式的选择 通过设置`Content-disposition`的`attachment`和`inline`,可以控制文件是...
在Java中,默认的字符编码通常是ISO-8859-1,而中文字符通常使用UTF-8编码。当服务器接收到包含UTF-8编码的中文文件名的请求时,如果没有正确处理编码转换,就会导致乱码。Struts2文件上传组件在处理文件名时,如果...