彼的潘 2020-05-23 17:21 采纳率: 66.7%
浏览 538

为什么用BASE64Encoder方法对中文文件名进行编码,仍然显示乱码。

**2020/06/24更新
问题终于解决了!开心!谢谢帮助过我的大侠们!
其实问题不在BASE64Encoder方法中。第一步获取文件名的时候,就出现了乱码,所以后面找不到文件才出错的。
//1.获取请求参数,文件名
String filename = request.getParameter("filename");
原因是server.xml的编码方式设置不对。改成UTF-8就能正常传递中文了。

<Connector URIEncoding="UTF-8"ectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

**

跪求大神帮忙!!!
做文件下载的练习,用了BASE64Encoder对文件名进行编码,但是文件名仍然是乱码。
代码如下:
package cn.itcast.web.utils;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import sun.misc.BASE64Encoder;

public class encodeFileName {
/**
* deal with the fileName encode in the different browsers
* @param request
* @param fileName
* @return
* @throws UnsupportedEncodingException
*/

public static String getFileName(String agent, String filename)

throws UnsupportedEncodingException {

if (agent.contains("MSIE")) {
//IE浏览器
filename = URLEncoder.encode(filename,"utf-8");
filename = filename.replace("+", " ");
}else if (agent.contains("Firefox")) {
//火狐浏览器
BASE64Encoder base64Encode = new BASE64Encoder();
filename = "=?utf-8?B?"+base64Encode.encode(filename.getBytes("utf-8"))+"?=";
}else {
//其他浏览器
filename = URLEncoder.encode(filename,"utf-8");
}
return filename;
}

}

文件下载的servlet部分代码如下:
//1.获取请求参数,文件名
String filename = request.getParameter("filename");
//解决中文文件问题
//获取客户端浏览器的版本
String agent = request.getHeader("user-agent");
System.out.println(agent);
filename = encodeFileName.getFileName(agent,filename);
System.out.println(filename);
//2.使用字节码,加载进内存
//2.1找到文件服务器路径
ServletContext servletContext = this.getServletContext();
String realPath = servletContext.getRealPath("/img/"+filename);
System.out.println(realPath);
//2.2调用字节流,加载进内存
FileInputStream fis = new FileInputStream(realPath);

    控制台打印出文件名:=?utf-8?B?57yH5bqh44KzLmpwZw==?=
    realPath:null
    感觉就是对中文编码没有起到效果,不知道问题出在哪里了?网上查找了很多方法,写法都跟我这个一样,为什么就是没有效果?
    跪求大神帮忙啊!!谢谢!!

    追加:
    网上很多例子,servlet部分的代码里,//解决中文文件问题的代码,是写在response.setHeader("content-disposition", "attachment;filename="+filename);这个之前的。所以我把servlet的代码改成如下:
    //1.获取请求参数,文件名
    String filename = request.getParameter("filename");
    //2.使用字节码,加载进内存
    //2.1找到文件服务器路径
    ServletContext servletContext = this.getServletContext();
    String realPath = servletContext.getRealPath("/img/"+filename);
    System.out.println(realPath);
    //2.2调用字节流,加载进内存
    FileInputStream fis = new FileInputStream(realPath);

    //3。设置response响应头
    //3.1设置响应头类型:content-type
    String mimeType = servletContext.getMimeType(filename);
    response.setHeader("content-type", mimeType);
    //解决中文文件问题
    //获取客户端浏览器的版本
    String agent = request.getHeader("user-agent");
    System.out.println(agent);
    filename = encodeFileName.getFileName(agent,filename);
    System.out.println(filename);
    //3.2设置响应头打开方式:content-dispositon
    response.setHeader("content-disposition", "attachment;filename="+filename);

    如上的代码,在2.2部分,就报了空指针异常了,为什么啊?已经搞了半天了,实在是搞不懂了!!!
  • 写回答

1条回答 默认 最新

  • 臭小子帅 2020-05-23 17:26
    关注

    57yH5bqh44KzLmpwZw== 这个是Base64编码,前后问号啥的是你自己拼接的

    评论

报告相同问题?

悬赏问题

  • ¥20 蓝牙耳机怎么查看日志
  • ¥15 Fluent齿轮搅油
  • ¥15 八爪鱼爬数据为什么自己停了
  • ¥15 交替优化波束形成和ris反射角使保密速率最大化
  • ¥15 树莓派与pix飞控通信
  • ¥15 自动转发微信群信息到另外一个微信群
  • ¥15 outlook无法配置成功
  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