下载文件时出现保存对话框乱码
java技术文章 2007-09-05 00:10:10 阅读33 评论0 字号:大中小订阅
JAVA /SoBerLeVi
发表于2007-03-22, 09:13
首先把我写的文件下载的jsp代码贴出来
<%@page language="java" contentType="application/x-msdownload" import="java.io.*,java.net.*,com.supervise.struts.data.artical.Artical" pageEncoding="gb2312"%><%
response.reset();//可以加也可以不加
response.setContentType("application/x-download");//设置为下载application/x-download
Artical at = (Artical)request.getAttribute("artical");
String FilePrefix = at.getFiles();
String fileExt = null;
fileExt = tmpAccessories.substring(FilePrefix.lastIndexOf("."), FilePrefix.length());
String filenamedisplay = at.getArtFirContent()+fileExt;
String files= at.getFiles();
String root = getServletContext().getRealPath("/");//服务器路径
File f = new File(root+"UploadFile//"+files);
filenamedisplay=URLEncoder.encode(filenamedisplay,"UTF-8");//注意********
response.addHeader("Content-Disposition","attachment;filename=" + filenamedisplay);
OutputStream output = null;
FileInputStream fis = null;
try
{
output = response.getOutputStream();
fis = new FileInputStream(root+"UploadDocFile//"+accessories);
byte[] b = new byte[1024];
int i = 0;
while ( (i = fis.read(b)) > 0 )
{
output.write(b, 0, i);
}
output.flush();
}
catch ( Exception e )
{
System.out.println("Error!");
e.printStackTrace();
}
finally
{
if(fis != null)
{
fis.close();
fis = null;
}
if(output != null)
{
output.close();
output = null;
}
}%>
看完这段代码以后有一点比较重要filenamedisplay=URLEncoder.encode(filenamedisplay,"UTF-8");这个是设置URL编码的,就是以UTF-8发送URL的
所以编码设置为这个的时候必须要在IE浏览器的工具-->Internet选项-->高级-->总是以UTF-8发送URL这个打勾,否则保存文件的对话框会出现乱码;
2)
JSP /SoBerLeVi
发表于2007-03-22, 10:21
关于中文文件下载的问题,网上的咨询和答疑已经很多,我原来处理下载的代码如下:
response.setHeader("Content-Disposition", "attachment; filename=" + java.net.URLEncoder.encode(fileName, "UTF-8"));
下载的程序里有了这句,一般在IE6的下载提示框上将正确显示文件的名字,无论是简体中文,还是日文。不过当时确实没有仔细测试文件名很长的中文文件名。 先如今经过仔细测试,发现文字只要超过17个字,就不能下载了。经过好一番google和反复测试,总算对这个问题有了系统的认识,分列如下:
一. 通过我原来的方式,也就是先用URLEncoder编码,当中文文字超过17个时,IE6 无法下载文件。这是IE的bug,参见微软的知识库文章 KB816868 。原因可能是因为ie在处理 Response Header 的时候,对header的长度限制在150字节左右。而一个汉字编码成UTF-8是9个字节,那么17个字便是153个字节,所以便会报错。微软提供了一个补丁,可以从 这里 下载。这个补丁需要先安装ie6 sp1。因为我平时勤打补丁,我的IE6版本号是 6.0.2800.1106.xpsp2_xxxxx。所以我可能已经安装过了补丁,从而可以下载,但仍然出现文件名被截断的现象。微软让我们等待IE下 一个service pack的发布。我今天也上网看到了好消息,迫于firefox的压力,IE7可能在年中发布。另外,Firefox 不支持这样的方式,将把编码后的%xx%xx直接作为文件名显示。
二. 我尝试使用 javamail 的MimeUtility.encode()方法来编码文件名,也就是编码成 =?gb2312?B?xxxxxxxx?= 这样的形式,并从 RFC1522 中找到对应的标准支持。不过很遗憾,IE6并不支持这一个标准。我试了一下,Firefox是支持的。
三. 按网上很多人提供的解决方案:将文件名编码成ISO8859-1似乎是有效的解决方案,代码如下:
response.setHeader( "Content-Disposition", "attachment;filename=" + new String( fileName.getBytes("gb2312"), "ISO8859-1" ) );
在确保附件文件名都是简 体中文字的情况下,那么这个办法确实是最有效的,不用让客户逐个的升级IE。如果台湾同胞用,把gb2312改成big5就行。但现在的系统通常都加入了 国际化的支持,普遍使用UTF-8。如果文件名中又有简体中文字,又有繁体中文,还有日文。那么乱码便产生了。另外,在我的电脑上Firefox (v1.0-en)下载也是乱码。
折中考虑,我结合了一、三的方式,代码片断如下:
String fileName = URLEncoder.encode(atta.getFileName(), "UTF-8");
/*
* see http://support.microsoft.com/default.aspx?kbid=816868
*/
if (fileName.length() > 150) {
String guessCharset =xxxx /*根据request的locale得出可能的编码,中文操作系统通常是gb2312*/
fileName = new String(atta.getFileName().getBytes(guessCharset), "ISO8859-1");
}
response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
暂且不考虑 Firefox是因为它目前似乎还没有有力侵食到IE的企业用户市场。影响客户买单的常常是进度,而不是兼容度。
/////////////////////
下面是解决文件名空格问题
String fileName = StringUtils.trim(file.getName());
String formatFileName = encodingFileName(name);//在后面定义方法encodingFileName(String fileName);
response.setHeader("Content-Disposition", "attachment; filename=" + formatFileName );
//处理文件名中出现的空格
//其中%20是空格在UTF-8下的编码
public static String encodingFileName(String fileName) {
String returnFileName = "";
try {
returnFileName = URLEncoder.encode(fileName, "UTF-8");
returnFileName = StringUtils.replace(returnFileName, "+", "%20");
if (returnFileName.length() > 150) {
returnFileName = new String(fileName.getBytes("GB2312"), "ISO8859-1");
returnFileName = StringUtils.replace(returnFileName, " ", "%20");
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
if (log.isWarnEnabled()) {
log.info("Don't support this encoding ...");
}
}
return returnFileName;
}
分享到:
相关推荐
本篇文章将详细介绍如何解决在使用CFileDialog(一个用于打开或保存文件的对话框类)时出现的中文乱码问题。 #### CFileDialog简介 `CFileDialog`是MFC框架中提供的一个用于创建打开或保存文件对话框的类。通过...
在IT领域,中文乱码是一个常见的问题,尤其是在处理文件下载和显示时。本文将深入探讨“下载文件提示框中文乱码”这一主题,提供相关的知识背景、原因分析以及解决方案。 一、乱码产生的原因 1. 编码不兼容:在...
在使用Visual C++(以下简称VC++)进行程序开发时,经常会遇到下载或导入的代码在编译过程中出现中文乱码的问题。这种情况不仅影响了代码的可读性,也可能会导致程序运行时出现错误。本文将详细介绍几种解决VC++编译...
这些文件可能包含中文字符,但在某些情况下,使用IntelliJ IDEA打开这些文件时可能会出现中文乱码的问题。这主要是由于编码设置不正确或者IDE与文件的实际编码不匹配导致的。下面将详细介绍如何解决这个问题。 首先...
`attachment`通常会触发浏览器的文件保存对话框,让用户选择保存位置;而`inline`则会尝试在浏览器窗口中直接打开文件。例如,`attachment;filename="struts2.txt"`表示下载文件时,保存的文件名为`struts2.txt`。 ...
在IT行业中,文件管理和下载是常见的操作,尤其是在处理包含中文字符的文件时,可能会遇到乱码问题。本文将深入探讨“文件下载”以及如何解决文件名中文乱码问题,这在处理多语言环境下的数据交流时显得尤为重要。 ...
5. **步骤5**:选择文件保存位置和文件名,并选择“XLSX”作为保存类型。 6. **步骤6**:点击“完成”按钮,开始导出数据。 通过上述方法,可以有效地解决在使用TOAD导出Excel文件时遇到的中文乱码问题,提高工作...
对于部分情况,仅修改Eclipse的编码设置可能不足以彻底解决问题,尤其是在使用Struts框架时,资源属性文件在被读取到JSP页面上时仍可能出现乱码。这是因为Java在处理这些文件时可能会进行两次编码,导致乱码问题依旧...
当资源文件的编码格式与JSP页面或服务器解析时所使用的编码格式不一致时,就会导致显示异常,表现为乱码。 ### 解决方案之一:使用`native2ascii`工具转换文件编码 一种解决方案是使用`native2ascii`工具将资源...
当您尝试使用Excel打开由ArcGIS导出的.dbf文件时,可能会发现文本字段中的字符出现乱码。这种现象通常是由于编码不匹配造成的。默认情况下,Excel可能无法正确识别.dbf文件中的字符编码,导致乱码显示。 #### 解决...
因此,当编码不匹配时,就会出现乱码。 2. **使用记事本打开并重新保存**: 第一步是使用记事本打开CSV文件。记事本是一个简单的文本编辑器,它允许查看原始字符编码。打开文件后,如果中文已经正常显示,说明文件...
- **编码问题**:如果编辑框中包含非英文字符,请确保使用的编码方式与文件保存时一致,以免出现乱码。 - **文件权限**:检查目标文件是否可写,如果文件被其他程序占用或没有写权限,则会引发异常。 通过以上步骤...
5. 转换完成后,为了便于日后查看,你可以将文件保存下来。如果需要保持为TXT格式,可以通过复制转换后的文本,然后在新的TXT文件中粘贴并保存。如果想直接保存为Word文档,可以选择“文件”->“保存”,选择“.DOC...
1. **文件编码**:如果JavaScript文件是在其他编辑器中创建并保存的,并且保存时选择的是非UTF-8编码(如GBK、GB2312等),那么当Eclipse默认使用UTF-8读取这些文件时,就会出现中文乱码。 2. **Eclipse默认编码**...
"Server-U出现乱码的解决方法"这个标题所指的问题,就是当使用Server-U这款流行的FTP(文件传输协议)服务器软件时,遇到了中文文件名或目录名显示为乱码的状况。Server-U是一款功能强大的FTP服务器程序,它允许系统...
1. 选择出现乱码的文件,将其选中。 2. 在电子邮件程序中,打开“文件”菜单,选择“属性”,查看文件的详细信息。 3. 在“详细资料”选项中找到邮件的源文件内容,并全选复制到剪贴板。 4. 打开记事本,将剪贴板的...
`MyJspSmartUpload`通过设置合适的`Content-Type`和`Content-Disposition`响应头,确保文件名在下载对话框中显示正确,并且在保存文件时保持正确的编码。这可能包括使用`UTF-8`编码来处理文件名,并在`Content-...
在IT领域,尤其是软件开发行业中,遇到编码问题几乎是不可避免的,而Visual C++ 6.0(简称VC6.0)作为一款经典的编程工具,在处理中文或其他非英文字符时,确实容易出现乱码现象。这一问题往往让许多开发者感到头疼...