zoukankan      html  css  js  c++  java
  • 【Servlet】把文件写到Respond输出流里面供用户下载

    本文区分于《【Jsp】把Java写到Respond输出流里面供用户下载》(点击打开链接)把原本该打印到控制台的内容,直接打印到一个文本文件txt中给用户下载。

    实际上是《【Struts2】中文文件的下载与下载权限的控制》(点击打开链接)不使用三大框架。纯属使用Servlet去实现。怎样把在Tomcat服务端上的文件资源,给用户下载。

    例如以下图的JavaEE文件夹结构。在Tomcat上ServletDownloadTestproject的根文件夹有张Chrysanthemum.jpg的图片


    可是。用户输入http://localhost:8080/ServletDownloadTest/download.java訪问名为download这个Servlet会出现一个下载图片的下载提示框,例如以下图:


    下载之后能够打开。而不是像img标签那样,直接把图片标签显示在网页。

    这里是显示非常easy,首先因为使用了Servlet3.0的凝视方式,web.xml里面什么都没有,

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xmlns="http://java.sun.com/xml/ns/javaee"
    	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    	version="3.0">
    
    </web-app>
    关键是download.java里面的代码,获取服务端存放文件的真实路径之后,把这个文件先写到缓冲区,再把缓冲区的东西写到respond输出流供用户下载。

    import java.io.*;
    import java.net.*;
    import javax.servlet.*;
    import javax.servlet.http.*;
    import javax.servlet.annotation.*;
    
    @WebServlet(name = "download", urlPatterns = { "/download" })
    public class download extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    
    	protected void service(HttpServletRequest request,
    			HttpServletResponse response) throws ServletException, IOException {
    		String filePath = this.getServletContext().getRealPath("/");// 获取真实路径
    		String downloadFilename = "中文是没有问题的.jpg";// 在下载框默认显示的文件名称
    		downloadFilename = URLEncoder.encode(downloadFilename, "UTF-8");
    		// 对默认下载的文件名称编码。不编码的结果就是,在client下载时文件名称乱码
    		File file = new File(filePath + File.separator + "Chrysanthemum.jpg");
    		if (file.exists()) {
    			// 写明要下载的文件的大小
    			response.setContentLength((int) file.length());
    			response.setHeader("Content-Disposition", "attachment;filename="
    					+ downloadFilename);// 设置在下载框默认显示的文件名称
    			response.setContentType("application/octet-stream");// 指明response的返回对象是文件流
    			// 读出文件到response
    			// 这里是先须要把要把文件内容先读到缓冲区
    			// 再把缓冲区的内容写到response的输出流供用户下载
    			FileInputStream fileInputStream = new FileInputStream(file);
    			BufferedInputStream bufferedInputStream = new BufferedInputStream(
    					fileInputStream);
    			byte[] b = new byte[bufferedInputStream.available()];
    			bufferedInputStream.read(b);
    			OutputStream outputStream = response.getOutputStream();
    			outputStream.write(b);
    			// 人走带门
    			bufferedInputStream.close();
    			outputStream.flush();
    			outputStream.close();
    		}
    	}
    }
    


  • 相关阅读:
    homework2
    homework1
    软工实践个人总结
    实验 7:OpenDaylight 实验——Python 中的 REST API 调用 (选做题)
    第4次作业-结对编程之实验室程序实现
    实验 6:OpenDaylight 实验——OpenDaylight 及 Postman 实现流表下发
    实验 5:OpenFlow 协议分析和 OpenDaylight 安装
    软件工程结对作业需求分析与原型
    实验 4:Open vSwitch 实验——Mininet 中使用 OVS 命令
    实验 3:Mininet 实验——测量路径的损耗率
  • 原文地址:https://www.cnblogs.com/jzssuanfa/p/7373474.html
Copyright © 2011-2022 走看看