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

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

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

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

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

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

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

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

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

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

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

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

23664579385239f1627445e8bf6d1605.png

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

2.空格变+号

373843ee0244507113900a1ef1034473.png

%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文件下载(中文乱码、火狐浏览器乱码、空格变+号、文件相关教程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值