施用Tomcat的Sendfile功能发送文件

使用Tomcat的Sendfile功能发送文件

 

使用Tomcat的Sendfile功能发送文件

 

一般来说,我们将文件发送给客户端。是需要用流将文件读入内存,然后写入response。在tomcat6中, 引入了一种新的机制Sendfile(其实这个技术好像早就有了),文件将不再通过Servlet发送。而是由容器负责调用操作系统底层的函数来完成。这样一来,处理那些大文件的下载时,性能会好很多。

 

在Servlet中调用Sendfile功能,首先要保证Tomcat使用的NIO或者APR的Connector。并且,保证在发送命令的前后,response的头或者内容不会被修改。

 

我们需要调用Request对象的setAttribute。分别设置如下三个属性:

 

 

  • org.apache.tomcat.sendfile.filename   String类型。被发送文件在磁盘上的绝对路径
  • org.apache.tomcat.sendfile.start Long类型。文件的开始位置。如果发送完整的文件,这里就传入0。单位:字节
  • org.apache.tomcat.sendfile.end Long类型。文件的接入位置。如果发送完整文件。此处应传入文件的长度。单位:字节

 

 

如此一来,容器就会将文件的内容发送至客户端了。比用流的方式应该会好很多。另外说明一下,如果想控制客户端看到的文件名,那么需要在Response对象中加入一个Header:Content-Disposition。值为:attachment; filename="文件名"。

 

另外,如果需要让客户端看到下载的进入。还需要加入头,或者调用response.setContentLength来预先告诉客户端文件的大小。

 

下面是一个代码。会将一个大小为1K、 位于C盘根目录下的test.dat文件发送至客户端。放入一个jsp中,就可以执行了:

 

<%
request.setAttribute("org.apache.tomcat.sendfile.filename", "c:\\temp.txt"); //file on server
request.setAttribute("org.apache.tomcat.sendfile.start", 0L);
request.setAttribute("org.apache.tomcat.sendfile.end", 12288L);

response.addHeader("Content-Disposition", "attachment; filename=\"temp.txt\""); 
response.setContentLength(12288);
response.setContentType("stream/binary");
return;
%>
 

 

原文地址:http://info.michael-simons.eu/2011/06/28/apache-httpd-tomcat-und-sendfile/