我的日常

登录/注册
您现在的位置:论坛 盖世程序员(我猜到了开头 却没有猜到结局) 项目源码 > 文件服务器解决方案(项目源码)
总共48087条微博

动态微博

查看: 20047|回复: 57

文件服务器解决方案(项目源码)

[复制链接]
admin    

1244

主题

544

听众

1万

金钱

管理员

  • TA的每日心情

    2021-2-2 11:21
  • 签到天数: 36 天

    [LV.5]常住居民I

    管理员

    跳转到指定楼层
    #
    发表于 2016-04-15 15:55:50 |只看该作者 |正序浏览
           任何强大的单一服务器都满足不了大型网站持续增长的业务需求,网站发展到一定程序,应用服务器就要跟文件存储分离,创建文件服务器分摊应用服务器的压力。文件服务器是为网络上各工作站提供完整数据、文件、目录等信息共享,对网络文件实行统一管理的服务器。它能进行文件建立、删除、打开、关闭、读写等操作。当然文件服务器并不是单一存在的,如果存在单点故障,对项目的影响将是巨大的,所以前期分布式文件系统也是项目上线初期必须的,做好容灾备份。对分布式文件系统感兴趣的同学可以看下FastDFShttp://www.52itstyle.top/thread-22615-1-1.html5 ]. 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 O3.如果以上两种方案你都不想使用,可以在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& i4.如果文件大小不是太大,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& T5.当然你还可以使用静态资源云存储,比如七牛,阿里云,使用它们的接口就能把资源上传到它们的服务器,接口十分简单,费用非常便宜,比自建资源服务器便宜很多,但是毕竟不是自己的。
    - 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 \  aHttpPostClient:
    7 Q* f3 K; V+ K7 F" g
    1. package com.itstyle.web;
      8 |4 b5 J  s  y6 l) Q- s
    2. * [% b% n* D5 j( ~2 J! w% y4 U
    3. import java.io.File;5 w4 Z/ P4 M7 ?& ~+ b& V1 L
    4. import java.io.IOException;8 m+ y& ]2 y* ]% e0 D. b

    5. : o, P' o; g5 h, {6 m1 B
    6. import org.apache.http.HttpEntity;; H, f9 m. e* `% J( a! H3 m. s' b4 h
    7. import org.apache.http.HttpResponse;. Q1 w- K6 D# q2 a7 H
    8. import org.apache.http.HttpStatus;0 [7 Y1 c% n! U
    9. import org.apache.http.ParseException;( C0 D( e" u4 Y0 t7 \
    10. import org.apache.http.client.HttpClient;5 {3 U& x, r5 C3 V. ^& d; T
    11. import org.apache.http.client.methods.HttpPost;
      , t+ A$ M: c  Z, d) }0 g
    12. import org.apache.http.entity.mime.MultipartEntity;
      1 n7 z- l$ ^' ~( E
    13. import org.apache.http.entity.mime.content.FileBody;
      ! G4 `0 T: A  a% K8 m4 S' ~
    14. import org.apache.http.entity.mime.content.StringBody;
      ) o, k: b$ _; k
    15. import org.apache.http.impl.client.DefaultHttpClient;2 b( ~% Q4 A9 B
    16. import org.apache.http.util.EntityUtils;
      ) j: e2 N0 v: ?0 g" }8 K
    17. /**
      - Y: K+ V  R5 n9 v3 f+ W- D3 L: P
    18. * 客服端2 R0 B: O, p' d. |: {: P
    19. * 创建者        张志朋! b0 ^8 g5 K* ~5 i; F0 o9 H: R
    20. * 创建时间        2016年4月14日* }  H9 \* c) G
    21. * 科帮网 http://www.52itstyle.top
        P3 e4 S) K# W$ O* M0 C
    22. *- t/ u& N8 G- `" a' ^# i2 J9 W" U
    23. */
      4 u7 o2 |+ a0 S. J: P' e
    24. public class HttpPostClient {
      ! R% Z3 E, A" r/ O. p: ^
    25.         public void SubmitPost(String url, String filename, String filepath) {4 A7 h6 Q" V, h- o
    26.   o# G, J+ r) Z" {3 g- z
    27.                 HttpClient httpclient = new DefaultHttpClient();
      6 m9 G! O9 J& j- t" l# Y$ Y
    28. ( b2 [! t' g4 w/ K! m
    29.                 try {
      ; D" _1 g1 V) v" Y
    30. 9 Q$ W+ ^! o' k& a4 M) H6 ]
    31.                         HttpPost httppost = new HttpPost(url);
      0 t) @* I3 g4 z( E
    32. 1 S& G' V6 j$ u- ~/ X* [
    33.                         FileBody bin = new FileBody(new File(filepath + File.separator + filename));
      8 y6 }( R6 q3 v# _( _) m0 H3 b6 J

    34.   \# S9 ^4 O8 }+ p
    35.                         StringBody comment = new StringBody(filename);  Y5 m; i8 Z2 c1 p) V2 }5 l

    36. 9 d9 _" ]: S" x7 [0 r
    37.                         MultipartEntity reqEntity = new MultipartEntity();! l2 B: e; v0 U' J% U
    38.                         reqEntity.addPart("file", bin);// file为请求后台的File upload;属性- o8 t8 {5 |/ {( Y
    39.                         reqEntity.addPart("filename", comment);// filename为请求后台的普通参数;属性( O7 A% P/ e# g- p) H
    40.                         httppost.setEntity(reqEntity);7 p2 ]4 L2 l  Z- @. N/ c, }

    41. 9 `" X7 {- O1 n- S
    42.                         HttpResponse response = httpclient.execute(httppost);, [- j. Y# Z' j; T
    43. ( ]1 R0 O0 }; M- L* j7 O
    44.                         int statusCode = response.getStatusLine().getStatusCode();( c8 H8 }' A/ W
    45. / e( P4 g3 `: v! j5 ]
    46.                         if (statusCode == HttpStatus.SC_OK) {0 ~& |$ T7 a; f! r7 w) ?" W* y% k
    47. 1 Y& e4 R2 T" v, m+ _' a
    48.                                 System.out.println("服务器正常响应.....");. g' z4 m8 ]  `1 [

    49. 6 z' Y% O% U5 g6 n6 X
    50.                                 HttpEntity resEntity = response.getEntity();& ^1 {6 S" |0 j! e
    51. 3 {, o) Q7 i+ e. l& E
    52.                                 System.out.println(EntityUtils.toString(resEntity));// httpclient自带的工具类读取返回数据) e9 d; m9 i% S9 C) Q* j

    53. 2 P1 o6 K/ u. j; m$ X4 s3 [" x
    54.                                 System.out.println(resEntity.getContent());
      . |% }2 b6 e* X0 p: V
    55.   [1 Y% E$ @) K3 j
    56.                                 EntityUtils.consume(resEntity);; A& {( i  p; I
    57.                         }
      8 B! l' N  |. r/ V& K

    58. ' s& t5 d# a% c
    59.                 } catch (ParseException e) {
      : @$ m4 X7 n% z7 u7 l$ q
    60.                         e.printStackTrace();1 O) k' i6 p8 K7 i# C
    61.                 } catch (IOException e) {
      1 W8 C6 Z" k+ z) i# a3 i4 X
    62.                         e.printStackTrace();
      & W  t! R/ y$ e+ q+ u' Y. M: Q
    63.                 } finally {
      $ \6 b$ c9 l& \' M
    64.                         try {! a6 M! [' `6 g! z/ r
    65.                                 httpclient.getConnectionManager().shutdown();. |& q7 V" |8 V  F9 p. ]
    66.                         } catch (Exception ignore) {- D. r0 {8 i7 e1 t7 |: Q" b
    67.                                 ' `3 k$ j3 K+ ]4 z% \
    68.                         }
      0 ]; @+ \. d$ J( J& F( h; k" D
    69.                 }" N8 v1 E% D1 j/ x
    70.         }
      " N2 T! v2 r( H7 Q' c0 z
    71.         /**
      ( b. E- P0 e& H9 e( B" \! }, R
    72.          * 自定义文件名称  和路径  win环境下测试- Z/ }) g, z. ]- P2 X! @& D: Y5 v# W
    73.          * @param args# q. C  q2 l+ i7 {! ?
    74.          */" H/ u" V# Z8 o2 p( E5 E- ^
    75.         public static void main(String[] args) {
      " @8 n. s/ p! n4 ]
    76.                 HttpPostClient httpPostClient = new HttpPostClient();
      ' C0 g1 j( k6 r2 h
    77.                 httpPostClient.SubmitPost("http://127.0.0.1:8080/acts_upload/receiveData","test.zip", "D://test");
      ' E4 n" h) D/ B" L
    78.         }
      + o* W0 H: y* C5 W8 F  C8 }
    79. }
      & r4 H. [( ]5 }

    80. 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 gHttpPostServer:
    ( K" t$ @/ K- R
    1. package com.itstyle.web;
      + J' G& M  Y& D! V9 [0 v, Z! C# o* L
    2. ; b5 v: D! |1 v- g# t
    3. import java.io.File;! k. N* c. w$ w. {3 b+ ]+ h
    4. import java.io.FileOutputStream;: S- S$ I3 F9 ~
    5. import java.io.IOException;! @# I, `$ `) @+ y# D$ \1 I+ @4 R
    6. import java.io.InputStream;
      ; u: p. Z/ O$ I* r4 c8 S
    7. import java.io.PrintWriter;9 d" r" Z4 P4 f( L, \
    8. import java.util.ArrayList;
      0 u$ T2 y$ \7 s1 ]8 O
    9. import java.util.Iterator;
      1 W7 D8 F" Y3 c+ m6 E: Z
    10. import java.util.List;
      6 m/ r5 i! E5 R1 r
    11. : G$ n: |6 }5 o$ |2 x$ s
    12. import javax.servlet.ServletException;0 h+ k9 r% k. J, }8 _& O% L: b' F
    13. import javax.servlet.http.HttpServlet;
      ! ~$ a6 [! M0 f; B$ L! X
    14. import javax.servlet.http.HttpServletRequest;6 ^+ Y5 k; X; h; D( {/ ]
    15. import javax.servlet.http.HttpServletResponse;5 j, G" E" P( Z$ U' N3 ~
    16. + Z3 I& i7 s6 d- s8 `1 z
    17. import org.apache.commons.fileupload.FileItem;3 d- y$ c+ O+ m8 Z8 _
    18. import org.apache.commons.fileupload.FileItemFactory;
      & ]0 L6 V9 U1 i, R/ o4 s; I
    19. import org.apache.commons.fileupload.disk.DiskFileItemFactory;
      ) Q4 b+ C, M# N6 [, g5 I: _
    20. import org.apache.commons.fileupload.servlet.ServletFileUpload;; P, d3 W1 c' I; N; T5 ]$ z( ^
    21. /**6 Q8 K5 U- k2 J2 U9 t
    22. * 服务端 接收文件
      # H9 w: r5 ]1 @. b8 A' O
    23. * 创建者        张志朋! N7 g9 v9 k1 v2 y1 c' N: e
    24. * 创建时间        2016年4月14日
      ( j* J" i. B6 X  i3 |$ u
    25. * 科帮网 http://www.52itstyle.top
      # \' N9 [6 k5 C
    26. */
      : l: {4 |( `- B
    27. public class HttpPostServer extends HttpServlet {% P+ ?/ s/ H' u8 `: V7 E/ s0 \
    28.         private static final long serialVersionUID = -1002826847460469784L;
      4 k4 ~- H- e! y8 ~. R, e

    29. % a! X0 z1 [1 |+ z5 f0 a
    30.         @Override
      9 k- ^/ d8 C# @8 w) F+ X# A
    31.         public void init() throws ServletException {  s0 l; O" x3 F+ \! n( `. s

    32. ' Q+ r9 r- ^2 p5 J% I9 b
    33.         }
      1 D( q5 r$ r7 _( n  m, M6 h
    34. 2 d; w3 c1 K  L! X  q. D
    35.         @SuppressWarnings("unchecked")
      - t- S. _8 u9 J& ~
    36.         public void doGet(HttpServletRequest request, HttpServletResponse response)
      , A* W* d/ [! ~3 b8 J
    37.                         throws ServletException, IOException {, _/ I+ o$ Q$ h4 I
    38.                 PrintWriter out = null;1 e. K( j  C% t  F
    39.                 3 f) {3 b- V( u; H
    40.                 response.setContentType("text/html;charset=UTF-8");/ u" Z0 ]4 @7 I4 p' i
    41.         String basePath = "d://test1";
      5 i" n. l7 s2 e$ o. \
    42.                 FileItemFactory factory = new DiskFileItemFactory();
      : L6 @' e* U6 ]& v* E2 l6 y
    43.                 ServletFileUpload upload = new ServletFileUpload(factory);) Q% [- R5 |3 O  f8 j
    44.                 File directory = null;
      : \- z1 A4 y  r. h/ p
    45.                 List<FileItem> items = new ArrayList<FileItem>();
      2 _, k% t0 }; s  H9 O% t- A* d
    46.                 String message = "";
      2 K2 c+ f- J$ i, S6 A
    47.                 try {
      $ X/ D" u; E' R. c
    48.                         items = upload.parseRequest(request);2 w. V9 w$ X+ W% F  b+ T* I% M9 v
    49.                         // 得到所有的文件
      % _0 A  K8 l. i" y0 g
    50.                         Iterator<FileItem> it = items.iterator();4 Y+ b5 Y* L: }# J  X6 L
    51.                         while (it.hasNext()) {  Z1 H* O: A) H! e3 g
    52.                                 FileItem fItem = (FileItem) it.next();) @# q% G6 j7 h4 z0 C* w
    53.                 if(!fItem.isFormField()){! h( v: q$ F$ c9 u, m$ S4 [) O# [
    54.                         String name = fItem.getName();
      2 s! ^: i, P8 ]/ Q6 ?3 j9 Z
    55.                         if (name != null && !("".equals(name))) {8 o4 e. |) Q5 S* z2 b' X; h4 M! c
    56.                                 name = name.substring(name.lastIndexOf(File.separator) + 1);
      - O' u  [" {; z: \- T8 h
    57.                                 directory = new File(basePath);
      + M4 ~; R9 Z4 `# O2 p6 Q
    58.                                 directory.mkdirs();
      ( |  d- K: R% A7 _( J% |
    59.                                 String filePath = (basePath)  + File.separator + name;
      2 u! V1 @" {3 ]5 m2 R4 d
    60.                                 InputStream is = fItem.getInputStream();' i+ K5 }' F: @6 {7 y1 [
    61.                                 FileOutputStream fos = new FileOutputStream(filePath);
      3 u  a) P; Z0 X( ^0 r# e
    62.                                 byte[] buffer = new byte[1024];
      * l+ t% M/ g& V7 R
    63.                                 while (is.read(buffer) > 0) {
      - I/ A1 D5 C1 j8 P
    64.                                         fos.write(buffer, 0, buffer.length);% i; M" |  q' L2 h' `4 p6 W
    65.                                 }
      * L- i0 }# }% A
    66.                                 fos.flush();7 h! J. y2 l+ q* s; S9 z
    67.                                 fos.close();
      / s8 G+ h, y5 K, e( D, G' n
    68.                         }' o0 a. x3 n% N8 @; B  r0 \! X
    69.                 }
      4 @" y0 n6 k% `2 V7 S
    70.                         }  w7 w; ?3 ], P9 @. f- I
    71.                         message = "{success:true, msg:'接收成功'}";
      ! w' J$ O6 u0 K- m  p: A; m$ m
    72.                 } catch (Exception e) {" {  ?( P, a; z+ q- y& c) p# Z. r
    73.                         message = "{success:false, msg:'读取http请求属性值出错!'}";" f2 Q$ L2 F6 Z, `% L# S" B
    74.                         e.printStackTrace();' D5 }( M6 r  ^8 o, i
    75.                 }finally{
      # D' P2 t# t% z( ?
    76.                         out = response.getWriter();
      ( t4 ^( C! K2 Q) O2 s' b# t2 G
    77.                         out.print(message);3 C0 R/ b) K* n" E  w( j
    78.                         out.close();
      , I" o8 J% e- \3 s
    79.                 }+ D4 Q, j6 [" e9 Z6 f% E$ n
    80.         }
      * Q; ~* V2 w+ K$ p1 ^" d* Z
    81.         public void doPost(HttpServletRequest request, HttpServletResponse response)
      6 S$ I* T. t$ h; Q( e& S
    82.                         throws ServletException, IOException {
      " J6 j& ~9 G) n. y. \( Y: E  s
    83.                 doGet(request, response);+ ^3 G) m/ ]2 w# m* F+ |  _
    84.         }8 u; p3 `3 d1 Q( k+ l5 m& h. R3 P7 q1 C
    85. }% `! q0 i( w$ O" ]% {2 Z2 h+ q
    86. 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$ [, Xhttpclient-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& z4 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爱好者②群:JAVA爱好者② JAVA爱好者③ : JAVA爱好者③

    本帖被以下淘专辑推荐:

    2

    主题

    0

    听众

    137

    金钱

    三袋弟子

    该用户从未签到

    57#
    发表于 2018-07-24 10:39:05 |只看该作者
    感谢了楼主分享,多学习多交流
    回复

    使用道具 举报

    0

    主题

    0

    听众

    542

    金钱

    四袋长老

    该用户从未签到

    56#
    发表于 2018-07-17 11:25:17 |只看该作者
    谢谢分享                                    
    回复

    使用道具 举报

    3

    主题

    0

    听众

    129

    金钱

    三袋弟子

    该用户从未签到

    55#
    发表于 2018-06-04 16:06:44 |只看该作者
    虽然还不太懂不过可以多看看
    回复

    使用道具 举报

    1

    主题

    0

    听众

    97

    金钱

    三袋弟子

    该用户从未签到

    54#
    发表于 2018-03-14 17:21:38 |只看该作者
    666666666666666
    5 s' o3 q( j) Z! X" o/ o% ~0 S2 y9 `9 b5 S
    回复

    使用道具 举报

    0

    主题

    0

    听众

    73

    金钱

    二袋弟子

    该用户从未签到

    53#
    发表于 2018-01-16 11:06:29 |只看该作者
    好好学习,天天向上
    回复

    使用道具 举报

    4

    主题

    1

    听众

    570

    金钱

    四袋长老

  • TA的每日心情

    2019-3-10 11:07
  • 签到天数: 2 天

    [LV.1]初来乍到

    90后

    52#
    发表于 2017-12-23 18:45:02 |只看该作者
    看看。。。。。。顶,
    回复

    使用道具 举报

    4

    主题

    0

    听众

    220

    金钱

    三袋弟子

    该用户从未签到

    51#
    发表于 2017-11-13 10:38:48 |只看该作者
    我想要下载呢
    回复

    使用道具 举报

    2

    主题

    0

    听众

    212

    金钱

    三袋弟子

    该用户从未签到

    50#
    发表于 2017-11-10 20:55:05 |只看该作者
    嘻嘻嘻,谢谢
    回复

    使用道具 举报

    4

    主题

    0

    听众

    80

    金钱

    二袋弟子

    该用户从未签到

    49#
    发表于 2017-11-01 11:56:30 |只看该作者
    不错,谢谢分线
    回复

    使用道具 举报

    12

    主题

    0

    听众

    229

    金钱

    三袋弟子

    该用户从未签到

    48#
    发表于 2017-10-13 19:29:28 |只看该作者
    谢谢分享搜索
    回复

    使用道具 举报

    快速回复
    您需要登录后才可以回帖 登录 | 立即注册

       

    关闭

    站长推荐上一条 /1 下一条

    发布主题 快速回复 返回列表 联系我们 官方QQ群 科帮网手机客户端
    快速回复 返回顶部 返回列表