整理java文件下载(中文乱码、火狐浏览器乱码、空格变+号、文件

整理java文件下载(中文乱码、火狐浏览器乱码、空格变+号、文件名包含空格时文件名可能显示不全等问题)

首先感谢网上各路大仙提供的资料:(参考如下)

Java文件下载处理中文名(使用URLEncoder编码及空格变+解决);

FIREFOX 下载中文文件名出现乱码的java解决方案;

用火狐浏览器下载中文文件名的文件乱码及其解决;

解决attachment; filename含空格时显示不完全的问题;

1.一般中文乱码处理方式

采用URLEncoder.encode(fileName, "UTF-8")处理中文名字;

但是这样的话,不是通用的,火狐浏览器就不行了。需要单独处理

2.火狐浏览器下载中文文件名的文件乱码及其解决

Firefox java支持版 火狐浏览器java_火狐浏览器

采用 new String(fileName.getBytes("GB2312"),"ISO-8859-1")处理中文名字;

2.空格变+号

Firefox java支持版 火狐浏览器java_文件名_02

%20是空格在UTF-8下的编码;

只需要在URLEncoder.encode(fileName, "UTF-8")替换+号为%20;

fileName = fileName.Replace("+", "%20"); //encode后替换 解决空格问题

3.文件名包含空格时文件名显示不全

我开始遇到这问题了,后来不知道怎么测试想截图的时候,加不加这个双引号包含都没问题;反正我还是加了,有备无患;

response.setHeader("Content-Disposition", "attachment;filename=\""+ filenamedisplay +"\"");//将文件名用 双引号包含,否则带空格的文件名,显示不完全

贴个部分代码(仅供参考)

// 1.获取要下载的文件的绝对路径
String filepath = "";
if (fil_fileindex != null) {
filepath = filepath + fileserverurl;
}
// 2.获取要下载的文件名
String fileName = fil_fileindex.getFilename();
int fileSize = Integer.parseInt(fil_fileindex.getFilesize());
response.reset();
// 设置为下载application/x-download
//response.setContentType("application/x-download charset=UTF-8");
if ("FF".equals(getBrowser(request))) {
// 针对火狐浏览器处理方式不一样了
fileName = new String(fileName.getBytes("GB2312"), "ISO-8859-1");
}else{
fileName = URLEncoder.encode(fileName, "UTF-8");//encode解决中文乱码
fileName = fileName.replace("+", "%20");//encode后替换 解决空格问题
}
// 3.设置Content-Disposition响应头控制浏览器弹出保存框,若没有此句则浏览器会直接打开并显示文件。中文名要经过URLEncoder.encode编码,否则虽然客户端能下载但显示的名字是乱码
response.setHeader("Content-Disposition", "attachment;filename=\""+ fileName +"\"");//将文件名用 双引号包含,否则带空格的文件名,显示不完全
response.setContentLength(fileSize);
// 4.获取要下载的文件输入流、输出流
InputStream in = null;
OutputStream out = null;
try {
in = getInputStreamByPath(filepath);
int len = 0;
// 5.创建数据缓冲区
byte[] buffer = new byte[1024];
// 6.通过response对象获取OutputStream流
out = response.getOutputStream();
// 7.将FileInputStream流写入到buffer缓冲区
while ((len = in.read(buffer)) > 0) {
// 8.使用OutputStream将缓冲区的数据输出到客户端浏览器
out.write(buffer, 0, len);
}
out.flush();
} catch (IOException e) {
response.reset();//重置响应头信息
request.setCharacterEncoding("UTF-8");
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0L);
response.getWriter().print("");
}finally{
if(out != null){
out.close();
}
if(in != null){
in.close();
}
}
/**
* 通过url返回输入流
* @param url
* @return
* @throws IOException
*/
private InputStream getInputStreamByPath(String path) throws IOException{
URL url = null;
InputStream is =null;
try {
url = new URL(path);
} catch (MalformedURLException e) {
e.printStackTrace();
}
HttpURLConnection conn = (HttpURLConnection) url.openConnection();//利用HttpURLConnection对象,我们可以从网络中获取网页数据.
//设置超时间为3秒
conn.setConnectTimeout(3*1000);
//防止屏蔽程序抓取而返回403错误
conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
// 设置是否向conn输出,因为这个是post请求,参数要放在http正文内,因此需要设为true, 默认情况下是false;
conn.setDoOutput(true);
// 设置是否从conn读入,默认情况下是true;
conn.setDoInput(true);
// Post 请求不能使用缓存
conn.setUseCaches(false);
// 设定传送的内容类型是可序列化的java对象(如果不设此项,在传送序列化对象时,当WEB服务默认的不是这种类型时可能抛java.io.EOFException)
conn.setRequestProperty("Content-type", "application/x-java-serialized-object");
// 设定请求的方法为"POST",默认是GET
conn.setRequestMethod("POST");
// 连接,从上述url.openConnection()至此的配置必须要在connect之前完成,
conn.connect();
is = conn.getInputStream(); //得到网络返回的输入流
return is;
}
/**
* 以下为服务器端判断客户端浏览器类型的方法
* @param request
* @return
*/
private String getBrowser(HttpServletRequest request) {
String UserAgent = request.getHeader("USER-AGENT").toLowerCase();
if (UserAgent != null) {
if (UserAgent.indexOf("msie") != -1)
return "IE";
if (UserAgent.indexOf("firefox") != -1)
return "FF";
if (UserAgent.indexOf("safari") != -1)
return "SF";
}
return null;
}

整理java文件下载(中文乱码、火狐浏览器乱码、空格变+号、文件相关教程