Servlet案例2:文件下载
首先,解决两个小问题
1.输入中文乱码问题
一个小Demo即可解决:
package demo; import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class DemoServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { //设置response查询的码表
//response.setCharacterEncoding("UTF-8"); //通过一个头 Content-Type 告知客户端使用何种码表
//response.setHeader("Content-Type", "text/html;charset=UTF-8"); //以上两行可以简写成这样,Tomcat自动设置编码
response.setContentType("text/html;charset=UTF-8"); PrintWriter writer = response.getWriter();
//writer.write("hello response!!!");写英文不需要考虑编码问题
writer.write("你好"); } protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
2.怎么在客户端页面看到图片
用到字节流,示例如下:
package demo; import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream; import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class ByteServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { // 使用response获得字节输出流
ServletOutputStream out = response.getOutputStream(); // 获得服务器上的图片
String realPath = this.getServletContext().getRealPath("a.jpg");
InputStream in = new FileInputStream(realPath); // 字节数组提高效率
int len = 0;
byte[] buffer = new byte[1024];
while ((len = in.read(buffer)) > 0) {
out.write(buffer, 0, len);
} in.close();
out.close(); } protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
接下来是文件下载案例:
WebContent目录下创建download文件夹,放入各种文件,以供下载
这里有两种方式下载:
1.<a>标签直接指向服务器资源,浏览器显示能解析的,解析不了的提供下载
这种方式只需要html代码即可(新建download.html)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>使用a标签指向服务器上的资源</h1>
<a href="/WEB4/download/a.flv">a.flv</a>
<br />
<a href="/WEB4/download/a.jpg">a.jpg</a>
<br />
<a href="/WEB4/download/a.flv">a.mp3</a>
<br />
<a href="/WEB4/download/a.mp4">a.mp4</a>
<br />
<a href="/WEB4/download/a.txt">a.txt</a>
<br />
<a href="/WEB4/download/a.zip">a.zip</a>
<br />
<h1>使用服务器端编码的方式实现文件下载</h1>
<a href="/WEB4/downloadServlet?filename=a.flv">a.flv</a>
<br />
<a href="/WEB4/downloadServlet?filename=a.jpg">a.jpg</a>
<br />
<a href="/WEB4/downloadServlet?filename=a.mp3">a.mp3</a>
<br />
<a href="/WEB4/downloadServlet?filename=a.mp4">a.mp4</a>
<br />
<a href="/WEB4/downloadServlet?filename=a.txt">a.txt</a>
<br />
<a href="/WEB4/downloadServlet?filename=a.zip">a.zip</a>
<br />
</body>
</html>
2.使用服务器端编码的方式实现文件下载
package demo; import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream; import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class DownloadServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获得要下载文件名称
String filename = request.getParameter("filename");
// 下载的文件类型(MIME类型)
response.setContentType(this.getServletContext().getMimeType(filename));
// 告诉客户端该文件不是直接解析 而是以附件形式打开(下载)
response.setHeader("Content-Disposition", "attachment;filename=" + filename);
// 获取文件的绝对路径
String path = this.getServletContext().getRealPath("download/" + filename);
// 获得该文件输入流
InputStream in = new FileInputStream(path);
// 通过response获得输出流
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();
out.close();
} public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
还有一个小问题没有解决,文件名如果是中文,需要解决编码问题:
package demo; 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; public class DownloadServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { // *******文件名称是中文的下载******* // 获得要下载的文件的名称
String filename = request.getParameter("filename");
// 解决获得中文参数的乱码
filename = new String(filename.getBytes("ISO8859-1"), "UTF-8"); // 获得请求头中的User-Agent
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");
} // 要下载的这个文件的类型-----客户端通过文件的MIME类型去区分类型
response.setContentType(this.getServletContext().getMimeType(filename));
// 告诉客户端该文件不是直接解析 而是以附件形式打开(下载)----filename="+filename 客户端默认对名字进行解码
response.setHeader("Content-Disposition", "attachment;filename=" + filenameEncoder); // 获取文件的绝对路径
String path = this.getServletContext().getRealPath("download/" + filename);
// 获得该文件的输入流
InputStream in = new FileInputStream(path);
// 获得输出流---通过response获得的输出流 用于向客户端写内容
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();
out.close(); } protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
注意事项:
1.response获得的流其实不需要手动关闭,Tomcat会自动关闭
2.response的getwrite和getoutputstream方法不能同时调用
Servlet案例2:文件下载的更多相关文章
- 一个使用Servlet文件实现文件下载的实例
一个使用Servlet文件实现文件下载的实例 (可以扩充本实例实现:对用户隐藏他要下载文件的路径,或者在下载文件时要做一些其他的工作,如检查用户有没有下载此文件的权限等) 了解在Servlet中如何控 ...
- Servlet案例7:jsp技术及案例
jsp运行原理: 根据jsp文件创建java文件(servlet),并编译运行 第一次访问时会被翻译成servlet后执行 jsp三个指令: 1.page指令:页面翻译运行的属性的配置(通常使用默认) ...
- servlet案例
1.重定向 方式1:在servlet中写:response.setStatus(302); response.setHeader("Location","路径& ...
- Servlet案例6:显示用户的上次访问时间
这里是cookie的简单应用 告诉用户您的上次访问时间是:xxxx-xx-xx xx:xx:xx 思路: 第一次访问该网站时候,记录当前访问时间(new Date()) 把当前时间以cookie的形式 ...
- Servlet案例5:用户登录失败信息回显
登录失败信息回显不会的新的一个页面,而是显示在登录页面 一种方法是: 登录页面表单中每个字段后添加<span>标签写入失败信息,利用ajax技术 通过改变<span>标签的di ...
- Servlet案例4:用户注册
数据库准备: CREATE DATABASE web; USE web; CREATE TABLE `user` ( `uid` ) NOT NULL, `username` ) DEFAULT NU ...
- Servlet案例3:验证码功能
这里介绍简单的验证码功能 动态生成图片 一个简单的页面: <!DOCTYPE html> <html> <head> <meta charset=" ...
- Servlet案例1:用户登录
数据库准备: CREATE DATABASE web; USE web; CREATE TABLE users( id INT PRIMARY KEY AUTO_INCREMENT, username ...
- http 的request和response 在servlet的应用文件下载
一)response 我们通过浏览器访问网站的时候,处理响应的是response. 它由三部门组成:响应行.响应头.响应体 作用:往浏览器写东西. 1)响应行 格式:协议/版本 状态码 状态码说明. ...
随机推荐
- cut命令详解
1.简介:cut:以某种方式按照文件的行进行分割 2.参数列表: -b:仅显示行中指定直接范围的内容: -c:仅显示行中指定范围的字符: -d:指定字段的分隔符,默认的字段分隔符为“TAB”: -f: ...
- A除以B
1017 A除以B (20)(20 分) 本题要求计算A/B,其中A是不超过1000位的正整数,B是1位正整数.你需要输出商数Q和余数R,使得A = B * Q + R成立. 输入格式: 输入在1行中 ...
- 特大数字之和,返回结果是字符串(考虑到数字特别大,如果相加会产生e)
自己做的,没有整理代码,还是做出来了: 做这个题时,最总要的一步思路就是,先让长度一致,然后从个位开始,每一个与每一个数字相加,如果大于10,则下一次另外两个数相加时加1 function add(a ...
- Java的学习05
今天学习了,Java中的LinkedList类.这个类需要用到链表的知识,以前一直以为,只有c/c++有链表.今天才知道,原来其他语言.也有链表,而且还是双向链表. /** * 自定义一个链表 * @ ...
- github 访问速度太慢
151.101.112.249 http://global-ssl.fastly.Net 192.30.253.112 http://github.com 在hosts文件添加 另 pip里的pyec ...
- Python设计模式 - UML - 组件图(Component Diagram)
简介 组件图又称构建图,用于显示系统各组件及各组件关系的物理视图. 组件图通常包括组件.接口.关系.端口和连接器,用来显示程序代码中相应的模块.源文件或源文件集合之间的依赖和泛化关系. 组件图中的组件 ...
- python + Jquery,抓取西东网上的Java教程资源网址
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Date : 2018-06-15 14:01:45 # @Author : Chenjun (320 ...
- Centos7+hadoop2.7.3+jdk1.8
修改主机名 1. 修改主机名 vi /etc/sysconfig/network ,改为 master , slave1 , slave2 2. source /etc/sy ...
- 带标签的循环语句、switch
今天继续更新,控制流程的剩余部分内容,带标签的循环语句中的continue/break 的使用方法,以及switch关键字的使用方法.例1:带标签的continue/break.package com ...
- python 常用标准库
标准库和第三方库第一手资料: 在线: 官方文档(https://docs.python.org/) 离线:交互式解释器(dir().help()函数),IPython(tab键提示.?.??) 一. ...