** Content-Disposition
Content-disposition 是 MIME 协议的扩展,MIME 协议指示 MIME 用户代理如何显示附加的文件。
当浏览器接收到头时,它会激活文件下载对话框,它的文件名框自动填充了头中指定的文件名。
(请注意,这是设计导致的;无法使用此功能将文档保存到用户的计算机上,而不向用户询问保存位置。)
设置这个头的目的是为了不让浏览器直接显示内容,而是直接弹出一个文件下载的对话框,设置要下载的文件名和原始文件名同名
response.setHeader("Content-Disposition", "attachment;filename="+filename);
** 文件乱码的解决方案
1、request请求中文乱码的解决
** Get方式
第一种(不推荐使用)
修改服务器的配置文件,找到服务器的配置文件server.xml在
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
里面加入URIEncoding属性,值为UTF-8
第二种(推荐使用)
String filename = new String(request.getParameter("filename").getBytes("ISO-8859-1"),"UTF-8")
** Post方式
设置服务器端的解码方式
request.setCharacterEncoding("UTF-8");
2、response响应解决中文乱码问题
** 字符流问题(俩种解决方案)
第一种
a、设置response的字符流编码为UTF-8
**response.setCharacterEncoding("UTF-8")
b、设置浏览器解码用UTF-8的码表来解码
**response.setHeader("conttent-type","text/html;charset=UTF-8")
第二种
相当于第一种方式的简单写法
response.setContentType("text/html;charset=UTF-8")
** 字节流问题
a,对字符进行编码的时候,指定编码方式。其代码为:
**response.getOutputStream().write("北京".getBytes("UTF-8"));
b,同时设置浏览器的解码方式。其代码为:
**response.setHeader("content-type", "text/html;charset=UTF-8");或response.setContentType("text/html;charset=UTF-8");
3、文件下载时中文名乱码
** 不包含中文名的文件下载
只需设置俩个头和一个流即可,详细代码演示如下
// 没有中文文件名的文件下载
private void test1(HttpServletRequest request, HttpServletResponse response)
throws FileNotFoundException, IOException {
// 1接受参数
String filename = request.getParameter("filename");
// 2完成文件下载
**// 2.1设置Content-Type头
String type = this.getServletContext().getMimeType(filename);
response.setHeader("Content-Type", type);
**// 2.2设置Content-Disposition头
response.setHeader("Content-Disposition", "attachment;filename=" + filename);
// 2.3设置文件的InputStream.
// 获取文件的绝对路径
String realPath = this.getServletContext().getRealPath("/demo4-skip/" + filename);
// 根据文件的绝对路径获取输入流对象
InputStream is = new FileInputStream(realPath);
// 获取输入流对象
**OutputStream os = response.getOutputStream();
// 下载文件
int len;
byte[] bys = new byte[1024];
while ((len = is.read(bys)) != -1) {
os.write(bys, 0, len);
}
is.close();
}
** 包含中文文件名的文件下载
不仅需要设置俩个头和一个流,还需要根据浏览器的类型进行不同的编码,详细代码如下
// 中文文件名的下载
private void test2(HttpServletRequest request, HttpServletResponse response)
throws FileNotFoundException, IOException {
// 1接受参数
**String filename = new String(request.getParameter("filename").getBytes("ISO-8859-1"), "UTF-8");
System.out.println(filename);
// 2完成文件下载
// 2.1设置Content-Type头
String type = this.getServletContext().getMimeType(filename);
**response.setHeader("Content-Type", type);
System.out.println(type);
// 2.3设置文件的InputStream.
// 获取文件的绝对路径
String realPath = this.getServletContext().getRealPath("/demo4-skip/" + filename);
System.out.println(realPath);
// 根据浏览器类型处理中文文件乱码问题
String agent = request.getHeader("User-Agent");
System.out.println(agent);
System.out.println(agent);
if (agent.contains("Firefox")) {
filename = base64EncodeFileName(filename);
} else {
filename = URLEncoder.encode(filename, "UTF-8");
}
// 2.2设置Content-Disposition头
**response.setHeader("Content-Disposition", "attachment;filename=" + filename);
// 根据文件的绝对路径获取输入流对象
InputStream is = new FileInputStream(realPath);
// 获取输入流对象
**OutputStream os = response.getOutputStream();
// 下载文件
int len;
byte[] bys = new byte[1024];
while ((len = is.read(bys)) != -1) {
os.write(bys, 0, len);
}
is.close();
}
//火狐浏览器的编码方式
public static String base64EncodeFileName(String fileName) {
BASE64Encoder base64Encoder = new BASE64Encoder();
try {
return "=?UTF-8?B?" + new String(base64Encoder.encode(fileName.getBytes("UTF-8"))) + "?=";
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
** 转发和重定向的区别
1.转发的地址栏不变的.重定向的地址栏发生变化的.
2.转发是一次请求一次响应,重定向是两次请求两次响应.
3.request域对象存取的值在转发中是有效的,在重定向无效的.
4.转发的路径不需要加工程名.重定向的路径需要加工程名.
** 使用BeanUtils封装数据
JavaBean需要满足三个条件
a、无参构造器
b、private成员
c、public的get和set方法
|
|