TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
任何强大的单一服务器都满足不了大型网站持续增长的业务需求,网站发展到一定程序,应用服务器就要跟文件存储分离,创建文件服务器分摊应用服务器的压力。文件服务器是为网络上各工作站提供完整数据、文件、目录等信息共享,对网络文件实行统一管理的服务器。它能进行文件建立、删除、打开、关闭、读写等操作。当然文件服务器并不是单一存在的,如果存在单点故障,对项目的影响将是巨大的,所以前期分布式文件系统也是项目上线初期必须的,做好容灾备份。对分布式文件系统感兴趣的同学可以看下FastDFS:http://www.52itstyle.top/thread-22615-1-1.html# S# P: }7 }. _# u
! s: z1 ~1 X& M一、项目需求7 O- x/ a( g# X( A
在B项目中前台上传一个文件,后台只是负责获取文件,然后需要调用rest接口把文件传给另一个系统A(文件服务系统),文件服务器系统会返回给我需要的状态,然后根据状态判断是否上传成功。. g+ v8 X: {8 d: H) e* @
( V; e5 d+ c' o; a2 v
6 j1 L' ?" e( y0 w二、文件服务解决方案 f% h8 x$ O; t) Y8 o
1. 使用NSF 映射远程磁盘目录,将A的某个磁盘目录映射到B的某个文件夹,那么,在B上传文件时,只需要复制一份到这个映射目录就可以了,系统会直接传送的A服务器的目录里,如果实在局域网这个速度是可以忽略速度影响的,但是如果不是在局域网可能会有传输速度影响。& L2 C0 q2 e1 C7 d+ T7 J: x- o% C
7 O) }9 k) |; g1 R2 {4 J; a: n3 h, ?6 t8 K* R W
配置详见:http://www.52itstyle.top/thread-10764-1-1.html
! I3 [# o/ Y7 p. r; ]3 ?5 U" m8 z2 l* F% g4 D+ s+ c+ l! P* @
* |0 _4 B% s. r4 H2.利用服务器rsync的同步工具。在B架设rsync的服务端,设定需要同步的文件夹,在A设定rsync的客户端,设定同步的来源服务器和对应的文件夹。当B的上传文件夹变动时,rsync会自动同步一份到A的客户目录。
7 O. f, @: |1 p0 s& _5 z1 `
- x4 D+ |7 k# ^. W) y! o% ]! M2 q+ C3 g3 p- ~6 h9 X) n6 q
配置详见:http://www.52itstyle.top/thread-17263-1-1.html3 `7 d2 g8 R P* H1 P$ u2 g
8 h9 s5 O& ~3 y3 a6 M6 @- j/ z, I* s; N9 r8 } [0 S& O
3.如果以上两种方案你都不想使用,可以在A部署一个底层脚本,用来接收post文件,可以自己设定一个密钥。当B有文件上传时,B服务器用java的httpClient直接重新post一份到A的接口,然后在A的接口设定逻辑存放到相应的目录。- ?/ e% j5 u, }
: Z# @+ h5 D2 L7 b% | @4 l8 {+ y- P& R$ [; `, Y
4.如果文件大小不是太大,B服务器还可以利用各种中转程序,例如先存到mysql,或者nosql的存储里,然后在A服务器上自动去抓取下来。/ x+ T* n5 G; O* p+ P8 w: z
4 X4 o, o N3 g3 E9 d; c4 M, O# f- ] v
5.当然你还可以使用静态资源云存储,比如七牛,阿里云,使用它们的接口就能把资源上传到它们的服务器,接口十分简单,费用非常便宜,比自建资源服务器便宜很多,但是毕竟不是自己的。. y* M7 l# W! V5 ~, `& `& b: X
# @( P0 [' N9 I% |. {
5 N, v' q6 \0 A8 m- U这里主要简单实现第三种方案(使用语言JAVA):) R* E; \+ t$ Y, A2 ]/ `
F3 d+ x# S$ j7 N* u) M
5 P! J: U# k' D; B% @新建客户端 用于上传* u& L$ m, T7 p3 [: U* S
HttpPostClient:& I1 L( l3 _) m' n8 U; O7 R% S
- package com.itstyle.web;
' I+ B- _- p, b& |
; m2 ]0 y% [( j! a- [- import java.io.File;
0 y0 d7 w" h& i6 q - import java.io.IOException;6 E3 X4 m1 F/ f' ]% B; S" r
- * U/ Y: V) E+ j9 v8 K* D H
- import org.apache.http.HttpEntity;
' c: l* r( K5 Z& ?; e3 r) k - import org.apache.http.HttpResponse;
m# [2 F% F& D" t& T3 b - import org.apache.http.HttpStatus;- [* n7 `8 N: W# J; G7 D7 a
- import org.apache.http.ParseException;3 w3 H" Y* V, C0 W F2 z2 i
- import org.apache.http.client.HttpClient;
, O0 U. \$ A/ X - import org.apache.http.client.methods.HttpPost;
& v# e0 r5 O$ P) G' o - import org.apache.http.entity.mime.MultipartEntity;; M& z/ c8 ?6 Y d& b
- import org.apache.http.entity.mime.content.FileBody;
, L( s W# F; | - import org.apache.http.entity.mime.content.StringBody;: g# T* I# o: M X+ D$ R: t
- import org.apache.http.impl.client.DefaultHttpClient;
/ [+ `% b% ]" d5 {3 ? - import org.apache.http.util.EntityUtils;
0 n& q7 `! N! a$ r$ O - /**' Z1 e2 J, j4 A$ O. o: J4 P
- * 客服端
) k9 }6 N# K6 v2 _2 | - * 创建者 张志朋& E( `0 p+ @, z' c/ t& m0 X6 r
- * 创建时间 2016年4月14日$ q9 q6 a7 |4 \0 j% B
- * 科帮网 http://www.52itstyle.top
. a: B" z1 W' u4 c1 A1 W! ?' ] - * e5 T. w" s( d8 X$ F
- */
3 K0 C7 @8 |, C" X - public class HttpPostClient {
1 j) a5 E) |$ `! a( y5 K" D( Z - public void SubmitPost(String url, String filename, String filepath) {
! ]* [. S% y3 E; ~% ]
( e7 p/ P/ ^. a- HttpClient httpclient = new DefaultHttpClient();7 Y+ Q/ p! a; [7 {
$ A5 v% u$ n8 [; e- try {
- ]9 m0 M6 n# I% e; ^9 Z- I
0 s; T/ n3 U G' X+ z- HttpPost httppost = new HttpPost(url);
5 L$ @5 ]- N3 a7 ^ - P5 m# ], f" y7 P4 d# }! A: Z, t' W
- FileBody bin = new FileBody(new File(filepath + File.separator + filename));
+ M) h) l, I X$ r9 y3 s: L
( d2 ^" p1 o. ? ]- StringBody comment = new StringBody(filename);
5 t8 d2 u: T# N* v$ j: v0 R
. g4 L- e" U+ C4 ^/ ?- MultipartEntity reqEntity = new MultipartEntity();
+ `8 g7 u- F5 P' s3 _$ s4 p - reqEntity.addPart("file", bin);// file为请求后台的File upload;属性
0 W/ ~! N% }4 f - reqEntity.addPart("filename", comment);// filename为请求后台的普通参数;属性
0 j% a1 I) `6 A - httppost.setEntity(reqEntity);
; K1 I) I) u, G
$ G$ N( B2 T4 m7 \- HttpResponse response = httpclient.execute(httppost);. A( b' Y% b3 c1 p) Q) Z2 G
$ [# j- ^6 }& D- int statusCode = response.getStatusLine().getStatusCode();8 q4 p9 H8 R2 L6 e/ } S. o& U% {
- 5 U5 j. h. f! C' B0 w' y* L4 d/ t
- if (statusCode == HttpStatus.SC_OK) {& f7 Y) [3 I- M; d
8 v$ z" I% a* d5 g' c) ]- System.out.println("服务器正常响应.....");
2 y" q! \& M5 X$ G" ?1 b# h - 5 ~. S5 f0 h/ L! Z; _& h6 M6 v
- HttpEntity resEntity = response.getEntity();$ z; ?$ n, [; B$ W2 V+ x
3 q& A6 x) H& C2 S* C8 s- System.out.println(EntityUtils.toString(resEntity));// httpclient自带的工具类读取返回数据
5 b$ f( b* l$ u5 {5 M. ]1 o0 M - 9 j. G% V; M2 a/ |6 n- P& [
- System.out.println(resEntity.getContent());" I) _* o0 q: M* e, h
- ( B- G! ~" ]9 g# M/ T2 ^0 A
- EntityUtils.consume(resEntity);
+ y" s9 \3 i5 i - }" i& d) `3 L. ^+ @
_8 {4 \% ?0 C' T: }% C. B- } catch (ParseException e) {6 T- u% B7 G: L
- e.printStackTrace();
! f# O. Q+ S- ^5 T& X5 F - } catch (IOException e) {
# c0 O# v6 D, ?: V* ]$ k - e.printStackTrace();
" g6 u+ [5 S, x& D+ o - } finally {1 B! {# l5 h4 ?- G( L
- try {
# s1 g3 v7 G h5 y2 i0 ? - httpclient.getConnectionManager().shutdown();
* Y+ e3 N1 s! V' Q. J) | - } catch (Exception ignore) {
# W& M6 p0 M4 J) b0 n -
$ f3 l9 @# k2 | - }
, a% j8 O+ K; J* C5 S) ]# x' h4 e6 z - }
) r% l! O5 c9 B# W# m& P - }
! c. O' e3 Y& Q. p5 N - /**
9 _1 @" @ K, ^+ \ - * 自定义文件名称 和路径 win环境下测试
9 H6 k2 m: `& g8 F, _& N - * @param args6 t2 ~; P1 ]: a7 Z3 K5 M, d
- */2 F* M: w: u9 @* w
- public static void main(String[] args) {
. Z& w1 V" }4 E1 f - HttpPostClient httpPostClient = new HttpPostClient();/ j- C" ]# O" D |; U
- httpPostClient.SubmitPost("http://127.0.0.1:8080/acts_upload/receiveData","test.zip", "D://test");
* x6 k$ L# e% r: A5 V! } - }
2 O! c6 M7 ~* t - }/ W/ c* h0 ?0 n1 ?! s' c( H, Z
- + j* {# e$ l$ g6 t# X
复制代码
( v) g, @- Z! y( V; Q, x2 Y3 u8 L' ~4 v4 y. h; b* A2 t3 D
; f- P* c1 f8 u. K* E n7 g
新建服务端 用于接收/ F% x4 q5 M# ^ F: ?- M
HttpPostServer:
: y9 R# f0 i: r, p3 K9 U9 ?- package com.itstyle.web;
8 }/ k0 K( K5 l7 x/ C/ e+ S* {1 l* l8 d
9 {8 R% [0 K) g: t- import java.io.File;
" O% e1 R7 |4 `. K# X. J3 \( \6 t - import java.io.FileOutputStream;* D$ @! X/ K# Q9 B8 L4 N6 I4 X
- import java.io.IOException;5 A" `# b& h/ G3 O% T
- import java.io.InputStream; q( G% M2 E0 h+ j3 ^
- import java.io.PrintWriter;
0 M+ P Q E+ b1 Q; D - import java.util.ArrayList;
; N/ y2 y* E( y* J6 x/ C - import java.util.Iterator;
0 M& l+ T# N \* A3 p5 { - import java.util.List;5 Y B7 E+ U8 }& t) J
4 u6 ?$ }8 [6 B/ z- import javax.servlet.ServletException;
& q. _2 G& m3 ?! ^7 _6 d& S3 w1 F6 L - import javax.servlet.http.HttpServlet;
4 V' A+ w9 w! {* T/ {! @4 w$ l - import javax.servlet.http.HttpServletRequest;
: B: Q" D3 t* M# ^ - import javax.servlet.http.HttpServletResponse;
) U7 K; F+ O5 Y+ k/ k
7 F1 f% `8 T$ J" o" r- import org.apache.commons.fileupload.FileItem;
7 H$ }- H1 S n$ y - import org.apache.commons.fileupload.FileItemFactory;
, `6 }. V& M3 S! N! \( i! a/ f - import org.apache.commons.fileupload.disk.DiskFileItemFactory;5 O$ u, m3 o! d1 d. g1 Y( F# m
- import org.apache.commons.fileupload.servlet.ServletFileUpload;
# v# ~# \7 A! ~- \6 D - /**, \$ x4 H) ]# Z, X% L6 S* @9 Y
- * 服务端 接收文件! F9 q1 P) w c+ \2 _+ [5 ~
- * 创建者 张志朋* m' l q; ]7 e0 o- h
- * 创建时间 2016年4月14日
3 Z# a+ x! `" T$ |; r: T - * 科帮网 http://www.52itstyle.top
( G* w6 J8 `- X& y1 ~ - */. Y3 @) E" b0 X/ D! R) X& d
- public class HttpPostServer extends HttpServlet {5 Q/ E7 L j$ _5 B" E
- private static final long serialVersionUID = -1002826847460469784L;
, ^3 [. E- A' [& Y
9 y; v( b" k$ q0 r# s. o0 w. V- @Override) v6 K; b$ L* d6 r7 o
- public void init() throws ServletException { o, K8 v. z1 d& G# T6 |
+ K& f R) p; i! x; P- }% r4 j0 ^; T% T; f
# x( _. b8 }2 j% o9 q6 g0 D# H3 c- @SuppressWarnings("unchecked")! i* ?) W2 B/ t8 c: k; H+ C
- public void doGet(HttpServletRequest request, HttpServletResponse response)
+ H b) F+ p$ s! A - throws ServletException, IOException {2 L& d* G7 B1 q2 F. }! m
- PrintWriter out = null;
+ {' D( o1 j& b9 i& a -
% o/ g3 v3 j7 k3 f r2 w7 a - response.setContentType("text/html;charset=UTF-8");
6 W* z' U8 s" F' d' x; C5 Z - String basePath = "d://test1"; |, Z" \. d+ F% b! y J7 P
- FileItemFactory factory = new DiskFileItemFactory();
7 G p" \; F% O$ M - ServletFileUpload upload = new ServletFileUpload(factory);
# n( J. ]4 e4 w7 ]; E. A! \ - File directory = null;+ o1 q4 }% s7 W2 H7 M
- List<FileItem> items = new ArrayList<FileItem>();3 f" Z! d5 n! u4 |
- String message = "";6 d" L% t4 D: I Y5 e
- try {
' Q$ I- k' U3 f - items = upload.parseRequest(request);8 m2 O2 \/ V6 n
- // 得到所有的文件
/ R+ ?4 \- q8 U" i. u% n - Iterator<FileItem> it = items.iterator();; g1 x' _3 b, {% R( T- q# e
- while (it.hasNext()) {& S1 x+ D( v, M N4 I+ x
- FileItem fItem = (FileItem) it.next();
- z9 u: [% r8 H! F8 P/ F; e - if(!fItem.isFormField()){/ u, {1 v3 A/ F- I$ m
- String name = fItem.getName();
* `/ M9 V# O% \1 w. l* [4 J& R - if (name != null && !("".equals(name))) {
% g' d. ^6 w( \ ~, V - name = name.substring(name.lastIndexOf(File.separator) + 1);
) V- o+ Z' ?7 O1 B - directory = new File(basePath);! K% n1 U/ [" s7 W
- directory.mkdirs();
B7 ~ R3 o1 L2 t8 v) i - String filePath = (basePath) + File.separator + name;! X6 q% ], x. V( \' k S3 P/ K8 [
- InputStream is = fItem.getInputStream();" K2 ]# D& Q0 v" i+ q: N4 y
- FileOutputStream fos = new FileOutputStream(filePath);, ?/ n+ p' F: T+ ?5 P0 z
- byte[] buffer = new byte[1024];
$ A# g. {( \+ y, {1 r* U - while (is.read(buffer) > 0) {4 H5 q& r5 y$ a5 m% k4 K1 f
- fos.write(buffer, 0, buffer.length);0 V' C' f& ~0 {! O
- }8 Y1 @" p A3 u, r( ?
- fos.flush();
' m" V8 v9 i+ {1 E5 ~% ` - fos.close();; J2 B+ b; A( Q
- }
' k# q, K" o$ i, c, D# x8 A - }
! t1 |% j+ q+ h; u - }
! l0 K# N I: Z/ ~- m0 i; ? - message = "{success:true, msg:'接收成功'}";9 K8 m6 ] L* M+ r6 F' {
- } catch (Exception e) {7 W+ e1 d; W; i( f. n. z! y- X
- message = "{success:false, msg:'读取http请求属性值出错!'}";& I; W8 K% v2 {* t
- e.printStackTrace();3 j- A6 _+ O# B; y3 N
- }finally{
) P1 `3 T9 ^) h: K! r1 K8 W - out = response.getWriter();
6 i3 x7 x; L. X) A8 S - out.print(message);
/ Q8 _7 p5 h$ S. @% R - out.close();) p: g* [8 u* o( E
- }
1 X: X, L$ w, n7 r# A$ S - }
% x, {5 [) L4 Y9 Z& `" ` - public void doPost(HttpServletRequest request, HttpServletResponse response)6 m( k5 Q" b& j! K9 y
- throws ServletException, IOException {
/ Q' s, E: F+ q" C: X$ S$ } - doGet(request, response);
1 b! E( K+ t3 A) V) z - }5 C* n1 z% M# L/ w0 u
- }
4 p+ g8 ]' u* s" e7 R% H9 l2 _; D2 N
7 Q/ w! U: u5 o$ N$ A* o9 b
复制代码 , j' t. N4 Q$ ]! A9 G% o
所需要JAR包
* w0 `2 d" G/ \commons-codec-1.6.jar
9 v/ z+ @) O! pcommons-fileupload-1.2.1.jar& c& E2 j" n8 n6 @' O
commons-io-1.3.2.jar
3 @/ Z0 }+ b. O% }commons-logging-1.1.1.jar
7 F9 I5 j2 ?+ a; Yfluent-hc-4.2.jar
8 Z0 k$ X+ Q, A- _( Dhttpclient-4.2.jar
$ E) R* ^# g( k: d" \9 N4 V& Bhttpclient-cache-4.2.jar7 E6 O3 a0 s5 T( K+ c2 N- w
httpcore-4.2.jar
* i+ |9 F1 W- @5 Q) Y7 N% T+ Hhttpmime-4.2.jar
: f/ r. u! k0 }5 l& Z) G8 w+ ]' Y5 E9 m. \% V: q! c
项目下载地址:点击下载
$ j$ \, m4 z. d% s8 D, R9 }, z. _+ k, R R+ T) |' L) p0 I
& B: s6 y* m2 i& w+ @7 e
密码:
- K O% i' C/ i% T
' h$ K0 ~; t& S" A& g
) @4 `! k8 j. u2 v! H
9 K: H2 ^' L+ B2 l8 l& `0 M" C* t+ G/ Y4 z, u
|
|