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();
	}
%>
时间: 2024-10-07 12:40:39

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

用户管理的设计--6.文件下载的两种方式

页面效果 实现步骤 1.Jsp页面要求 <TD class="ta_01" align="center" bgColor="#f5fafe">附件(下载):</TD> <TD class="ta_01" bgColor="#ffffff" colSpan="3"> <s:if test="elecUserFiles!=null &

js对象中属性调用.和[] 两种方式的区别

JS 调用属性一般有两种方法——点和中括号的方法. 标准格式是对象.属性(不带双引号),注意一点的是:js对象的属性,key标准是不用加引号的,加也可以,特别的情况必须加,如果key数字啊,表达式啊等等. 加引号是为了将其视为整体,认识一点:从对象角度,属性是不加引号的,如name,"name"这是啥,属性不可能是“name”,所以即使加了双引号,对象调用时还是要去掉引号的 例如 使用.方法 var obj = { name: "cedric" } console.

js对象 对属性调用.和[] 两种方式遇到过得区别

1   .标准格式是对象.属性(不带双引号)     注意一点的是js对象的属性,key标准是不用加引号的,加也可以,特别的情况必须加,如果key数字啊,表达式啊等等,加引号是为了将其视为整体,认识一点:从对象角度,属性是不加引号的,如name,"name"这是啥,属性不可能是“name”, 所以即使加了双引号,对象调用时还是要去掉引号的 2   []标准格式是对象["属性"]记住属性都是没有引号的,这种方式访问属性上必须有引号 论证一点不管key带不带引号,从对象

JSP隐含对象 request(2)

三.request隐含对象 客户端通过HTTP请求提交的信息会被servlet容器封装在request对象中,jsp页面程序通过request对象可操作客户端请求参数(parameter),属性(attribute)和客户端输入流等数据: parameter参数一般是由客户端通过HTTP POST或GET方法提交过来的参数,一般来客来自客户端或有上一个程序转发: attribute属性主要是服务器程序产生的数据产生的参数,一般不是来自客户端: (1)客户端传递给服务器的参数最常见的是表单数据或附

JSP简明教程(三):JSP隐含对象

所谓隐含对象就是已经被系统定义好的一些对象,可以直接使用.JSP中有以下几个隐含对象: request response out 可以使用out.flush来将缓冲区中的数据全都发送到客户端. session application 与整个应用的上下文有关. config pageContext 与JSP页面的上下文有关. page 在JSP页面中相当于this指针. exception 这个对象中包含了从先前页面中包含的异常信息. 下面请看一个使用隐含对象的例子: <% out.println

JSP隐含对象(1)

一.JSP隐含对象初见: (1)面试的时候总会有9大隐含对象,下边就详细介绍一下: (2)在JSP页面中,经常要处理request请求.response响应等信息,为了简化程序设计,JSP规范定义了常用的9个隐含对象(implicit objects), 这些隐含对象不需要在JSP页面中用new关键字来创建,而是由Servlet容器来创建与管理,并传递给JSP页面的Servlet实现类使用. (如下图) (3)在JSP页面Servlet实现类的_jspService()方法内部,自动初始化JSP

Asp.net Web API 返回Json对象的两种方式

这两种方式都是以HttpResponseMessage的形式返回, 方式一:以字符串的形式 var content = new StringContent("{\"FileName\": \"" + fileName + "\"}"); HttpResponseMessage response = new HttpResponseMessage() { Content = content }; response.Content

iOS:创建单例对象的两种方式

单例模式:创建单例对象的两种方式 方式一:iOS4版本之前 static SingleClassManager *singleManager = nil; +(SingleClassManager*)sharedManager { @synchronized(self)  //同步加锁,在多线程中使用,可以使线程安全 { if(singleManager == nil) { singleManager = [[SingleClassManager alloc]init]; } } return

JAVA中Arrays.sort()使用两种方式(Comparable和Comparator接口)对对象或者引用进行排序

一.描述 自定义的类要按照一定的方式进行排序,比如一个Person类要按照年龄进行从小到大排序,比如一个Student类要按照成绩进行由高到低排序. 这里我们采用两种方式,一种是使用Comparable接口:让待排序对象所在的类实现Comparable接口,并重写Comparable接口中的compareTo()方法,缺点是只能按照一种规则排序. 另一种方式是使用Comparator接口:编写多个排序方式类实现Comparator接口,并重写新Comparator接口中的compare()方法,