TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
任何强大的单一服务器都满足不了大型网站持续增长的业务需求,网站发展到一定程序,应用服务器就要跟文件存储分离,创建文件服务器分摊应用服务器的压力。文件服务器是为网络上各工作站提供完整数据、文件、目录等信息共享,对网络文件实行统一管理的服务器。它能进行文件建立、删除、打开、关闭、读写等操作。当然文件服务器并不是单一存在的,如果存在单点故障,对项目的影响将是巨大的,所以前期分布式文件系统也是项目上线初期必须的,做好容灾备份。对分布式文件系统感兴趣的同学可以看下FastDFS:http://www.52itstyle.top/thread-22615-1-1.html. r% t8 N% ~1 u0 \( t! J
4 S, S0 N8 e3 w: T
一、项目需求
, s. v6 `% X9 V: Y, ^ 在B项目中前台上传一个文件,后台只是负责获取文件,然后需要调用rest接口把文件传给另一个系统A(文件服务系统),文件服务器系统会返回给我需要的状态,然后根据状态判断是否上传成功。. Z7 u: {" l5 d Q8 z
9 u. y4 N: R% }( B% C( K; Y: |
1 \/ M3 P: r) J- D二、文件服务解决方案1 L7 u+ X* ^+ H" Z
1. 使用NSF 映射远程磁盘目录,将A的某个磁盘目录映射到B的某个文件夹,那么,在B上传文件时,只需要复制一份到这个映射目录就可以了,系统会直接传送的A服务器的目录里,如果实在局域网这个速度是可以忽略速度影响的,但是如果不是在局域网可能会有传输速度影响。
2 Z7 T, z2 ] h$ G& ?# U) r0 w& Z8 N1 B! q
1 y( V5 R, a0 p! ]
配置详见:http://www.52itstyle.top/thread-10764-1-1.html
5 N% Z/ A9 V. `% Q$ v, [* e9 o4 Z; X' u K9 G- r8 F' g4 y
$ O1 O M5 z$ y: m5 k; U
2.利用服务器rsync的同步工具。在B架设rsync的服务端,设定需要同步的文件夹,在A设定rsync的客户端,设定同步的来源服务器和对应的文件夹。当B的上传文件夹变动时,rsync会自动同步一份到A的客户目录。: e6 y* W/ L# x+ D+ y- {$ M
. L- |! S% |. Z# ?/ n
1 P* N# x1 K" s配置详见:http://www.52itstyle.top/thread-17263-1-1.html- }* L/ `' p. M1 a
9 E: p4 Z% Y+ K j. {' [( m0 E8 p, [; I0 d3 W" x6 Q4 |. I" z
3.如果以上两种方案你都不想使用,可以在A部署一个底层脚本,用来接收post文件,可以自己设定一个密钥。当B有文件上传时,B服务器用java的httpClient直接重新post一份到A的接口,然后在A的接口设定逻辑存放到相应的目录。
2 q9 x3 m8 b" m! Q+ S8 T
+ d8 ^5 s7 N5 K3 K7 x _: E3 r3 z
2 [7 N- {/ P3 m" ]( w( V+ A4 S4.如果文件大小不是太大,B服务器还可以利用各种中转程序,例如先存到mysql,或者nosql的存储里,然后在A服务器上自动去抓取下来。) l. Y6 Q6 ]" m9 k! |
* t$ P: m% f! V, {+ ?( T9 c
# n6 P' l6 U1 b9 o) J( e& T0 G5.当然你还可以使用静态资源云存储,比如七牛,阿里云,使用它们的接口就能把资源上传到它们的服务器,接口十分简单,费用非常便宜,比自建资源服务器便宜很多,但是毕竟不是自己的。+ Z3 o+ R( t3 D& K$ o/ \2 p( j
/ z }4 z8 A$ o
' f% ~ ~# c$ [1 k9 B9 }
这里主要简单实现第三种方案(使用语言JAVA):
1 V; _3 t* U; O9 s% s7 |; u2 I- J: J$ [6 q$ O0 w: y8 e4 d( Q& k
& [/ H% {8 }5 v$ k新建客户端 用于上传. j e Y$ w# z7 J; e
HttpPostClient:
6 U" b- z! C1 R- package com.itstyle.web;& Y1 k& c2 o, P, Z- ?; @+ l5 ^7 J3 h8 J
- 8 p# B' m) u5 N9 R1 ~$ H
- import java.io.File;
; L9 V2 [9 \; h7 |! } - import java.io.IOException;
+ O. U5 q6 y* W2 a
" i9 N0 T! g; k0 q9 W6 \! t- import org.apache.http.HttpEntity;
) @' b( i) ?+ A. w* T - import org.apache.http.HttpResponse;5 {+ {$ x! f+ C8 } q
- import org.apache.http.HttpStatus;
4 o4 P" M# x9 R* j - import org.apache.http.ParseException;/ g7 E3 j3 K& M: _) d
- import org.apache.http.client.HttpClient;
; s; c2 h7 J5 E+ H6 } - import org.apache.http.client.methods.HttpPost;
2 w+ z8 ]8 p5 @9 i3 } - import org.apache.http.entity.mime.MultipartEntity;
c* }! l& G1 O9 @7 l; h - import org.apache.http.entity.mime.content.FileBody;1 g$ w' I7 y' F" H1 R8 Y0 Q r
- import org.apache.http.entity.mime.content.StringBody;( r" S3 `- O/ {0 _( b5 }
- import org.apache.http.impl.client.DefaultHttpClient;
9 l/ b* q5 a% C P - import org.apache.http.util.EntityUtils;8 r' S+ n" \: Y
- /**, ^7 W5 W' @9 z
- * 客服端
8 f# e& M P' I( ^) j - * 创建者 张志朋
* L* z$ N4 Z+ L - * 创建时间 2016年4月14日
' G- k, V2 ~/ X/ ?$ B" Z" l - * 科帮网 http://www.52itstyle.top) E+ I( y7 I5 }7 Y" H& x
- *
0 t2 D( k* C& a( c - */
) \; A2 @# D s; z - public class HttpPostClient {' \5 q! i; x: R' ~' b
- public void SubmitPost(String url, String filename, String filepath) {
3 `' |% ]2 q. q5 d - , Q, h$ H9 L: J/ {6 x6 }9 A9 E
- HttpClient httpclient = new DefaultHttpClient();
/ M2 c: S- z6 u& a* ^ - ) {. {8 h& g0 `+ s
- try {
/ V) u& b7 D2 I& p$ R
" N' _$ r( J! ], g- HttpPost httppost = new HttpPost(url);7 Y. v! i8 M, e7 u1 i" z0 o
- * R- `) C" e. U' a6 S
- FileBody bin = new FileBody(new File(filepath + File.separator + filename));
* \6 O6 j: x. [; P4 y8 [ - * y0 N8 [* z$ P4 e( w8 R" s
- StringBody comment = new StringBody(filename);( J U* ]. I# ?. j" }' V
( S' A0 |$ W- I/ s% M' P3 Y1 T- MultipartEntity reqEntity = new MultipartEntity();* g* g/ ?; D+ _. K
- reqEntity.addPart("file", bin);// file为请求后台的File upload;属性# G2 A5 J' O6 j: s/ s0 S1 x
- reqEntity.addPart("filename", comment);// filename为请求后台的普通参数;属性
, }( v, G# G" [& V* Q: y4 Q+ y - httppost.setEntity(reqEntity);
& i, ?% `. A- |8 B, U
2 k1 H0 u s$ `! ?# O- HttpResponse response = httpclient.execute(httppost);( T+ U8 k4 z5 A; X9 q
9 k. n; B: f& u8 s Z: ?. T- int statusCode = response.getStatusLine().getStatusCode();. [3 z+ M: z( u- s0 S$ A
- 9 m* X% X1 U" `1 ~" a- e! _" ]& E5 ~
- if (statusCode == HttpStatus.SC_OK) {
2 q) G) J; Q5 q- f
Y F8 J3 k2 p) t0 @6 {% g- System.out.println("服务器正常响应.....");
2 Q' O; X) u; M! G
' S/ L. i/ {" x2 W8 j0 X& F- HttpEntity resEntity = response.getEntity();
7 B/ P5 X9 x' `3 t. T; ^$ d7 _) O2 ` - : g A0 V8 I- j k/ {2 r
- System.out.println(EntityUtils.toString(resEntity));// httpclient自带的工具类读取返回数据
: o1 O8 B* j& ^, w, D# m
' h( p5 V# X1 r$ ]- _- System.out.println(resEntity.getContent());0 L1 V: s2 W; C5 `
- ' c) G: @& d! ], z5 p
- EntityUtils.consume(resEntity);& x1 i; M' A. ^) P8 @" @% u
- }$ c% g- l+ O1 L! K
: b/ S+ w) _. ^/ @& ?- } catch (ParseException e) {7 ^1 E$ F E2 `
- e.printStackTrace();# T9 |0 e" l5 S1 \
- } catch (IOException e) {
: ~9 b9 j" T' [9 q - e.printStackTrace();
3 P) E9 i) {) Y0 X! X2 M$ _- n - } finally {/ S1 L& x, G' J% u/ ^
- try {
6 i3 y p1 q* @6 e0 z1 o. Z* v8 U - httpclient.getConnectionManager().shutdown();& M0 i! K/ ]9 G8 O% z2 z9 U
- } catch (Exception ignore) {" d' u+ O. K1 ?
- & [9 X. I7 b" v/ M; Z) x- }
- }
+ C. G# C l2 Y! b- a - }1 X/ O3 v+ f4 h' X. L
- }: b+ I7 i8 X( u
- /**+ F) ?7 G; r) ?; F$ \5 @8 |0 u' }
- * 自定义文件名称 和路径 win环境下测试
4 b+ R3 @, ~$ ^5 i - * @param args4 r) V: Z' t% S
- */, e; F$ d" P" ]
- public static void main(String[] args) {
! i6 _' \) a2 O/ B4 M9 d - HttpPostClient httpPostClient = new HttpPostClient();5 A! p4 I$ u( R" D; N: ]! q0 c* @
- httpPostClient.SubmitPost("http://127.0.0.1:8080/acts_upload/receiveData","test.zip", "D://test");7 w- b: v9 o# a: K% a% }+ X% ]+ t
- }- {0 S0 l' ^* m9 X# [+ j
- }: w8 T" y0 V0 w0 e6 F4 |
- " ]. N2 d, q- c- G
复制代码 / }. d0 k, Z! ]+ D
0 L% ?) F" K4 O3 O& l0 q8 O5 l
0 ^# F. Q. r' h8 J Y! X新建服务端 用于接收- e1 R- v" J3 \. r& U
HttpPostServer:: @0 k8 b* l% E+ m* A
- package com.itstyle.web;: B. ?6 I9 X1 k% J: G8 c
' X9 {. k4 N: n) |3 _+ e- L- import java.io.File;4 a6 x0 s& T% H+ P: _! t
- import java.io.FileOutputStream;
i+ n; w$ \ W# ^2 h# ` - import java.io.IOException;
3 L3 R% O' {8 ~. c* q - import java.io.InputStream;+ Z9 s5 d+ w! j! Z8 [9 M/ r
- import java.io.PrintWriter;: y. y' [% Q4 ` O( w. Y2 O
- import java.util.ArrayList;
7 e. I2 N+ R' P6 @" v - import java.util.Iterator;/ P6 k( t8 i+ O& `( G: z
- import java.util.List;5 s) _3 s) Y! ^8 R, M
" @* D/ A& F" E0 s- import javax.servlet.ServletException;. f! @. j' ?. b
- import javax.servlet.http.HttpServlet;9 i9 S" e! ^1 r5 {. J
- import javax.servlet.http.HttpServletRequest;1 [% F; o5 {: H, ~) `
- import javax.servlet.http.HttpServletResponse;
* }0 d" O8 f p/ s O# H' o; J6 R, b - 9 n5 r2 L4 f1 h9 ^0 x, Y8 F
- import org.apache.commons.fileupload.FileItem;
, X3 j$ p7 z' j# S% A - import org.apache.commons.fileupload.FileItemFactory;
/ [5 f* P5 d- X$ n/ e - import org.apache.commons.fileupload.disk.DiskFileItemFactory;
: B, k; N' j# D! O5 H - import org.apache.commons.fileupload.servlet.ServletFileUpload;1 y) Q0 A( t0 R( {
- /**: Y/ l5 ]6 p" t* O7 v/ B) p9 W
- * 服务端 接收文件
+ X2 z% ^& F5 P# i - * 创建者 张志朋4 T# B; H5 P; k1 Q6 d, U; E
- * 创建时间 2016年4月14日
: l# R) d) w1 g; ?- Z# w0 @: ?& p - * 科帮网 http://www.52itstyle.top
- H0 W; w8 M/ Y5 `8 j - */
2 Y6 L5 n X( z) \& K$ d - public class HttpPostServer extends HttpServlet {, }7 `& b+ j" m+ v% t8 k
- private static final long serialVersionUID = -1002826847460469784L;! y6 H7 E* p+ D l
- 0 W8 a' N$ r3 M$ U5 ~
- @Override
$ j' \+ D4 k8 ^( Y - public void init() throws ServletException {+ _2 @9 g& E3 J) o+ l o0 o5 O/ X" U
2 F7 a4 E. q& D4 m% c' t5 X. N+ v0 w- }
# r+ D" y% C* P# J - 1 W- B- Y z {( P; J1 g
- @SuppressWarnings("unchecked")! R+ V9 _+ L# f1 h/ ^% W
- public void doGet(HttpServletRequest request, HttpServletResponse response)5 |& y* n% c8 B' e l! b
- throws ServletException, IOException {# z& x f) Q7 c0 m/ M5 O* X9 S
- PrintWriter out = null;0 n* l; m6 L( x' w6 e
-
4 {& c) K. u4 d4 ^2 P; e! ] q, F - response.setContentType("text/html;charset=UTF-8");
# p0 R3 b p0 p$ a' C' \- ~2 A+ V - String basePath = "d://test1";
& @! ?8 h t5 A& g6 h% } - FileItemFactory factory = new DiskFileItemFactory();- a4 b1 x1 T& A' O
- ServletFileUpload upload = new ServletFileUpload(factory);) z( X. D) D: b4 Y7 I6 m) r3 O6 Y- C) q
- File directory = null;
, E `+ m2 W( Z- b: E) u+ e - List<FileItem> items = new ArrayList<FileItem>();
6 l j$ x7 a5 V, |1 a: g% Z; ~ - String message = "";
. l1 }! a6 g, `2 v: v4 V - try {
& X+ U. Z7 W% \ - items = upload.parseRequest(request);5 P2 M' a% P6 h0 u( w9 x6 T
- // 得到所有的文件6 f$ F3 u3 B8 n. _( |
- Iterator<FileItem> it = items.iterator();
' F7 E1 }& q( W( E - while (it.hasNext()) {+ M; M( f5 q! T2 h+ W; ]
- FileItem fItem = (FileItem) it.next();
0 ?# D+ y; f9 x& t8 }3 P - if(!fItem.isFormField()){
' u- `1 z& `2 R K; H$ [ - String name = fItem.getName();
: O% x- f. O4 _+ s - if (name != null && !("".equals(name))) {& ?0 H; Y. X0 |3 o; q/ w9 n
- name = name.substring(name.lastIndexOf(File.separator) + 1);
- a! z# C& w4 m6 |. ]' D - directory = new File(basePath);
+ f$ m' @3 }: E - directory.mkdirs();- t. S+ W! n7 p
- String filePath = (basePath) + File.separator + name;3 l% i* U7 J5 p. B7 _( r7 d# j+ @
- InputStream is = fItem.getInputStream();
6 G" f# `8 l: E! z* `: l - FileOutputStream fos = new FileOutputStream(filePath);
6 C3 e6 }/ ?# q* m - byte[] buffer = new byte[1024];/ f# p4 m$ x$ q) g
- while (is.read(buffer) > 0) {- _1 b- {5 V7 W/ b
- fos.write(buffer, 0, buffer.length);
% z/ P/ g$ [, O6 z; K7 c+ W - }
; C a; k' Q& |" F/ m - fos.flush();1 f0 \3 E4 p T4 ?
- fos.close();: T% E* H5 c0 E _4 [. m5 A1 z
- }) K5 e" P) T0 {' N
- }
0 k- K+ f6 @9 V( z% ?3 n - }
* D! b9 W3 \* j. E' o - message = "{success:true, msg:'接收成功'}";
4 m6 K4 a1 ]! @; `2 C9 H. p - } catch (Exception e) {& d: `- C" j7 T$ H) Q
- message = "{success:false, msg:'读取http请求属性值出错!'}";, P$ P; u$ U# T4 L! Y- N
- e.printStackTrace();
6 N, J U0 B* Z' C' r - }finally{
7 S; r Q) w) r7 t" X5 B) h$ B) | - out = response.getWriter();0 N- v, i6 y K$ Y
- out.print(message);/ V2 n3 A1 T3 g8 ]
- out.close();4 L5 U7 Z0 n4 [' k- r
- }- q5 W1 M* ~, W4 [
- } |% h" Y9 p! p1 D5 N3 g
- public void doPost(HttpServletRequest request, HttpServletResponse response)! m8 U- y7 `/ q S$ l' F, u
- throws ServletException, IOException {
* I% A6 B- q7 Q' d1 C - doGet(request, response);
0 _* v% W* a8 l6 d! O9 C ~9 e; @ - }& n' f% q# b/ G3 p4 x0 }" e$ Q4 ]
- }
: h$ m( ]) e2 v0 ]* Y - ! ~! i- f1 d& j, l: }0 y2 x
复制代码
% c/ A. p7 J! Q* J" t6 O6 j所需要JAR包
6 [7 M2 M/ f3 Zcommons-codec-1.6.jar- [" _1 g8 `: I2 Q& r2 F8 N
commons-fileupload-1.2.1.jar1 D5 B$ Z' A, b% B
commons-io-1.3.2.jar+ \. |: y2 ~9 s3 u
commons-logging-1.1.1.jar
7 N1 C: q1 q) d4 vfluent-hc-4.2.jar) P) R( E: r7 l3 j3 I7 V
httpclient-4.2.jar( m C: C1 }5 k9 o* {5 ^3 A0 V' K
httpclient-cache-4.2.jar! C3 n* T: ^2 v0 V+ K2 V( l! Y
httpcore-4.2.jar* Z& ^" n5 [; y" E
httpmime-4.2.jar, `( z5 z* ~% c: C
6 v- R2 _; G! h% D项目下载地址:点击下载7 X" s; ?7 {- C. K W5 K3 k7 E
9 p3 h2 D+ W' _. D$ G! `0 }* l5 P: G% H- |0 O8 m
密码:: ?2 H/ B2 x: B9 I) j, G
3 {1 d6 C' O! v8 {) O1 r8 [, t( ^5 _" e
( S2 p- B8 s; W; H2 J4 A5 \1 _0 d" V/ N
|
|