Response 下载文件 长按矩形 tomcat输出中文乱码

在这里插入图片描述
左键长按变成矩形的方法:Alt+Shift+Insert
在这里插入图片描述
解决tomcat输出中文乱码的问题

HttpServletResponse和ServletResponse用的比较多

web服务器接收到客户端的http请求,会针对这个请求分别创捷请求,分别创建一个代表请求的HttpServletRequest对象,代表响应的一个HttpServletResponse

  • 如果要获取客户端请求过来的参数:找HttpServletRequest
  • 如果要给客户端响应一些信息:HttpServletResponse

1、简单分类

负责像浏览器发送数据的方法

public ServletOutputStream getOutputStream() throws IOException; //输出其他的用这个
public PrintWriter getWriter() throws IOException;  //中文用这个

负责向浏览器发送响应头

HttpServletRequest

public void setContentLength(int len);
public void setContentLengthLong(long len);
public void setContentType(String type);
public void setBufferSize(int size);
public void setDateHeader(String name, long date);
public void addDateHeader(String name, long date);
public void setHeader(String name, String value);
public void addHeader(String name, String value);
public void setIntHeader(String name, int value);

在这里插入图片描述

常见应用

1.向浏览器输出消息(这几篇一直写的有)
2.下载文件
1.要获取下载文件的路径
2.下载的文件名是啥?
3.设置想办法让浏览器能够支持下载我们需要的东西
4.获取下载文件的输入流
5.创建缓冲区
6.获取OutStream对象
7.将FileOutputStream流写入buffer缓冲区
8.使用OutputStream将缓冲区中的数据输出到客户端!
使用web下载文件的时候,需要在实例化FileServlet 类的doGet方法里面添加以下设置

resp.setHeader("Content-disposition","attachment;filename"+ URLEncoder.encode(filename));

一、问题:
  做web项目经常提到的一个需求就是页面的文件下载,那么下载的时候在后台为什么要设置响应消息头?为什么这样设置?
二、解决:
  1、例子
复制代码
//设置响应的消息头
response.setContentType(“text/html;charset=UTF-8”);
//设置响应类型中包含文件附件
response.setHeader(“Content-Disposition”, "attachment; " +
“filename=”+new String(AREA_FILE.getBytes(“gb2312”), “ISO-8859-1”));
复制代码
  2、setContentType:
    它的作用就是,设置客户端的MIME类型【多类型邮件传输协议】,浏览器可以根据该类型来指定程序解析对应类型的文件
    比如,servlet里写入了一个 标签,如果不指定为jpg类型,页面是不能直接显示的
    它的默认类型是[text/html]类型,所以返回的是html也可以不设置
    包括下载文件的时候,不指定也是可以的,因为后边还设置了携带的响应附件,可以支持文件的下载
    也可以指定响应的编码,让浏览器可以正确的显示信息
  3、setHeader:
    它的作用就是设置响应的头部
    Content-Disposition:指明响应的配置信息
    attachment:指明包含附件
  4、new String(AREA_FILE.getBytes(“gb2312”), “ISO-8859-1”))
    这里特别说明,如果文件名不包含中文可以不设置该项
    如果包含中文名,则需要设置编码,否则文件名下载后中文字符会乱码
    其中,getBytes指定了编码的方式,ISO-8859-1指定了解码(读取)的方式
    想要转换编码,就是先编码,再解码
    如:
      utf-8转gbk :new String(str.getBytes(“gbk”), “gbk”))
      gbk转utf-8 :new String(str.getBytes(“utf-8”), “utf-8”))
三、扩展:
  那么为什么下载的文件名中的中文字符会乱码?
  首先,我们常用的编码:
  (1)ISO-8859-1:它是单字节编码,tomcat默认的字符编码方式,但是可以标识的字符量比较少
  (2)unicode:单字节编码
  (3)gb2312:我们大中国的汉字编码,两个字节标识一个汉字
  (4)UTF-8:万国码,支持世界字符,是可变的长度编码,字节数不定
  乱码的出现就是因为,java的字符串默认采用的编码是unicode编码,而tomcat传输又更改为iso-8859-1,
  页面读取的时候,碰到汉字本来双字节的读取成了单字节,出现了乱码
  所以要把字符串以【gbk】编码,再以【iso-8859-1】读取相应的字符,传递到页面就是【iso-8859-1】,可以正常显示中文字符
在这里插入图片描述
在这里插入图片描述
C:\Users\Alex\IdeaProjects\javaweb-01-maven01\javaweb-01-maven01\javaweb-02-Servlet\reponse\target\reponse\WEB-INF\classes\1.png
在这里插入图片描述
在这里插入图片描述
显示出了这个图片,但是没有自动下载,不符合预期
在这里出现了bug 最开始出现了StringIndexOutOfBoundsException;java.lang.StringIndexOutOfBoundsException: String index out of range: -1数组越界 然后修改了String filename = realPath.substring(realPath.lastIndexOf("\\"+1));里面的东西 ,莫名其妙的没有报错并且出现了这张图片,但出现了崩溃只显示了一般图片,一直重复访问,右键下载照片也会没有下载上限的下载,一个照片下载到9G甚至更多,然后将

        int len = in.read(buffer);
        while (len >0){
    
    
        	out.write(buffer,0,len);                          //5 6 7设计IO流的知识
        }

更改为了

        int len;
        while ((len = in.read(buffer)) >0){
    
    
            out.write(buffer,0,len);                          //5 6 7设计IO流的知识
        }

问题就解决了,具体原因可能需要学习IO后才能知晓,先这样吧,
没有自动下载的解决办法,将

resp.setHeader("Content-disposition","attachment:filename="+filename);

改为

resp.setHeader("Content-disposition","attachment;filename="+filename);

在这里插入图片描述
访问http://localhost:8080/r/down自动下载成功 注意:这里页面还是http://localhost:8080/r/ 没有进行跳转页面
在这里插入图片描述
在这里插入图片描述
解决了中文文件名的问题
在这里插入图片描述
顺便更改了这个)的位置,解决了刚才下载照片文件名1前面有下划线_的问题
出错的原因还是因为不细心,一个冒号:和;以及右括号)的位置问题 导致了出错

おすすめ

転載: blog.csdn.net/dasgs5a64/article/details/120813941