Servlet实现文件下载详解与实例

文件下载的Servlet示例 package com.fdw.servlet; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.F. 阅读详情


 像图片或者HTML这类静态资源,只要在浏览器打开就可以下载

 而 放在WEB-INF目录下,或是保存在数据库中的资源,Servlet/jsp容器不会将资源发送到浏览器中

 或是有时候需要控制某些人看到这个资源,同时又要防止其他网站跨站引用。每当遇到这类情况,就需要通过编程来发送资源


一.文件下载概述


文件下载就是为了将文件发送到浏览器,一般不用JSP页面,因为发送的是二进制代码,页面不会显示内容,需要在Servlet中完成以下工作:

  

1.将响应的内容类型设置为文本的内容类型。通过标头Content-Type 来规定实体主体中的数据类型,如果不了解什么是内容类型,就将它设置

为APPLICATION/OCTETSTREAM


2.添加一个名为Content-Disposition的HTTP响应标头,给它赋值attachment;filename=filename,这里的fileName 是指在文件下载对话框中显示出来

的默认文件名

例如,以下是将文件发送到浏览器代码:


FileInputStream fileInputStream=new FileInputStream(file);

BufferedInputStream bis=new BufferedInutStream(fileInputStream);

byte[] bytes=new bype[bis.available()];

response.setContentType(contentType);

OutputStream os=response. getOutputStream();

bis.read(bytes);

os.write(bytes);



二.实例1:隐藏资源


示范了如何将一个文件发送到浏览器。但是只有授权的用户才能浏览,如果用户没有登录,应用程序救护跳转到Login页面


在Login可以输入用户名称和密码,并将内容提交到Servlet:LoginServlet ,验证通过用户的HttpSession中的就会包含


loggedIn属性,就会跳转到FileDownloadServlet负责将文件发送到浏览器



login.jsp页面

<body>
   <form action="login" method="post">
   <table>
   <tr><td>User name:</td><td><input name="userName"></td>
   <tr><td>Password:</td><td><input name="password" type="password"></td>
   <tr>
   <td colspan="2"><input type="submit" value="Login"></td>
   </tr>
   
   
   </table></form>
  </body>

提交表单时会调用LoginServlet

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@WebServlet(urlPatterns="/login")
public class LoginServlet extends HttpServlet {
	
	private static final long serialVersionUID=-920L;
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		String userName=req.getParameter("userName");
		String password=req.getParameter("password");
		if(userName!=null&&userName.equals("ken")&&
				password!=null&&password.equals("secret")){
			HttpSession session=req.getSession();
			session.setAttribute("loggedIn",Boolean.TRUE );
			resp.sendRedirect("download");

		return;
		}else{
			RequestDispatcher dispatcher=req.getRequestDispatcher("/login.jsp");
			dispatcher.forward(req, resp);
		}
	}
			

}


用户登录成功后会设置一个loggedIn属性,并将用户转到FileDownloadServlet类

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@WebServlet(urlPatterns={"/download"})
public class FileDownloadServlet extends HttpServlet {
	
	private static final long serialVersionUID=7583L;
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		HttpSession session=req.getSession();
		if(session==null||session.getAttribute("loggedIn")==null){
			RequestDispatcher dispatcher=req.getRequestDispatcher("/login.jsp");
			dispatcher.forward(req, resp);
		return ;
       }
		
		String dataDirectory=req.getServletContext().getRealPath("/WEB-INF/data");
		File file=new File(dataDirectory, "secret.pdf");
		if(file.exists()){
			resp.setContentType("application/pdf");
			resp.addHeader("Content-Disposition", "attachment;filename=secret.pdf");
			byte[] buffer=new byte[1024];
			FileInputStream fis=null;
			BufferedInputStream bis=null;
			try{
				fis=new FileInputStream(file);
				bis=new BufferedInputStream(fis);
				OutputStream os=resp.getOutputStream();
				int i=bis.read(buffer);
				while(i!=-1){
					os.write(buffer,0,i);
					i=bis.read(buffer);
				}
			}catch(IOException ioe){
				System.out.println(ioe.toString());
			}finally{
				if(bis!=null){
					bis.close();
				}
				if(fis!=null){
					fis.close();
				}
			}
			
		}
	}

}




