javaweb学习总结二十六(response对象的用法二 下载文件)

时间:2021-01-18 11:48:40

一:浏览器打开服务器上的文件

1:读取服务器上面的资源,如果在web层,可以直接使用servletContext,如果在非web层

可以使用类加载器读取文件

2:向浏览器写数据,实际上是把数据封装到response对象上,然后服务器发现response中响应

体中有数据绑定,然后写给浏览器

3:设置响应头,控制浏览器的读取或者解析方式

如下:打开服务器上的图片

 /**在页面上查看图片*/
private void viewImage(HttpServletResponse response) throws IOException {
// 设置响应头 在网页上查看图片
response.setHeader("content-type", "image/jpeg");
InputStream in = this.getServletContext().getResourceAsStream(
"/download/1.jpg");
OutputStream out = response.getOutputStream();
int length = 0;
byte[] buf = new byte[1024];
while ((length = in.read(buf)) > 0) {
out.write(buf, 0, length);
}
out.flush();
out.close();
}

二:下载服务器上面的文件

1:下载文件与打开文件类似,都是先读取服务器上面的文件,然后再想浏览器写文件,

只是响应头不同而已。

response.setHeader("content-disposition", "attachment;filename=1.jpg");

 /**下载图片*/
private void downloadImage(HttpServletResponse response) throws IOException {
// 设置响应头 在网页上查看图片
response.setHeader("content-disposition", "attachment;filename=1.jpg");
InputStream in = this.getServletContext().getResourceAsStream(
"/download/1.jpg");
OutputStream out = response.getOutputStream();
int length = 0;
byte[] buf = new byte[1024];
while ((length = in.read(buf)) > 0) {
out.write(buf, 0, length);
}
out.flush();
out.close();
}

2:如果需要获取文件的名称,最好先获取服务器上文件的绝对路径,然后在读取,写内容到浏览器。

String path = this.getServletContext().getRealPath("/download/高圆圆.jpg");

 private void downloadImage2(HttpServletResponse response){
String path = this.getServletContext().getRealPath("/download/高圆圆.jpg");
String filename = path.substring(path.lastIndexOf("\\")+1);
//设置下载文件响应头
response.setHeader("content-disposition", "attachment;filename="+filename);
InputStream in = null;
OutputStream out = null;
try {
in = new FileInputStream(path);
out = response.getOutputStream();
int len = 0;
byte[] buf = new byte[1024];
while((len = in.read(buf)) > 0){
out.write(buf, 0, len);
}
} catch (Exception e) {
e.printStackTrace();
} finally{
if(null != in){
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(null != out){
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

如果文件名为中文时,下载会出现乱码问题,导致无法下载,

这时我们可以先对文件名称进行编码,如下:

 String filename = path.substring(path.lastIndexOf("\\")+1);
try {
filename = URLEncoder.encode(filename,"utf-8");
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}

这样乱码问题就解决了!