业务场景:
1. 后端服务为java web应用,使用tomcat容器,多实例集群化部署。
2. 前端使用nginx作为后端应用的反向代理。

业务需求:
现在需要在java web应用端上传文件,同时还要能支持文件下载。

设计方案:
1. 文件应该专门使用文件服务器进行存储,在数据库中存储文件下载链接即可。
2. tomcat容器本身不擅长做文件上传下载的事情,所以最好将文件上传下载的功能与web服务分离,比如使用nginx作为文件服务器。

具体实现:
通常,针对简单的应用,可以使用NFS,在web端上传文件后直接写到文件服务器;或者将文件上传到web应用之后,再将文件同步到文件服务器。
不论是通过NFS或者任何其他同步工具的方式,都存在文件中转的过程,必须先将文件通过web应用进行上传保存,再同步到文件服务器。中间可能存在同步出错或延时,也存在扩展性不好的问题。
所以,设计实现方案如下:

1. 使用http协议通过web表单方式上传文件。
2. 在文件服务器上部署web服务器,专门用于文件上传。
3. 通常在web应用中上传文件时,除了上传文件数据,还需要传递一些文字。文字保存在数据库中,文件保存在服务器上,同时将生成文件下载链接保存在数据库。
4. 通过MD5校验文件内容,避免相同文件因为文件名不同而被恶意上传导致大量垃圾文件占满磁盘空间。

结合实际的业务需求,我们的上传文件流量不是很大,所以还是直接使用tomcat作为文件上传的web服务。文件下载使用nginx。
另外,为了避免需要通过在session中保存数据带来的问题,尽量将参数保存在request进行传递。举个例子:
通常在tomcat中会将用户登录的数据保存在session中,便于进行用户合法性验证,而文件上传时请求是在文件服务器上处理,无法获取到tomcat中的session对象。
为了解决这个问题,可以将session中的数据通过request传递到页面,在文件上传时又通过参数的方式传递给文件服务器。
直接传递参数存在安全漏洞,应该将参数进行加密处理。

特别注意:
经过验证,分离web服务和文件上传服务是可行的,但是因为存在跨域问题,所以在文件上传服务中必须要设置消息头:Access-Control-Allow-Origin。
具体的Servlet代码如下:

public class FileUploadServlet extends HttpServlet {
@Override
protected void doOptions(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setHeader("Access-Control-Allow-Origin", "*"); //在options方法中设置跨域消息头
super.doOptions(req, resp);
} @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//处理文件上传逻辑
}
}

【参考】
https://segmentfault.com/q/1010000007377501  站点做动静分离,如何处理用户上传文件呢?
http://www.cnblogs.com/rainy-shurun/p/5407085.html 上传文件服务器与web内容服务分离
http://www.cnblogs.com/xdp-gacl/p/4200090.html JavaWeb学习总结(五十)——文件上传和下载
https://stackoverflow.com/questions/304268/getting-a-files-md5-checksum-in-java Getting a File's MD5 Checksum in Java