三.实例:防止跨站引用


防止其他网站通过跨站引用“”窃取“”你的网络资产。通过编程的方式,仅当referer标头中包含你的域名是才发送资源,就可以防止上述

情况发生。


下面程序使用一个Servlet,并且仅当referer标头不为空时,才将图片发送到浏览器。可以防止直接在浏览器中输入网址就能下载图片


ImageServlet 代码如下:


import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet(urlPatterns={"/getImage"})
public class ImageServlet extends HttpServlet {
	
	private static final long serialVesionUID=-99L;
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		String referrer=req.getHeader("referer");
		if(referrer!=null){
			String imageId=req.getParameter("id");
			String imageDirectory=req.getServletContext().
					getRealPath("/WEB-INF/image");
			File file=new File(imageDirectory,imageId+".pdf");
			if(file.exists()){
				resp.setContentType("image/pdf");
				byte[] buffer=new byte[1024];
				FileInputStream fis=null;
				BufferedInputStream bis=null;
				try{
					fis=new FileInputStream(file);
					bis=new BufferedInputStream(fis);
					OutputStream os=resp.getOutputStream();
					int i=bis.read(buffer);
					while(i!=-1){
						os.write(buffer,0,i);
						i=bis.read(buffer);
					}
				}catch(IOException ioe){
					System.out.println(ioe.toString());
				}finally{
					if(fis!=null){
						fis.close();
					}if(bis!=null){
						bis.close();
					}
				}
			}
		}
	}

}

通过一个html文件来测试这个程序 


<body>
    <img alt="" src="getImage?id=1"/>
     <img alt="" src="getImage?id=2"/>
      <img alt="" src="getImage?id=3"/>
       <img alt="" src="getImage?id=4"/>
        <img alt="" src="getImage?id=5"/>
         <img alt="" src="getImage?id=6"/>
  </body>

 实现将图片资源放在WEB-INF 里的image文件夹里


测试结果如下

servlet简单实现文件下载的方法 主要介绍了servlet简单实现文件下载的方法,涉及基于servlet技术实现流形式文件传输的相关操作技巧,需要的朋友可以参考下 立即下载

相关推荐

群晖Git Server权限配置全攻略:如何让普通用户(非admin)也能安全提交代码?

本文详细解析了群晖Git Server权限配置方案,特别针对普通用户(非admin)安全提交代码的需求。通过SSH服务配置、精细化用户权限管理及仓库创建自动化脚本,实现在DS218+等群晖NAS设备上的高效代码协作,同时确保系统安全。

weixin_42528780的博客 463

使用超链接和后台Servlet实现文件上传和下载(附图和代码)

使用工具:IntelliJ IDEA 2020.1.1、Tomcat 9.0.33 1.文件上传 文件上传涉及到前台页面的编写和后台服务器端代码的编写,前台发送文件,后台接收并保持文件,这才是一个完整的文件上传 1.1前台页面 在做文件上传时,会有一个上传文件的界面,首先需要一个表单,并且表单的请求方式为POST,其次form表单的enctype必须设为“multipart/form-data”,即enctype=“multipart/form-data”,意思是设置表单的类型为文件上传表单,默认情况下这个

xxxibgdrgn博客 2702

笔记:使用Materials Studio计算聚合物的玻璃化转变温度

使用Materials Studio计算聚合物的玻璃化转变温度。

FXJgogogo的博客 1939

(十六)Servlet教程——Servlet文件下载

rar文件

2358

【读书笔记】Verilog的亚稳态现象和跨时钟域处理方法

