TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
任何强大的单一服务器都满足不了大型网站持续增长的业务需求,网站发展到一定程序,应用服务器就要跟文件存储分离,创建文件服务器分摊应用服务器的压力。文件服务器是为网络上各工作站提供完整数据、文件、目录等信息共享,对网络文件实行统一管理的服务器。它能进行文件建立、删除、打开、关闭、读写等操作。当然文件服务器并不是单一存在的,如果存在单点故障,对项目的影响将是巨大的,所以前期分布式文件系统也是项目上线初期必须的,做好容灾备份。对分布式文件系统感兴趣的同学可以看下FastDFS:http://www.52itstyle.top/thread-22615-1-1.html
8 j: s* C! Y k! t |
% j. j2 n+ K# S& w: R1 ]/ I一、项目需求
8 Q2 j0 K6 L( V! O& v3 J) \ 在B项目中前台上传一个文件,后台只是负责获取文件,然后需要调用rest接口把文件传给另一个系统A(文件服务系统),文件服务器系统会返回给我需要的状态,然后根据状态判断是否上传成功。9 O5 I, F; T& a: Q
* G- L2 V% r5 W
6 O+ }7 m5 ]- P& T) j二、文件服务解决方案
2 U: a U; S' U; q0 f x1. 使用NSF 映射远程磁盘目录,将A的某个磁盘目录映射到B的某个文件夹,那么,在B上传文件时,只需要复制一份到这个映射目录就可以了,系统会直接传送的A服务器的目录里,如果实在局域网这个速度是可以忽略速度影响的,但是如果不是在局域网可能会有传输速度影响。
% U( I5 [$ `5 Q4 }# T: ^! K
2 w7 O* D" v+ \6 m3 Q+ P: O4 A
! G" v' A4 Q& R7 y3 G, F. Y" S) O配置详见:http://www.52itstyle.top/thread-10764-1-1.html
7 O# |- u* V' J0 p% V. O
3 X# ~. P' U1 d6 U( H2 M# i0 ? H: Y0 x: [) F
2.利用服务器rsync的同步工具。在B架设rsync的服务端,设定需要同步的文件夹,在A设定rsync的客户端,设定同步的来源服务器和对应的文件夹。当B的上传文件夹变动时,rsync会自动同步一份到A的客户目录。
7 D* I: H4 }% J! ~$ ~
, p% J" I) X- o+ U. Z( E* {4 a/ P0 D/ ]2 R5 a# i6 |2 e, M
配置详见:http://www.52itstyle.top/thread-17263-1-1.html
, g0 s7 ]' g1 e7 }: f3 E) o6 c- M) N3 y9 C' K* J+ B. j; l: L ?
3 ?1 z6 d! _: X ?3.如果以上两种方案你都不想使用,可以在A部署一个底层脚本,用来接收post文件,可以自己设定一个密钥。当B有文件上传时,B服务器用java的httpClient直接重新post一份到A的接口,然后在A的接口设定逻辑存放到相应的目录。
( ~" _7 z4 K$ K7 G
% x7 m% u* I( K
/ t* {3 a, N+ c+ H$ _4.如果文件大小不是太大,B服务器还可以利用各种中转程序,例如先存到mysql,或者nosql的存储里,然后在A服务器上自动去抓取下来。
( V* @! z4 I1 l/ B+ o8 [' W9 F+ ?( Y- Z; @1 `! A; X% O
) V% U; {2 t% G% ~* O$ R [- j5.当然你还可以使用静态资源云存储,比如七牛,阿里云,使用它们的接口就能把资源上传到它们的服务器,接口十分简单,费用非常便宜,比自建资源服务器便宜很多,但是毕竟不是自己的。
: S) Z( ^: s0 z
$ T. @4 ?; I" t" g
6 a, S' d* M9 b9 R6 q这里主要简单实现第三种方案(使用语言JAVA):
+ o) P5 i9 O/ J- c; P: j) _5 c1 [
) b4 P) o- c+ q7 A! {8 N- m1 V$ v8 r7 i
新建客户端 用于上传. K- _0 E+ P1 { Q
HttpPostClient:
6 X& y* v3 ~+ |- package com.itstyle.web;+ E% a$ J+ w* A% c
- ; O# B: I% m& b6 d
- import java.io.File;/ l. ^. w" u' O' W
- import java.io.IOException;
4 a! Z( c+ Y6 Y: o - - H$ n% i9 [3 V, x/ x& J: l
- import org.apache.http.HttpEntity;9 l K, s# w3 _/ s* j5 ]
- import org.apache.http.HttpResponse;' f" G% \0 }9 t/ B _
- import org.apache.http.HttpStatus;$ m" M0 |' S8 s, O! O0 p
- import org.apache.http.ParseException;1 L/ a- N9 A! t; ~2 N/ \
- import org.apache.http.client.HttpClient;
- b8 l9 f" ^6 |/ x% J+ n( [$ h8 X - import org.apache.http.client.methods.HttpPost;
4 I w" M ? T1 W$ I - import org.apache.http.entity.mime.MultipartEntity;
; h% w+ |3 ~% D& T0 L3 i - import org.apache.http.entity.mime.content.FileBody;
* h: |) N2 @+ l r! @ - import org.apache.http.entity.mime.content.StringBody;
: f8 x. X; d0 w3 e- \- G+ B - import org.apache.http.impl.client.DefaultHttpClient;! a' x+ R" Z, v; D" _ S
- import org.apache.http.util.EntityUtils;9 B! y2 q$ S" h8 E i, @. j
- /**8 D' ~: M7 s% w/ A( m' A! Y6 t! t
- * 客服端
& k% ?& K0 U$ `1 A- T# {* o0 U - * 创建者 张志朋2 Y2 N" W, g+ n6 a9 t* @0 Y) B
- * 创建时间 2016年4月14日
4 B9 n! O# c$ J: Y7 Q/ K - * 科帮网 http://www.52itstyle.top
# W# E( y/ ~% g" f7 p1 R5 b - *
3 C* m6 V7 j# u$ V: s0 z+ H - */
5 Y3 H: \! a3 U; J4 Z - public class HttpPostClient {
' r& y" i1 [9 f. s, Q" T' l - public void SubmitPost(String url, String filename, String filepath) {1 u5 V3 C: G4 s- s9 p
- : k( U/ j9 w# ^+ O" J+ e
- HttpClient httpclient = new DefaultHttpClient();
$ Z! x4 I* s& E' b0 V4 h
8 A4 W7 {8 K- H3 e' o- try {5 p0 Z% x1 O% k1 h
! }( N' h( M7 e+ k8 g& F7 g7 X6 W7 E- HttpPost httppost = new HttpPost(url);. Y$ i9 R7 g# Y( J+ S7 `" W
; [4 v* f+ j. L0 J; b- FileBody bin = new FileBody(new File(filepath + File.separator + filename));
' t5 U1 T4 \/ ]# h4 Z+ `
3 A8 M8 d) ~* P- StringBody comment = new StringBody(filename);
" F+ J0 V, C! w5 i7 ? \ - ) r4 j. d8 [: c; L) X: E
- MultipartEntity reqEntity = new MultipartEntity();
3 J9 z3 q: q1 Z7 V% g0 C - reqEntity.addPart("file", bin);// file为请求后台的File upload;属性/ Q* f7 [. g, R8 v
- reqEntity.addPart("filename", comment);// filename为请求后台的普通参数;属性
F3 z! v t" m0 F - httppost.setEntity(reqEntity);; g! n5 @& E* f
+ P8 h7 m7 t' u* e- HttpResponse response = httpclient.execute(httppost);$ d2 f' R* p+ j% ~' y5 S& v
- " \$ w0 [, y; U1 C) c! q4 W6 S
- int statusCode = response.getStatusLine().getStatusCode();
" l; T5 w( z/ N; b' G - , K& \% M5 h% Q8 n* L
- if (statusCode == HttpStatus.SC_OK) {
, v/ d/ `5 a! F$ Z; ~6 C
0 x7 W1 j; p4 j4 }, O- System.out.println("服务器正常响应.....");( }8 K. r5 S! r+ ] |3 V3 d
9 ^' s5 Z% U' J1 K3 [5 n% S0 v- HttpEntity resEntity = response.getEntity();9 a3 l R' B9 j6 m; o) G9 I
8 D: p0 ]. _! r3 u( O' l* e- System.out.println(EntityUtils.toString(resEntity));// httpclient自带的工具类读取返回数据4 w- d+ _) t) ^; ?6 k1 X& U4 }
- 3 W: E2 \7 F" l9 w8 ~
- System.out.println(resEntity.getContent());- R0 n; N) V1 ?* W# |
7 C7 e) C4 Z* e9 L0 x! _- EntityUtils.consume(resEntity);
& K" I* F( Y! _0 T6 `1 n - }
) J& y M" A: R - - F% @3 J) v' @, P- D% r( X
- } catch (ParseException e) {/ ?" k9 M: D; P7 _9 `
- e.printStackTrace();
" n: x. S( G4 s0 G' l. @ - } catch (IOException e) {3 A; s1 j4 v* `. z/ o8 t% Y
- e.printStackTrace();/ O% T! h3 p* [. n3 P1 m2 \
- } finally {
% s; M/ p1 o" x! e5 O - try {3 F4 G0 U: u [8 k: _3 ^
- httpclient.getConnectionManager().shutdown();
1 F% ~8 n- T( C9 Z: W4 Y - } catch (Exception ignore) {
5 u% O4 q. |; [# X9 v: F - ! E; T8 t/ t! V8 X! x( M
- }2 w4 ?* w& Y0 ^1 e8 j, B
- }
, i$ ~6 \* {' W - }4 K8 D# V' y5 C* M6 c+ [( N+ q
- /**
5 @# D' X- Z; h0 a - * 自定义文件名称 和路径 win环境下测试
@+ b6 H, O8 p/ c }7 @$ }. Q - * @param args
- s! j) c R1 c9 V - */" T" a- t; s# F' h( w
- public static void main(String[] args) {, z) v7 h2 u1 o% \# a& F. P8 S
- HttpPostClient httpPostClient = new HttpPostClient();% M, d. V; N3 |9 j3 z% a6 n+ \
- httpPostClient.SubmitPost("http://127.0.0.1:8080/acts_upload/receiveData","test.zip", "D://test");+ T2 {7 H! C" s k; G
- }5 Z) [! x- {7 O/ q% C# x
- }
: ?/ E" w7 Z. b5 h( w
. C6 ^( ?5 j* W. c
复制代码 0 N8 U& f* q+ o5 H* K
6 \5 @4 X# h% w3 w$ A4 M
0 h4 g8 K3 O) X7 s; Y% M1 I新建服务端 用于接收( w7 q- Q! G( ~. \7 _# |) L- m
HttpPostServer:4 \+ ]" X `. U# j3 X
- package com.itstyle.web;
' X4 S% Y \6 ^- c& J - 7 G( w- h4 b% S0 ]
- import java.io.File;) h) \, t1 P' m% w2 q% u
- import java.io.FileOutputStream;! D+ [1 V7 J: k- o; G4 J
- import java.io.IOException;
2 b: _- Z/ l/ `7 V: |) F0 U - import java.io.InputStream;0 b$ x) m4 }' ^ D7 i; E
- import java.io.PrintWriter;5 s- K( [+ r( r: k% a
- import java.util.ArrayList;6 ?: L' m, i; ]$ u: |" t) N5 N
- import java.util.Iterator;
( R& R) e; z u2 D% n - import java.util.List;+ c6 y; m$ Q: ~- G+ H
2 B/ Y. @* ~& Q: U- import javax.servlet.ServletException;4 i. A1 ~) Y+ g" y \& E
- import javax.servlet.http.HttpServlet;
) E- ~9 P p5 a8 v - import javax.servlet.http.HttpServletRequest;
& D0 Z% u/ s% {& h6 ~) a8 o - import javax.servlet.http.HttpServletResponse;7 @, h" Y# _7 V( V0 `7 D) R8 X
- 1 Z. B# V0 B* v0 x9 h
- import org.apache.commons.fileupload.FileItem;
7 D" O! G. r3 m. Q, I" n1 v - import org.apache.commons.fileupload.FileItemFactory;
( r; Q! G- Q6 F+ \ z - import org.apache.commons.fileupload.disk.DiskFileItemFactory;, P! ]* }7 d8 U
- import org.apache.commons.fileupload.servlet.ServletFileUpload;6 J; [' U3 G4 _8 H# N0 l
- /**: d" P# G* @+ I) U, D+ @7 l
- * 服务端 接收文件
0 ~/ C2 Y8 Q1 v, s4 ?& |, w" q5 j - * 创建者 张志朋) R1 e) }! f+ V7 {
- * 创建时间 2016年4月14日+ b/ d0 `8 o) j5 ~
- * 科帮网 http://www.52itstyle.top" N# g+ ^$ Q: _/ `8 V# D8 ?8 j, F- U
- */
4 C, g. L# ?! i* W8 b - public class HttpPostServer extends HttpServlet {
! _7 g- t! o0 ]9 ~9 s" B+ `2 k X- Z' l - private static final long serialVersionUID = -1002826847460469784L;1 e c; z! @7 v7 y
# W- T3 q: M' P8 y- @Override$ H, T& h3 p U8 F! J
- public void init() throws ServletException {1 w0 a1 X5 ~) M u* {" P5 s+ N. `: q
- 3 f( X1 L8 j8 [) t+ B
- }7 S( [/ D) j" q7 g- [1 }' a9 R
: X3 j$ |' B+ `" q/ W" D- @SuppressWarnings("unchecked")
1 F3 ?4 l; p$ T& i - public void doGet(HttpServletRequest request, HttpServletResponse response) z# `9 N( C1 p$ q; {
- throws ServletException, IOException {
- q# @0 n/ g% I* ]9 W - PrintWriter out = null;3 j; A4 j# e, w
-
' G7 _' i; _8 |3 g q! E* o- i - response.setContentType("text/html;charset=UTF-8");
3 G5 s. d, z! }$ d8 z; K2 K - String basePath = "d://test1";+ d. W3 u: L( f2 e6 `
- FileItemFactory factory = new DiskFileItemFactory();
( z$ ]1 p V# D, P G3 j - ServletFileUpload upload = new ServletFileUpload(factory);: |$ \& W; s8 [( |+ ]) S
- File directory = null;* s; ~ e, t- ?/ x8 I0 c
- List<FileItem> items = new ArrayList<FileItem>();
! ^) |0 _' C# H$ z - String message = "";
9 Y/ Y6 w! ]1 i& p( t, S - try {# j1 m- u) p8 u) _2 `
- items = upload.parseRequest(request);
6 Z' \$ U3 x+ A5 x4 k. m0 Y - // 得到所有的文件7 i; L( b0 ]( \$ b6 d+ z4 x
- Iterator<FileItem> it = items.iterator();
7 @8 D8 o B3 q, N1 @ - while (it.hasNext()) { a4 l4 s1 g+ H. b. {4 z5 {9 o
- FileItem fItem = (FileItem) it.next();& R H$ g' Z3 Y' d) U8 c" t, `% w
- if(!fItem.isFormField()){
t" `' K9 g! E6 t - String name = fItem.getName();. B7 z8 M7 w7 V! C$ F5 Z
- if (name != null && !("".equals(name))) {# F' G/ {" j" L8 T' n& X: V
- name = name.substring(name.lastIndexOf(File.separator) + 1);
3 d1 a! {: D( _1 | - directory = new File(basePath);4 Q U; R% t- X. G2 Y
- directory.mkdirs();
2 Z: R8 K3 G" e( K6 h( a4 I1 d6 A - String filePath = (basePath) + File.separator + name;7 E" O1 Z9 ]/ r, I1 f2 Y
- InputStream is = fItem.getInputStream();. k e; u* ^' D1 f) q; S- b
- FileOutputStream fos = new FileOutputStream(filePath);
# N% _% J$ [6 z# m' V1 X5 n - byte[] buffer = new byte[1024];
. O+ i& n+ z& Z; q' @" p' e - while (is.read(buffer) > 0) {5 ]+ A- ^% @8 ^0 u- _' ?2 u. h
- fos.write(buffer, 0, buffer.length);) d* b8 d/ t* V! g! o- D$ m( ^. T1 I. R
- }
9 i! e* L/ E6 @; Q3 u/ ? - fos.flush();
9 a4 P) C, j3 J/ I3 `* X - fos.close();
: d5 g5 K( r) M0 ?# M+ K: L - }
- }4 Q7 J6 t% M# P/ C' B q6 ~ - }
& w# O( ^& Z( F* u; u- t& D' j - }, M# r) U. z2 t3 V6 M* W" ^
- message = "{success:true, msg:'接收成功'}";) A* G4 J2 g$ z5 C+ g8 v+ R. n
- } catch (Exception e) {1 c) O4 I% w( q/ \8 g
- message = "{success:false, msg:'读取http请求属性值出错!'}";& ~, x/ r7 P" M9 i: h: D; g u' h ]
- e.printStackTrace();8 k& O& `7 Y+ x4 I9 Y
- }finally{
9 x: x8 @4 B) z9 f% \ - out = response.getWriter();' |9 e- x4 D `
- out.print(message);
/ O5 h9 P6 O4 T! w; b* ` - out.close();0 s3 }' Y: x' \! A
- }3 ?# {2 `# l7 e9 {* G4 X- f! V
- }
' w- `) v7 |$ {; Z - public void doPost(HttpServletRequest request, HttpServletResponse response)/ U1 e# \+ q' t$ D
- throws ServletException, IOException {
# l$ u) Y: V) e E+ x% k6 S - doGet(request, response);$ u5 | ~* m# h4 |6 p3 }* d: C0 q
- }
8 J6 O7 c+ L6 J3 E, O' f - }2 W) b1 p$ F& y/ @2 H: P+ T
- ) `+ Y; g/ D; n( J. v/ P" p
复制代码
e4 l' X3 s" D所需要JAR包# {# x& j# s2 k0 e
commons-codec-1.6.jar- z! x/ U4 i3 y
commons-fileupload-1.2.1.jar6 Q) Y% `: R% J9 X: t$ p7 ^
commons-io-1.3.2.jar
2 r( Y7 W, ?. L! icommons-logging-1.1.1.jar$ _/ L3 G& S5 I% _& k
fluent-hc-4.2.jar
% |* o6 v9 e6 Fhttpclient-4.2.jar
1 f4 t. Z' l" Q# v3 S4 ~httpclient-cache-4.2.jar
+ A. B& W! R' E9 }httpcore-4.2.jar$ {* s- P: Q8 Y: ]5 ^" f
httpmime-4.2.jar# [# D* y' v& o& b
1 a% s$ v1 ~8 U" [7 X7 A" f8 ]项目下载地址:点击下载
: ]* Z1 U& W1 e( Y) V0 q, Z) o0 @0 [+ }& ^1 a# q
2 S0 u h2 u N
密码:
, E1 Y \0 I z! q) m& ?0 }2 Z6 n6 K1 }! x1 f/ v
6 K+ L9 S" ]/ C8 ^$ {
* k" `$ M7 w" Q9 v9 c, `" t% u
/ C' s: q5 G* K |
|