TA的每日心情 衰 2021-2-2 11:21
签到天数: 36 天
[LV.5]常住居民I
任何强大的单一服务器都满足不了大型网站持续增长的业务需求,网站发展到一定程序,应用服务器就要跟文件存储分离,创建文件服务器分摊应用服务器的压力。文件服务器是为网络 上各工作站提供完整数据、文件、目录等信息共享,对网络文件实行统一管理的服务器。它能进行文件建立、删除、打开、关闭、读写等操作。当然文件服务器并不是单一存在的,如果存在单点故障,对项目的影响将是巨大的,所以前期分布式文件系统也是项目上线初期必须的,做好容灾备份。对分布式文件系统感兴趣的同学可以看下 FastDFS :http://www.52itstyle.top/thread-22615-1-1.html 5 ]. I7 c1 {2 @
: u/ p& }" M4 Y. ]" ?
一、项目需求 ; s7 \* P2 N. a2 z. b
在B项目中前台上传一个文件,后台只是负责获取文件,然后需要调用rest接口把文件传给另一个系统A(文件服务系统),文件服务器系统会返回给我需要的状态,然后根据状态判断是否上传成功。
: x' X: S: q |7 Y' j* ^
$ E% e% J- H8 X0 [5 x
. g$ U5 H# |; s 二、文件服务解决方案 " z* O- E3 L1 w' c! Z# ?3 l2 d
1. 使用NSF 映射远程磁盘目录,将A的某个磁盘目录映射到B的某个文件夹,那么,在B上传文件时,只需要复制一份到这个映射目录就可以了,系统会直接传送的A服务器的目录里,如果实在局域网这个速度是可以忽略速度影响的,但是如果不是在局域网可能会有传输速度影响。
/ [7 _6 \7 m, f6 o) `
3 u% b) O6 j3 A/ O8 B' v 3 H" U) O+ n" u6 ~5 U# x6 x
配置详见:http://www.52itstyle.top/thread-10764-1-1.html $ `7 R9 x( `' n! Z0 v
* r$ y7 K* K x1 m: b7 D: I , L' Z! l, R7 l7 ?: s \9 h
2.利用服务器rsync的同步工具。在B架设rsync的服务端,设定需要同步的文件夹,在A设定rsync的客户端,设定同步的来源服务器和对应的文件夹。当B的上传文件夹变动时,rsync会自动同步一份到A的客户目录。 ' B7 i/ Q4 ~; b0 x1 l
# y' y* @1 J }; X! u
/ Z* F, |% p. O4 D 配置详见:http://www.52itstyle.top/thread-17263-1-1.html + o7 g0 h0 N$ ^; o3 ?$ t
" I" k& D( ?# u& f
$ ?: n C5 x# }( n0 O 3.如果以上两种方案你都不想使用,可以在A部署一个底层脚本,用来接收post文件,可以自己设定一个密钥。当B有文件上传时,B服务器用java 的httpClient直接重新post一份到A的接口,然后在A的接口设定逻辑存放到相应的目录。 6 C0 u$ @6 ?- g
& b5 N7 k( s: D+ L' L( p
7 W" B2 j& |9 t4 v& i 4.如果文件大小不是太大,B服务器还可以利用各种中转程序,例如先存到mysql,或者nosql的存储里,然后在A服务器上自动去抓取下来。
6 X( a6 w0 K# }3 n ' h: ]4 e/ Y o, b: q# T1 t6 C% z
2 g) _0 r, \, c6 V( I& T 5.当然你还可以使用静态资源云存储,比如七牛,阿里云,使用它们的接口就能把资源上传到它们的服务器,接口十分简单,费用非常便宜,比自建资源服务器便宜很多,但是毕竟不是自己的。
- k8 H1 t6 @ y7 }6 k) A ( F! w' ?% p% P+ b
( n2 G2 W+ L9 W3 N
这里主要简单实现第三种方案(使用语言JAVA): 2 X+ Z7 j0 z& v1 }% J7 B/ B b% O
( P; ?4 j5 ]- y0 D! n1 o2 D& E + F y. Z+ m7 R1 }( C- M
新建客户端 用于上传
5 c% p& a3 d3 o7 C7 \ a HttpPostClient:
7 Q* f3 K; V+ K7 F" g package com.itstyle.web;
8 |4 b5 J s y6 l) Q- s * [% b% n* D5 j( ~2 J! w% y4 U
import java.io.File;5 w4 Z/ P4 M7 ?& ~+ b& V1 L
import java.io.IOException;8 m+ y& ]2 y* ]% e0 D. b
: o, P' o; g5 h, {6 m1 B import org.apache.http.HttpEntity;; H, f9 m. e* `% J( a! H3 m. s' b4 h
import org.apache.http.HttpResponse;. Q1 w- K6 D# q2 a7 H
import org.apache.http.HttpStatus;0 [7 Y1 c% n! U
import org.apache.http.ParseException;( C0 D( e" u4 Y0 t7 \
import org.apache.http.client.HttpClient;5 {3 U& x, r5 C3 V. ^& d; T
import org.apache.http.client.methods.HttpPost;
, t+ A$ M: c Z, d) }0 g import org.apache.http.entity.mime.MultipartEntity;
1 n7 z- l$ ^' ~( E import org.apache.http.entity.mime.content.FileBody;
! G4 `0 T: A a% K8 m4 S' ~ import org.apache.http.entity.mime.content.StringBody;
) o, k: b$ _; k import org.apache.http.impl.client.DefaultHttpClient;2 b( ~% Q4 A9 B
import org.apache.http.util.EntityUtils;
) j: e2 N0 v: ?0 g" }8 K /**
- Y: K+ V R5 n9 v3 f+ W- D3 L: P * 客服端2 R0 B: O, p' d. |: {: P
* 创建者 张志朋! b0 ^8 g5 K* ~5 i; F0 o9 H: R
* 创建时间 2016年4月14日* } H9 \* c) G
* 科帮网 http://www.52itstyle.top
P3 e4 S) K# W$ O* M0 C *- t/ u& N8 G- `" a' ^# i2 J9 W" U
*/
4 u7 o2 |+ a0 S. J: P' e public class HttpPostClient {
! R% Z3 E, A" r/ O. p: ^ public void SubmitPost(String url, String filename, String filepath) {4 A7 h6 Q" V, h- o
o# G, J+ r) Z" {3 g- z
HttpClient httpclient = new DefaultHttpClient();
6 m9 G! O9 J& j- t" l# Y$ Y ( b2 [! t' g4 w/ K! m
try {
; D" _1 g1 V) v" Y 9 Q$ W+ ^! o' k& a4 M) H6 ]
HttpPost httppost = new HttpPost(url);
0 t) @* I3 g4 z( E 1 S& G' V6 j$ u- ~/ X* [
FileBody bin = new FileBody(new File(filepath + File.separator + filename));
8 y6 }( R6 q3 v# _( _) m0 H3 b6 J
\# S9 ^4 O8 }+ p StringBody comment = new StringBody(filename); Y5 m; i8 Z2 c1 p) V2 }5 l
9 d9 _" ]: S" x7 [0 r MultipartEntity reqEntity = new MultipartEntity();! l2 B: e; v0 U' J% U
reqEntity.addPart("file", bin);// file为请求后台的File upload;属性- o8 t8 {5 |/ {( Y
reqEntity.addPart("filename", comment);// filename为请求后台的普通参数;属性( O7 A% P/ e# g- p) H
httppost.setEntity(reqEntity);7 p2 ]4 L2 l Z- @. N/ c, }
9 `" X7 {- O1 n- S HttpResponse response = httpclient.execute(httppost);, [- j. Y# Z' j; T
( ]1 R0 O0 }; M- L* j7 O
int statusCode = response.getStatusLine().getStatusCode();( c8 H8 }' A/ W
/ e( P4 g3 `: v! j5 ]
if (statusCode == HttpStatus.SC_OK) {0 ~& |$ T7 a; f! r7 w) ?" W* y% k
1 Y& e4 R2 T" v, m+ _' a
System.out.println("服务器正常响应.....");. g' z4 m8 ] `1 [
6 z' Y% O% U5 g6 n6 X HttpEntity resEntity = response.getEntity();& ^1 {6 S" |0 j! e
3 {, o) Q7 i+ e. l& E
System.out.println(EntityUtils.toString(resEntity));// httpclient自带的工具类读取返回数据) e9 d; m9 i% S9 C) Q* j
2 P1 o6 K/ u. j; m$ X4 s3 [" x System.out.println(resEntity.getContent());
. |% }2 b6 e* X0 p: V [1 Y% E$ @) K3 j
EntityUtils.consume(resEntity);; A& {( i p; I
}
8 B! l' N |. r/ V& K
' s& t5 d# a% c } catch (ParseException e) {
: @$ m4 X7 n% z7 u7 l$ q e.printStackTrace();1 O) k' i6 p8 K7 i# C
} catch (IOException e) {
1 W8 C6 Z" k+ z) i# a3 i4 X e.printStackTrace();
& W t! R/ y$ e+ q+ u' Y. M: Q } finally {
$ \6 b$ c9 l& \' M try {! a6 M! [' `6 g! z/ r
httpclient.getConnectionManager().shutdown();. |& q7 V" |8 V F9 p. ]
} catch (Exception ignore) {- D. r0 {8 i7 e1 t7 |: Q" b
' `3 k$ j3 K+ ]4 z% \
}
0 ]; @+ \. d$ J( J& F( h; k" D }" N8 v1 E% D1 j/ x
}
" N2 T! v2 r( H7 Q' c0 z /**
( b. E- P0 e& H9 e( B" \! }, R * 自定义文件名称 和路径 win环境下测试- Z/ }) g, z. ]- P2 X! @& D: Y5 v# W
* @param args# q. C q2 l+ i7 {! ?
*/" H/ u" V# Z8 o2 p( E5 E- ^
public static void main(String[] args) {
" @8 n. s/ p! n4 ] HttpPostClient httpPostClient = new HttpPostClient();
' C0 g1 j( k6 r2 h httpPostClient.SubmitPost("http://127.0.0.1:8080/acts_upload/receiveData","test.zip", "D://test");
' E4 n" h) D/ B" L }
+ o* W0 H: y* C5 W8 F C8 } }
& r4 H. [( ]5 }
2 W& N8 ?9 b" U. F$ y; n 复制代码 " B7 p/ S' |+ g/ N2 c4 Y
: H5 G b2 H3 Y3 s- B, x
% S' A$ h) ~2 I5 F
新建服务端 用于接收
7 @# T0 @/ y% x2 g HttpPostServer:
( K" t$ @/ K- R package com.itstyle.web;
+ J' G& M Y& D! V9 [0 v, Z! C# o* L ; b5 v: D! |1 v- g# t
import java.io.File;! k. N* c. w$ w. {3 b+ ]+ h
import java.io.FileOutputStream;: S- S$ I3 F9 ~
import java.io.IOException;! @# I, `$ `) @+ y# D$ \1 I+ @4 R
import java.io.InputStream;
; u: p. Z/ O$ I* r4 c8 S import java.io.PrintWriter;9 d" r" Z4 P4 f( L, \
import java.util.ArrayList;
0 u$ T2 y$ \7 s1 ]8 O import java.util.Iterator;
1 W7 D8 F" Y3 c+ m6 E: Z import java.util.List;
6 m/ r5 i! E5 R1 r : G$ n: |6 }5 o$ |2 x$ s
import javax.servlet.ServletException;0 h+ k9 r% k. J, }8 _& O% L: b' F
import javax.servlet.http.HttpServlet;
! ~$ a6 [! M0 f; B$ L! X import javax.servlet.http.HttpServletRequest;6 ^+ Y5 k; X; h; D( {/ ]
import javax.servlet.http.HttpServletResponse;5 j, G" E" P( Z$ U' N3 ~
+ Z3 I& i7 s6 d- s8 `1 z
import org.apache.commons.fileupload.FileItem;3 d- y$ c+ O+ m8 Z8 _
import org.apache.commons.fileupload.FileItemFactory;
& ]0 L6 V9 U1 i, R/ o4 s; I import org.apache.commons.fileupload.disk.DiskFileItemFactory;
) Q4 b+ C, M# N6 [, g5 I: _ import org.apache.commons.fileupload.servlet.ServletFileUpload;; P, d3 W1 c' I; N; T5 ]$ z( ^
/**6 Q8 K5 U- k2 J2 U9 t
* 服务端 接收文件
# H9 w: r5 ]1 @. b8 A' O * 创建者 张志朋! N7 g9 v9 k1 v2 y1 c' N: e
* 创建时间 2016年4月14日
( j* J" i. B6 X i3 |$ u * 科帮网 http://www.52itstyle.top
# \' N9 [6 k5 C */
: l: {4 |( `- B public class HttpPostServer extends HttpServlet {% P+ ?/ s/ H' u8 `: V7 E/ s0 \
private static final long serialVersionUID = -1002826847460469784L;
4 k4 ~- H- e! y8 ~. R, e
% a! X0 z1 [1 |+ z5 f0 a @Override
9 k- ^/ d8 C# @8 w) F+ X# A public void init() throws ServletException { s0 l; O" x3 F+ \! n( `. s
' Q+ r9 r- ^2 p5 J% I9 b }
1 D( q5 r$ r7 _( n m, M6 h 2 d; w3 c1 K L! X q. D
@SuppressWarnings("unchecked")
- t- S. _8 u9 J& ~ public void doGet(HttpServletRequest request, HttpServletResponse response)
, A* W* d/ [! ~3 b8 J throws ServletException, IOException {, _/ I+ o$ Q$ h4 I
PrintWriter out = null;1 e. K( j C% t F
3 f) {3 b- V( u; H
response.setContentType("text/html;charset=UTF-8");/ u" Z0 ]4 @7 I4 p' i
String basePath = "d://test1";
5 i" n. l7 s2 e$ o. \ FileItemFactory factory = new DiskFileItemFactory();
: L6 @' e* U6 ]& v* E2 l6 y ServletFileUpload upload = new ServletFileUpload(factory);) Q% [- R5 |3 O f8 j
File directory = null;
: \- z1 A4 y r. h/ p List<FileItem> items = new ArrayList<FileItem>();
2 _, k% t0 }; s H9 O% t- A* d String message = "";
2 K2 c+ f- J$ i, S6 A try {
$ X/ D" u; E' R. c items = upload.parseRequest(request);2 w. V9 w$ X+ W% F b+ T* I% M9 v
// 得到所有的文件
% _0 A K8 l. i" y0 g Iterator<FileItem> it = items.iterator();4 Y+ b5 Y* L: }# J X6 L
while (it.hasNext()) { Z1 H* O: A) H! e3 g
FileItem fItem = (FileItem) it.next();) @# q% G6 j7 h4 z0 C* w
if(!fItem.isFormField()){! h( v: q$ F$ c9 u, m$ S4 [) O# [
String name = fItem.getName();
2 s! ^: i, P8 ]/ Q6 ?3 j9 Z if (name != null && !("".equals(name))) {8 o4 e. |) Q5 S* z2 b' X; h4 M! c
name = name.substring(name.lastIndexOf(File.separator) + 1);
- O' u [" {; z: \- T8 h directory = new File(basePath);
+ M4 ~; R9 Z4 `# O2 p6 Q directory.mkdirs();
( | d- K: R% A7 _( J% | String filePath = (basePath) + File.separator + name;
2 u! V1 @" {3 ]5 m2 R4 d InputStream is = fItem.getInputStream();' i+ K5 }' F: @6 {7 y1 [
FileOutputStream fos = new FileOutputStream(filePath);
3 u a) P; Z0 X( ^0 r# e byte[] buffer = new byte[1024];
* l+ t% M/ g& V7 R while (is.read(buffer) > 0) {
- I/ A1 D5 C1 j8 P fos.write(buffer, 0, buffer.length);% i; M" | q' L2 h' `4 p6 W
}
* L- i0 }# }% A fos.flush();7 h! J. y2 l+ q* s; S9 z
fos.close();
/ s8 G+ h, y5 K, e( D, G' n }' o0 a. x3 n% N8 @; B r0 \! X
}
4 @" y0 n6 k% `2 V7 S } w7 w; ?3 ], P9 @. f- I
message = "{success:true, msg:'接收成功'}";
! w' J$ O6 u0 K- m p: A; m$ m } catch (Exception e) {" { ?( P, a; z+ q- y& c) p# Z. r
message = "{success:false, msg:'读取http请求属性值出错!'}";" f2 Q$ L2 F6 Z, `% L# S" B
e.printStackTrace();' D5 }( M6 r ^8 o, i
}finally{
# D' P2 t# t% z( ? out = response.getWriter();
( t4 ^( C! K2 Q) O2 s' b# t2 G out.print(message);3 C0 R/ b) K* n" E w( j
out.close();
, I" o8 J% e- \3 s }+ D4 Q, j6 [" e9 Z6 f% E$ n
}
* Q; ~* V2 w+ K$ p1 ^" d* Z public void doPost(HttpServletRequest request, HttpServletResponse response)
6 S$ I* T. t$ h; Q( e& S throws ServletException, IOException {
" J6 j& ~9 G) n. y. \( Y: E s doGet(request, response);+ ^3 G) m/ ]2 w# m* F+ | _
}8 u; p3 `3 d1 Q( k+ l5 m& h. R3 P7 q1 C
}% `! q0 i( w$ O" ]% {2 Z2 h+ q
6 I3 ?: f! X* h0 w3 `. K5 d9 q
复制代码
: R5 k, \; \0 L) P" v# _1 } 所需要JAR包8 t6 l) E7 ]0 P2 l7 p. A/ ]
commons-codec-1.6.jar + w0 ]* h5 l6 O. }/ O
commons-fileupload-1.2.1.jar ) B+ u; t% X; j" ^3 k, e/ p
commons-io-1.3.2.jar / q9 n. `6 V9 S; n0 P# F8 U
commons-logging-1.1.1.jar / {3 |, L6 L9 J q! ?$ S H
fluent-hc-4.2.jar
* b$ a' U+ ]- B, q$ [, X httpclient-4.2.jar ) y, e% e5 {3 W9 f) `: v- @( x4 A
httpclient-cache-4.2.jar
: E) }) X! i1 L0 r* w2 l6 J5 | httpcore-4.2.jar c( s5 e! y& X1 k3 d) T) Q( ]) d
httpmime-4.2.jar
7 J$ C0 U: ]$ F, V 5 R, k2 X0 @ r- _1 T+ S, ^& g& {
项目下载地址:点击下载
4 M2 F* `# _# s& ` 6 }! j; e& ]6 B) T2 F$ g" Q
3 r: b$ P% i5 w 密码:
% K8 G+ ^; {: t( v( \( E
3 j! a' _1 b. b* C% {! Z& z 4 G# H; d5 ^% Q2 T
* U7 {$ U3 C" b- m) e$ I. k9 d
, G* f4 T% k% I) j$ k# J9 _
科帮网 1、本主题所有言论和图片纯属会员个人意见,与本社区立场无关2、本站所有主题由该帖子作者发表,该帖子作者与科帮网 享有帖子相关版权3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和科帮网 的同意4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意7、科帮网 管理员和版主有权不事先通知发贴者而删除本文
JAVA爱好者①群:
JAVA爱好者②群:
JAVA爱好者③ :