文章目录 一、亚稳态 (1)跨时钟域的亚稳态现象 (2)亚稳态的多径传输 二、跨时钟域处理 2.1 单bit信号跨时钟域处理 (1)单径两级触发器同步器 (2)相位控制 (3)多径与多级寄存器同步链 (4)组合逻辑信号的同步化 (5)快时钟域信号的同步化 2.2 多bit信号的跨时钟域处理 (1)异步FIFO (2)双口RAM.........

毕淑敏曾说过:“我不相信命运,我只相信自己的手;我不相信手掌上的纹路,但我相信手指加上手掌的力量”。在这个快节奏的社会,只有自己能力不足才会被卷,踏踏实实沉下心来学一些技术,及时记录,方便以后复盘。 2万+

UE5新手必看:如何用蓝图系统快速打造赛车游戏(含Chaos Physics配置)

本文为UE5新手提供使用蓝图系统快速打造赛车游戏的完整指南,涵盖Chaos Physics配置、载具蓝图架构设计、控制逻辑实现等关键步骤。通过详细的实战案例和优化技巧,帮助开发者高效构建具备专业物理反馈的赛车游戏原型。

weixin_29001327的博客 387

Servlet实现文件下载的功能

【代码】Servlet实现文件下载的功能。

诉衷情の麻雀的博客 479

PCB盲埋孔工艺全解析:从机械钻孔到激光钻孔的进阶之路

本文全面解析了PCB盲埋孔工艺,对比了机械钻孔与激光钻孔两种核心技术的工艺流程、优势与局限。机械钻孔成本低、工艺成熟,适用于常规孔径;激光钻孔则能实现微孔、叠孔等复杂HDI结构,精度更高。文章深入探讨了如何根据孔径、成本、板厚及产品需求选择合适工艺,并强调了设计与制造协同的重要性,为高密度PCB设计提供实用指南。

weixin_29306317的博客 682

Servlet 实现文件下载

文件的下载对于Web应用是必不可少的功能。Servlet实现文件下载只需5步:    准备下载的文件,打开文件输入流。   获取response响应输出流ServletOutputStream。   设置响应头Content-Disposition:attachment;filename=[文件名](此处的filename对应浏览器提示保存文件的文件名)。   读文件到响应输出流。   

Cloud-Future的博客 806

Java高频面试基础问题与知识点整理

Java高频面试知识点总结:覆盖高频基础知识考点+高频集合知识点深入分析+高频多线程与并发编程面试题汇总+其他扩展考察等。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 172万+

Visual Studio调试技巧与实用方法总结(实战经验分享)

本文根据多年的项目实战经验,详细介绍一些Visual Studio常用的高效调试手段与技巧。

dvlinker的技术专栏 3万+

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

一个使用Servlet文件实现文件下载的实例 (可以扩充本实例实现:对用户隐藏他要下载文件的路径,或者在下载文件时要做一些其他的工作,如检查用户有没有下载此文件的权限等) 了解在Servlet中如何控制输出流以及response对象的contentType相关知识 一个Servlet文件DownloadFile,在此Servlet中读取要下载的文件,然后写到响应流中以达到用户下载文件的目

lanchengxiaoxiao的专栏 629

【AI智能体】Coze 搭建个人旅游规划助手实战详解

Coze 制作旅游规划助手机器人实战详解

congge 4606

JavaWeb实现文件上传下载功能实例解析(idea的servlet可以用注解的方式)

*在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现。   对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件。这个common-fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,struts上

yy6818的博客 2640

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

servlet实现文件下载

servlet实现文件下载的原理很简单,从输入流读进来,写进输出流,这里的输出流当然就是response.getOutputStream();,而输入流是要下载的文件,不管这个文件放在哪里import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.File;impor

nokiaisacat的专栏 1226

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

servlet文件上传、多文件上传

