使用nginx+springmvc实现文件下载

文件下载可以通过nginx直接实现,不必通过后端server程序就能直接下载,而且通过nginx下载效率很高,但是有时候需要在server端处理一些业务逻辑,比如统计下载次数,判断是否有权限下载等。如果通过server端程序实现下载,返回文件流,当文件比较大或者并发下载压力较大的时候,效率上跟nginx比就会差很多。现在很多web服务器都提供了相应的解决方法,使用response header来控制下载,nginx相应的response header叫X-Accel-Redirect。

客户端下载文件的时候,最初header中没有X-Accel-Redirect,nginx并不会将文件直接返回,而是传送到后端服务器程序处理,在后端执行完业务逻辑之后可以在response header里添加X-Accel-Redirect的信息,结束处理,当请求返回到nginx之后,根据X-Accel-Redirect的信息,可以将文件返回给客户端。

Nginx 配置样例:

location /protected/ {

   internal;

   root /some/path;

}

internal表示这个是内部指令,只有内部的请求才能使用,客户端不能直接访问,即使客户端伪造 "X-Accel-Redirect" 下载文件也不行。

注意事项:

在使用时候,以下头信息是不能被Nginx更改的(即这些信息得由server端程序来指定!)
  Content-Type
  Content-Disposition
  Accept-Ranges
  Set-Cookie
  Cache-Control
  Expires
如果其中的一些信息没有指定,那么重定向请求设置!

posted @ 2013-07-28 22:39  7mile  阅读(1210)  评论(0编辑  收藏  举报