在这里我对在我学习中了解到的知识点的认识一些我的疑惑写下来,希望能得到各位大牛们的解答。代码实在学习过程中抄下来和改编的。
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import sun.misc.BASE64Encoder;
/* 这里可以很好的理解编码问题,中文乱码问题
* 浏览器编码,tomcat服务器的request,response编码,要好好区分一下
*/
public class Download2 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//直接设置response,request的编码好像行不通啊,
//问题一:response.setContentType("text/html;charset=UTF-8")只适在writer中使用吗?设置的是response的编码吗?
//response.setContentType("text/html;charset=UTF-8");
//问题二:这里只能解决post提交时的中文乱码问题
//request.setCharacterEncoding("UTF-8");
//这里的filename是有request获得的,其编码是ISO8859-1编码
String filename = request.getParameter("filename");
//这里是将ISO8859-1编码转换为utf-8,是为了对中文进行编码
filename = new String(filename.getBytes("ISO8859-1"),"UTF-8");
//注释掉匹配浏览其也可以了,然后就无法在浏览其上识别中文名字
String agent = request.getHeader("User-Agent");
String filenameEncoder = "";
if (agent.contains("MSIE")) {
// IE浏览器
filenameEncoder = URLEncoder.encode(filename, "utf-8");
filenameEncoder = filenameEncoder.replace("+", " ");
} else if (agent.contains("Firefox")) {
// 火狐浏览器
BASE64Encoder base64Encoder = new BASE64Encoder();
filenameEncoder = "=?utf-8?B?"
+ base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
} else {
// 其它浏览器
filenameEncoder = URLEncoder.encode(filename, "utf-8");
}
//这里是获取后缀名,为引文所以影响不大
response.setContentType(this.getServletContext().getMimeType(filename));
//response.setContentType(this.getServletContext().getMimeType(filenameEncoder));
//又变成了浏览器的编码识别了? 这里是在if,else 中更改了编码。
//这里是要求按照浏览器的编码来进行解码的,所以匹配浏览其的步骤是为了在这里显示出中文名字
response.setHeader("Content-Disposition", "attachment;filename="+filenameEncoder);
//这里一定要用filename,解码是通过项目解码的,filenameEncoder是进行了编码改编的
//String path = this.getServletContext().getRealPath("download/"+filenameEncoder);
String path = this.getServletContext().getRealPath("download/"+filename);
InputStream in = new FileInputStream(path);
ServletOutputStream out = response.getOutputStream();
int len = 0;
byte [] buffer = new byte[1024];
while((len=in.read(buffer))>0) {
out.write(buffer, 0, len);
}
in.close();
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
问题3:
为什么我直接将问题一中的代码 request.setCharacterEncoding(“UTF-8”); 解注释来设置编码集,然后再删掉那段对filenameEncoder的编码匹配过程,无法实现下载文件名称显示中文呢?及改编过后代码如下:
public class Download2 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//这里不是直接就更改了编码方式吗? 更改了什么的编码方式?
response.setContentType("text/html;charset=UTF-8");
//对fliename改变编码方式,从ISO8859-1变成UTF-8
filename = new String(filename.getBytes("ISO8859-1"),"UTF-8");
response.setContentType(this.getServletContext().getMimeType(filename));
//这里的filename不是已经用utf-8进行编码的吗,为什么识别不了其中文呢,同时在setContentType方法中不是已经将编码设置成utf-8的形式了吗,应该可以识别的。
response.setHeader("Content-Disposition", "attachment;filename="+filename);
String path = this.getServletContext().getRealPath("download/"+filename);
InputStream in = new FileInputStream(path);
ServletOutputStream out = response.getOutputStream();
int len = 0;
byte [] buffer = new byte[1024];
while((len=in.read(buffer))>0) {
out.write(buffer, 0, len);
}
in.close();
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
恳请大家帮我解答一下!谢谢