当前位置: 首页 > news >正文

JSP隐含对象response实现文件下载的两种方式

一.JSP隐含对象response实现文件下载的介绍

(1)在JSP中实现文件下载最简单的方法是定义超链接指向目标资源,用户单击超链接后直接下载资源,但直接暴露资源的URL

也会带来一些负面的影响,例如容易被其它网站盗链,造成本地服务器下载负载过重。

(2)另外一种下载文件的方法是使用文件输出流实现下载,首先通过response报头告知客户端浏览器,将接收到的信息另存

为一个文件,然后用输出流对象给客户端传输文件数据,浏览器接收数据完毕后将数据另存为文件,这种下载方法的优点是服

务器端资源路径的保密性好,并可控制下载的流量以及日志登记等。


二.以下介绍两种文件的下载方式:

(1)二进制文件的下载

用JSP程序下载二进制文件的基本原理是:首先将源文件封装成字节输入流对象,通过该对象读取文件数据,获取response对象

的字节输出流对象,通过输出流对象将二进制的字节数据传送给客户端。

1.把源文件封装成字节输入流对象

2.读取二进制字节数据并传输给客户端

代码如下:

<%@ page contentType="application/x-download"  import="java.io.*" %>
<%
   int status=0;
   byte  b[]=new byte[1024];
   FileInputStream in=null;
   ServletOutputStream out2=null;
   try
   {
      response.setHeader("content-disposition","attachment; filename=d.zip");
	  in=new FileInputStream("c:\\tomcat\\webapps\\ROOT\\d.zip");
	  out2=response.getOutputStream();
	   while(status != -1 )
	     {
	        status=in.read(b);
		    out2.write(b);
	      }
      out2.flush();   
   }
   catch(Exception e)
   {
       System.out.println(e);
	   response.sendRedirect("downError.jsp");
    }
	finally
	{
	    if(in!=null)
		   in.close();
		if(out2 !=null)
		   out2.close();
	}
%>

(2)文本文件下载

文本文件下载时用的是字符流,而不是字节流。首先取得源文件的字符输入流对象,用java.io.FileReader类封装,

再把FileReader对象封装为java.io.BufferedReader,以方便从文本文件中一次读取一行。字符输出流直接用JSP的隐

含对象out,out能够输出字符数据。

代码如下:

<%@ page contentType="application/x-download"  import="java.io.*" %><%
   int status=0;
   String temp=null;
   FileReader in=null;
   BufferedReader in2=null;
   try
   {
      response.setHeader("content-disposition","attachment; filename=ee.txt");
	  response.setCharacterEncoding("gb2312");
	  in=new FileReader("c:\\tomcat\\webapps\\ROOT\\ee.txt");
	  in2=new BufferedReader(in);
	   while((temp=in2.readLine()) != null )
	     {
		    out.println(temp);
	      }  
	 out.close();
   }
   catch(Exception e)
   {
       System.out.println(e);
	   response.sendRedirect("downError.jsp");
    }
	finally
	{
	    if(in2!=null)
		   in2.close();
	}
%>


相关文章:

  • JSP动态生成验证码
  • 报表性能优化方案之多种报表服务器内存修改方法
  • JSP用过滤器解决request中文乱码问题
  • Advanced R之编程风格
  • SpringMVC实现一个controller写多个方法
  • 枚举类型的抽象方法定义实现
  • 大数据笔记07:大数据之Hadoop的HDFS(特点)
  • 【数据库学习笔记】(1)JDBC驱动程序的分类
  • 【数据库学习笔记】(2)JDBC加载并注册数据库驱动并连接数据库
  • 【数据库学习笔记】(3)SQL数据类型与Java数据类型的对应关系
  • 如何提高团队管理能力1
  • 【数据库学习笔记】(4)JDBC数据源和连接池
  • Flash制作遇到的小问题1--为何变形需要将图形打散(Ctrl+b)
  • MapReduce 规划 六系列 MultipleOutputs采用
  • BeanUtils数据封装与表单JavaBean
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • hadoop集群管理系统搭建规划说明
  • java第三方包学习之lombok
  • Java知识点总结(JavaIO-打印流)
  • underscore源码剖析之整体架构
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 区块链共识机制优缺点对比都是什么
  • 如何用vue打造一个移动端音乐播放器
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 网页视频流m3u8/ts视频下载
  • 回归生活:清理微信公众号
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (动态规划)5. 最长回文子串 java解决
  • (独孤九剑)--文件系统
  • (二)Eureka服务搭建,服务注册,服务发现
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .NET CLR基本术语
  • .net framework 4.0中如何 输出 form 的name属性。
  • .NET MVC之AOP
  • .NET6 开发一个检查某些状态持续多长时间的类
  • .net操作Excel出错解决
  • /var/lib/dpkg/lock 锁定问题
  • @transactional 方法执行完再commit_当@Transactional遇到@CacheEvict,你的代码是不是有bug!...
  • [<事务专题>]
  • [04]Web前端进阶—JS伪数组
  • [Angular] 笔记 6:ngStyle
  • [BJDCTF 2020]easy_md5
  • [BZOJ1089][SCOI2003]严格n元树(递推+高精度)
  • [c]扫雷
  • [C++] 多线程编程-thread::yield()-sleep_for()
  • [CC2642R1][VSCODE+Embedded IDE+IAR Build+Cortex-Debug] TI CC2642R1基于VsCode的开发环境
  • [CQOI 2010]扑克牌
  • [FFmpeg学习]从视频中获取图片
  • [Firefly-Linux] RK3568修改控制台DEBUG为普通串口UART
  • [HarekazeCTF2019]encode_and_encode 不会编程的崽