首先,解决两个小问题

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:文件下载的更多相关文章

  1. 一个使用Servlet文件实现文件下载的实例

    一个使用Servlet文件实现文件下载的实例 (可以扩充本实例实现:对用户隐藏他要下载文件的路径,或者在下载文件时要做一些其他的工作,如检查用户有没有下载此文件的权限等) 了解在Servlet中如何控 ...

  2. Servlet案例7:jsp技术及案例

    jsp运行原理: 根据jsp文件创建java文件(servlet),并编译运行 第一次访问时会被翻译成servlet后执行 jsp三个指令: 1.page指令:页面翻译运行的属性的配置(通常使用默认) ...

  3. servlet案例

    1.重定向 方式1:在servlet中写:response.setStatus(302);      response.setHeader("Location","路径& ...

  4. Servlet案例6:显示用户的上次访问时间

    这里是cookie的简单应用 告诉用户您的上次访问时间是:xxxx-xx-xx xx:xx:xx 思路: 第一次访问该网站时候,记录当前访问时间(new Date()) 把当前时间以cookie的形式 ...

  5. Servlet案例5:用户登录失败信息回显

    登录失败信息回显不会的新的一个页面,而是显示在登录页面 一种方法是: 登录页面表单中每个字段后添加<span>标签写入失败信息,利用ajax技术 通过改变<span>标签的di ...

  6. Servlet案例4:用户注册

    数据库准备: CREATE DATABASE web; USE web; CREATE TABLE `user` ( `uid` ) NOT NULL, `username` ) DEFAULT NU ...

  7. Servlet案例3:验证码功能

    这里介绍简单的验证码功能 动态生成图片 一个简单的页面: <!DOCTYPE html> <html> <head> <meta charset=" ...

  8. Servlet案例1:用户登录

    数据库准备: CREATE DATABASE web; USE web; CREATE TABLE users( id INT PRIMARY KEY AUTO_INCREMENT, username ...

  9. http 的request和response 在servlet的应用文件下载

    一)response 我们通过浏览器访问网站的时候,处理响应的是response. 它由三部门组成:响应行.响应头.响应体 作用:往浏览器写东西. 1)响应行 格式:协议/版本  状态码 状态码说明. ...

随机推荐

  1. ios中设置input为readonly后,解决弹起软键盘的问题

    可以在input中添加unselectable="on" onfocus="this.blur()",可以解决软键盘弹起问题 <input type=&q ...

  2. Python爬虫中文小说网点查找小说并且保存到txt(含中文乱码处理方法)

    从某些网站看小说的时候经常出现垃圾广告,一气之下写个爬虫,把小说链接抓取下来保存到txt,用requests_html全部搞定,代码简单,容易上手. 中间遇到最大的问题就是编码问题,第一抓取下来的小说 ...

  3. tensorflow 1.9 ,bazel 0.15.0,源码编ERROR, Skipping, '//tensorflow/tools/pip_package:build_pip_package',error loading packageCuda Configuration Error, Cannot find libdevice.10.bc under /usr/local/cuda-8.0

    最近在看tensorflow 移动端部署,需要编译源码才支持,所以又拾起来了编译这项老工作,其中遇到问题: bazel build --cxxopt="-D_GLIBCXX_USE_CXX1 ...

  4. 如何在 ajax 外拿到 ajax 的数据???和ajax的参数

    第一步:  var 变量名 = $.ajax({ url: "发送请求的地址", dataType: 'json', type: 'post', async: false }) 第 ...

  5. 解题(TakeBusChooseLine)

    题目描述 从小明家所在公交站出发有n路公交到公司,现给出每路公交的停站数(不包括起点和终点),及每次停的时间(一路车在每个站停的时间相同)和发车的间隔,先假定每辆车同时在相对时间0分开始发车,且所有车 ...

  6. Numpy三维数组的转置与交换轴

    二维数组的转置应该都知道,就是行列交换 而在numpy中也可以对三维数组进行转置,np.T 默认进行的操作是将0轴与2轴交换 本文主要对三位数组轴交换的理解上发表本人的看法. a = np.array ...

  7. MySQL安装与启动

    1.MySQL安装包下载 下载地址:https://dev.mysql.com/downloads/mysql/ 这里我的电脑是WIN764位的,大家根据自己的电脑自己选择要下载的包 2.解压安装 解 ...

  8. Unity 2018 By Example 2nd Edition

    Unity is the most exciting and popular engine used for developing games. With its 2018 release, Unit ...

  9. iis7 部署 mvc4项目提示404错误

    1.装了.net framework 4.0框架 2.重新注册了asp.net_iisreg -i 访问mvc项目仍提示404错误 搜了一下,有些服务器还要装个补丁 https://support.m ...

  10. gd_t , bd_t 结构分析

    在分析板级初始化函数board_init_f 和 board_init_r 之前,先来看一下在uboot中颇为重要的 gd_t, bd_t 结构 bd_t 所对应的定义bd_info 在 arch/a ...