文章目录一、课程目标二、基于Jar文件上传2.1 原理2.2 书写2.3 多文件上传三、基于注解文件上传3.1 原理2.2 书写四、文件下载4.1 原理4.2 书写五、LayUI文件上传组件5.1 使用5.2 配置属性 一、课程目标 【理解】servlet文件上传原理 【理解】servlet基于jar包文件上传 【掌握】servelt3.0注解形式的文件上传 【理解】多文件上传 【了解】文件下载原理 【理解】LayUi文件上传组件的使用 二、基于Jar文件上传 2.1 原理 将客户端的文件以流的形式进行解

温故。的博客 2540

用HttpServletResponse实现文件下载

要获取下载文件的路径 获取下载文件的文件名 让浏览器能够支持我们要下载的东文件 获取下载文件的输入流 创建缓冲区 获取OutputStream对象 将FileOutputStream写入到缓冲区,再使用OutputStream将缓冲区的数据输出到客户端 文件目录结构 在webapp目录下新建static文件夹,将图片放在static里 新建一个FileDownload类,继承于HttpServlet package com.tsingby; import javax.servlet.ServletE.

Java精灵 883

文件下载

文件下载 一、下载的两种方式 a)         超链接直接指向下载资源 b)        设置实现下砸需要的两个相应头:                         i.              设置Coutent-Type的值为application/x-msdownload. response.setContentType("application/x-msdownloa

336

使用Servlet实现下载文件的功能

使用Servlet实现下载文件的功能 在前台有一个下载链接,比如   a href="DownLoadServlet">下载a> br/>   使用Servlet实现下载:     import java.io.File; import java.io.FileInputStream; import java.io.IOExcepti

全栈空间 970

java web 文件上传与下载_javaweb实现文件上传与下载功能

本文实例为大家分享了javaweb文件的上传与下载,供大家参考,具体内容如下一、文件上传要实现Web开发的上传功能,通常需要完成两步操作:一是在Web页面中添加上传输入项;二是在Servlet中读取上传文件的数据,并保存到本地硬盘中。上传大多数情况是通过表单的形式提交给服务器,使用使用标签需要注意以下两点:1.必须设置name属性,不然浏览器不会发送上传文件的数据。2.必须将method属性设置为...

weixin_29119497的博客 620

iOS桌面组件开发全指南:WidgetKit时间线机制与审核避坑实录

桌面小组件作为iOS主屏幕的高频交互入口,正成为独立开发者切入苹果生态的轻量级赛道。其底层由WidgetKit框架支撑,核心在于时间线机制——开发者需预计算未来一段时间的数据快照,交由系统按时间节点渲染,从而兼顾实时性与低功耗。配合App Group共享容器,组件能与主App实现数据联动,覆盖倒数日、习惯打卡等典型场景。从技术选型、时间线设计到数据同步,再到苹果审核的细节规范,一款桌面组件App从立项到上架的全过程由此完整呈现,为iOS开发者的组件实践提供了可复用的工程参考。

weixin_30595035的博客 272

文件上传和下载(一)--【jsp+servlet】

一、文件上传 在TCP/IP中,最早出现的文件上传机制是FTP。它是将文件由客户端发送到服务器的标准机制。 但是在jsp编程中不能使用FTP方法来上传文件,这是由jsp运行机制所决定的。 通过为表单元素设置method="post" enctype="multipart/form-data"属性,让表单提交的数据以二进制编码的方式提交,在接收此请求的Servlet中用二进制流来获取内容,就可

qw765811529的专栏 1080

用servlet下载文件小结

用servlet实现了一个小小的文件下载,主要步骤是: 1获取要下载的文件 2定义Response的文件头,例如文件名/文件类型/长度之类 3用InputStream读取文件,并转成ServletOutputStream输出   protected void service(HttpServletRequest req, HttpServletResponse resp) t...

Man of Steel 226
上一篇: Servlet实现文件上传详解与实战
下一篇: Servlet中的异步处理
oldbig_lin
博客等级 码龄10年 78粉丝 72原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值