上传文件服务与web服务分离的更多相关文章

  1. restTemple发送请求、上传文件(@LoadBalanced微服务调用及url调用)

    import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Co ...

  2. Linux上搭建文件浏览的web服务(创建软件仓库)(一)

    软件仓库的创建方式有很多,这是一种很简单的创建方式: python -m SimpleHTTPServer 快速搭建一个http服务,提供一个文件浏览的web服务. 使用:Python SimpleH ...

  3. Qt通过HTTP POST上传文件(python做服务端,附下载)

    本文使用Qt Creator用HTTP POST的方法上传文件,并给出一个上传文件的例程. 本文主要客户端,所以对于服务器端程序编写的描述会比较简略 服务器使用Django编写,django服务器接收 ...

  4. MIME类型-服务端验证上传文件的类型

    MIME的作用 : 使客户端软件,区分不同种类的数据,例如web浏览器就是通过MIME类型来判断文件是GIF图片,还是可打印的PostScript文件. web服务器使用MIME来说明发送数据的种类, ...

  5. asp.net MVC 上传文件 System.Web.HttpException: 超过了最大请求长度

    APS.NET MVC 上传文件出现  System.Web.HttpException: 超过了最大请求长度 这个问题 原因是 默认最大上传文件大小为4096,而我提交的文件太大了. 解决方案:修改 ...

  6. 使用Http协议Post上传文件

    转载:http://www.cnblogs.com/softidea/p/5745369.html 转载:https://blog.csdn.net/huanongying131/article/de ...

  7. ASP.NET实现二维码 ASP.Net上传文件 SQL基础语法 C# 动态创建数据库三(MySQL) Net Core 实现谷歌翻译ApI 免费版 C#发布和调试WebService ajax调用WebService实现数据库操作 C# 实体类转json数据过滤掉字段为null的字段

    ASP.NET实现二维码 using System;using System.Collections.Generic;using System.Drawing;using System.Linq;us ...

  8. django系列6--Ajax05 请求头ContentType, 使用Ajax上传文件

    一.请求头ContentType ContentType指的是请求体的编码类型,常见的类型共有三种: 1.application/x-www-form-urlencoded 这应该是最常见的 POST ...

  9. PHP socket上传文件图片

    最近了解了下下socket方面的东西,想做一个socket上传文件的例子. 在网上搜了搜代码执行后,图片数据传输了一半,图片的下半部分是灰色的.然后就自己仿着搜来的代码和php.net 中socket ...

  10. Linux下vsftpd的安装,Java上传文件实现。

    首先我们需要查看是否已经安装vsftpd,输入命令 :vsftpd  -v.如果出现以下信息,那么就说明已经安装vsftpd 如果没有安装,那么输入命令   : yum  install vsftpd ...

随机推荐

  1. 自学Python4.5-装饰器举例

    自学Python之路-Python基础+模块+面向对象自学Python之路-Python网络编程自学Python之路-Python并发编程+数据库+前端自学Python之路-django 自学Pyth ...

  2. 【Luogu3731】[HAOI2017]新型城市化(网络流,Tarjan)

    [Luogu3731][HAOI2017]新型城市化(网络流,Tarjan) 题面 洛谷 给定一张反图,保证原图能分成不超过两个团,问有多少种加上一条边的方法,使得最大团的个数至少加上\(1\). 题 ...

  3. 【原创】hdu 1166 敌兵布阵(线段树→单点更新,区间查询)

    学习线段树的第三天...真的是没学点啥好的,又是一道水题,纯模板,我个人觉得我的线段树模板还是不错的(毕竟我第一天相当于啥都没学...找了一整天模板,对比了好几个,终于找到了自己喜欢的类型),中文题目 ...

  4. InnoDB,5项最佳实践,知其所以然?

    InnoDB,5项最佳实践,知其所以然? 原创: 58沈剑 架构师之路 昨天 缓存讲了一个月<缓存架构,一篇足够>.今天,开始写数据库. 第一篇,说说MySQL两个最常用的存储引擎,MyI ...

  5. OpenLayers学习笔记(一)—在线加载谷歌影像地图&离线加载本地瓦片地图

    实现根据在线离线判断加载地图, 在线加载谷歌影响地图, 离线加载本地瓦片地图 作者: 狐狸家的鱼 Github: 八至 html代码 <div id="map" tabind ...

  6. 记录EXCEL格式和TXT文本格式之间的互转

    EXCEL格式转变成TXT文本格式 1.打开execl文档,点击文件另存为 2.选择txt保存 3.重命名文档,打开该txt文档 4.按Ctrl+H,将文档中空格转换成其他分割符,单击确定 TXT格式 ...

  7. 无法删除foo.length

  8. HTML学习笔记Day8

    一.设置元素背景透明属性{background:rgba(255,255,255,0.5):} 1.元素背景透明,内容正常显示: 注:opacity:value:元素背景透明内容也透明: 2.rgba ...

  9. (贪心 线段不相交问题)codeVs 1214 线段覆盖

    题目描述 Description 给定x轴上的N(0<N<100)条线段,每个线段由它的二个端点a_I和b_I确定,I=1,2,……N.这些坐标都是区间(-999,999)的整数.有些线段 ...

  10. Microsoft Windows CVE-2017-8464 LNK 远程代码执行漏洞(复现)

    2017年6月13日,微软官方发布编号为CVE-2017-8464的漏洞公告,官方介绍Windows系统在解析快捷方式时存在远程执行任意代码的高危漏洞,黑客可以通过U盘.网络共享等途径触发漏洞,完全控 ...