文件下载和验证码

文件下载的本质就是文件拷贝,将服务器端的文件拷贝到浏览器端,这样的话如果是图片的话,会直接在浏览器上解析,图片直接显示在浏览器页面上,我们想要不论文件是那种形式都提供下载功能。我们需要两个响应头,告知浏览器的打开方式和文件类型

1)告知浏览器文件的类型:浏览器是通过mime类型来判断文件格式,response.setContentType(文件的MIME类型),也被用作解决响应体文本乱码问题;

2)告示浏览器文件的打开方式 附件 是下载:

response.setHeader("Content-Disposition","attachment;filename=文件名称");

我们下载文件提供的是一个get请求,通过请求行传参数,请求地址在请求行中,格式是?filename=参数,进行文件区分。创建一个servlet,从request对象获取下载的文件名,告知浏览器该文件的MIME类型response.setContentType(getServletContext().getMimeType()),再告知浏览器以附件的方式打开response.setHeader("Content-Disposition","attachment;filename=文件名称"), request.getparameter获得参数,获取文件的绝对路径 getservletcontext.getrealpath()明确数据源 明确目的地创建数值 开始复制。

如果咱们的文件名是中文名,点击下载的时候会出现500的情况,控制台会报文件找不到的异常。这里我们可以使用断点

 

在我们想看到的值的那行的左边蓝条出双击,打上断点,但是打上断点之后这一行就不走了,我们如果想看到这个值的话需要在这个值的下一行打上断点,启动服务器的debug模式开启,在浏览器访问jsp文件,点我们要下载的文件,会跳出这个弹窗,

该弹窗提示是否进入debug模式,点击yes,进入debug模式,标绿的那行代表已经走到,将鼠标放到我们想到的值上,显示乱码,这个时候的浏览器会一直转圈,说明浏览器已经堵塞,按f6可以将剩下的代码一步一步走,我们为了提高效率按f8直接跳到下一个断点上。我们可以找到问题所在,解决get请求乱码 文件名=new String(filename.getbytes(),utf-8)

解决之后文件没有了,因为如果下载中文文件,页面在下载时会出现中文乱码或不能显示文件名的情况, 原因是不同的浏览器默认对下载文件的文件名的编码方式不同,ie是UTF-8编码方式,而火狐 浏览器是Base64编码方式。所里这里需要解决浏览器兼容性问题,解决浏览器兼容 性问题的首要任务是要辨别访问者是ie还是火狐(其他),通过Http请求体中的一 个属性可以辨别。具体代码如下

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");

}

 

其中agent就是请求头User-Agent的值;在解决get乱码之后 获取user-agent的请求头,明确是什么浏览器,将以上代码复制一下,导包

posted @ 2021-03-09 21:31  Dyl啊  阅读(313)  评论(0编辑  收藏  举报