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

原文地址:https://www.cnblogs.com/xuyiqing/p/8408718.html

时间: 2024-11-13 07:56:25

Servlet案例2:文件下载的相关文章

Servlet案例7:jsp技术及案例

jsp运行原理: 根据jsp文件创建java文件(servlet),并编译运行 第一次访问时会被翻译成servlet后执行 jsp三个指令: 1.page指令:页面翻译运行的属性的配置(通常使用默认) language="java"   可以嵌入的语言 contentType="text/html; charset=UTF-8"   设置servlet的response.setContentType内容 pageEncoding="UTF-8" 

myeclipse中servlet开发之文件下载

文件下载功能: 1.代码编写: 2.运行测试: 点击保存,出现保存到哪的对话框. 怎么设置不缓存(当把光标放在url栏,直接按回车,页面刷新而不是从缓存中取数据) 指定缓存时间: response.setHeader("Expires",System.currentTimeMills()+3600*1000*24)//设置的是一天

servlet案例

1.重定向 方式1:在servlet中写:response.setStatus(302);      response.setHeader("Location","路径"): 方式2:在servlet中写:response.sendRedirect("路径"); 2.通过servlet向浏览器输出中文的编码问题: 方式1:在servlet中添加:response.setContentType("text/html;charset=utf

【Servlet+Struts2】文件下载时抛出java.lang.IllegalStateException异常的解决方法

java.lang.IllegalStateException这种异常,不代表文件不能下载,不代表程序写错,它在Tomcat抛出完异常之后依然能够正常运行的.只是看着不爽而已,每次下载都要在Tomcat抛出一大堆异常. java.lang.IllegalStateException主要是用了后台把文件丢进respond的缓冲区,然后respond再把下载的文件扔回JSP的情况所造成的.Servlet与Struts2反正是JSP都有可能存在.其主要原因JSP在对缓冲区读,后台JAVA在对缓冲写所导

Servlet案例1:用户登录

数据库准备: CREATE DATABASE web; USE web; CREATE TABLE users( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(64), PASSWORD VARCHAR(64), email VARCHAR(64) ); INSERT INTO users (username,PASSWORD,email) VALUES("tom","123","tom@qq.co

Servlet案例4:用户注册

数据库准备: CREATE DATABASE web; USE web; CREATE TABLE `user` ( `uid` VARCHAR(64) NOT NULL, `username` VARCHAR(20) DEFAULT NULL, `password` VARCHAR(20) DEFAULT NULL, `name` VARCHAR(20) DEFAULT NULL, `email` VARCHAR(30) DEFAULT NULL, `telephone` VARCHAR(20

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

这里是cookie的简单应用 告诉用户您的上次访问时间是:xxxx-xx-xx xx:xx:xx 思路: 第一次访问该网站时候,记录当前访问时间(new Date()) 把当前时间以cookie的形式写给客户端(response.addCookie) 第二次访问时候,获取客户端携带的相应的cookie,并且显示给用户 覆盖上次访问时间 代码实现: package cookie; import java.io.IOException; import java.text.SimpleDateForm

文件下载案例 January 27,2020

## 案例: * 文件下载需求: 1. 页面显示超链接 2. 点击超链接后弹出下载提示框 3. 完成图片文件下载 * 分析: 1. 超链接指向的资源如果能够被浏览器解析,则在浏览器中展示,如果不能解析,则弹出下载提示框.不满足需求 2. 任何资源都必须弹出下载提示框 3. 使用响应头设置资源的打开方式: * content-disposition:attachment;filename=xxx * 步骤: 1. 定义页面,编辑超链接href属性,指向Servlet,传递资源名称filename

Servlet(二)之request和response

一.简介 web服务器收到客户端的Http请求后,会针对每一次请求,分别创建一个用于代表请求的request对象和代表响应的response对象. request和response既然代表请求和响应,那么我们要获取客户端提交过来的数据,只需要找request对象就可以了,要向客户机输出数据,仅仅需要找response对象就行了. Response对象 二.响应 响应行 public void setStatus(int sc)设置状态码 响应头:key:value的形式,一个key可以对应一个v