基于Nginx XSendfile+SpringMVC进行文件下载
2018-12-15 13:38:10
1050 次阅读
0 个评论
在平常我们实现文件下载通常是通过普通 read-write方式,如下代码所示。
由于程序的IO都是调用系统底层IO进行文件操作,于是这种方式在read和write时系统都会进行两次内存拷贝(共四次)。linux 中引入的 sendfile 的实际就为了更好的解决这个问题,从而实现"零拷贝",大大提升文件下载速度。
在apache,nginx,lighttpd等web服务器当中,都有sendfile feature。下面就对 nginx 上的XSendfile与SpringMVC文件下载及访问控制进行说明。我们这里的大体流程为:
1.用户发起下载课件请求; (http://dl.mydomain.com/download/courseware/1)
2.nginx截获到该(dl.mydomain.com)域名的请求;
3.将其proxy_pass至应用服务器;
4.应用服务器根据课件id获取文件存储路径等其它一些业务逻辑(如增加下载次数等);
5.如果允许下载,则应用服务器通过setHeader -> X-Accel-Redirect 将需要下载的文件转发至nginx中);
6.Nginx获取到header以sendfile方式从NFS读取文件并进行下载。
其nginx中的配置为:
在location中加入以下配置
Spring代码为:
相关话题
- Nginx 设置 X-Accel-Redirect 控制文件下载
- SpringMVC流式上传文件
- Spring MVC 文件下载
- SpringMVC使用StandardServletMultipartResolver上传文件
- SpringMVC 配置servlet3.0 文件上传
- Nginx支持字体文件
- nginx 多组件安装及secure_link配置与文件下载防盗链的使用
- 使用 Jsoup 对 html 进行过滤
- Spring下载地址
- SpringMVC 限流量
- Apache的commons-net实现FTP的文件上传下载
- SpringMVC获取Request域
- 解决IE浏览器不支持Spring MVC 文件下载的问题
- Nginx 上传文件出现413 Request Entity Too Large错误
- Java OCR使用Tess4J进行图片文字识别