Docker下Java文件上传服务三部曲之一:准备环境

《Docker下Java文件上传服务三部曲》的主要内容是Java的文件上传服务实战,由三篇文章组成,内容分别如下:

    准备工作(即本章),包括上传文件的客户端开发、创建Tomcat容器(支持在线部署),安装wireshark;
    服务端编码,创建三个应用,实战SpringMVC、Apache fileupload库,SpringBoot三种场景下的文件上传服务;
    wireshark抓包,分析文件上传服务过程中的传输详情;

原文地址:http://blog.csdn.net/boling_cavalry/article/details/79361159
三部曲所有文章链接

    《Docker下Java文件上传服务三部曲之一:准备环境》
    《Docker下Java文件上传服务三部曲之二:服务端开发》
    《Docker下Java文件上传服务三部曲之三:wireshark抓包分析》

实战环境

整个环境由两台电脑组成,操作系统分别是win10和ubuntu16,如下图:
这里写图片描述
如上图,在win10电脑上运行一个java类,发起POST请求将文件提交到ubuntu电脑上的Docker容器中,该容器运行着上传文件的web服务,在win10电脑上安装有wireshark,用来分析这个上传文件的POST请求;

注:客户端和服务端部署在不同的机器上,这样方便wireshark抓包,您也可以用vmware在win10上装一个ubuntu虚拟机,不过此时wireshark抓包前请注意选择正确的网卡(vmware虚拟出的那个);

开发环境的具体信息如下:

    操作系统:win10,ubuntu16;
    JDK:1.8.0_151;
    maven:3.3.3;
    Docker版本:17.03.2-ce;
    wireshark版本:2.4.4;

 

源码下载

上传文件的客户端源码,您可以在GitHub下载,地址和链接信息如下表所示:
名称     链接     备注
项目主页     https://github.com/zq2599/blog_demos     该项目在GitHub上的主页
git仓库地址(https)     https://github.com/zq2599/blog_demos.git     该项目源码的仓库地址,https协议
git仓库地址(ssh)     git@github.com:zq2599/blog_demos.git     该项目源码的仓库地址,ssh协议
这个git项目中有多个目录,本次所需的资源放在uploadfileclient,如下图红框所示: ![这里写图片描述](https://img-blog.csdn.net/20180225003928219?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYm9saW5nX2NhdmFscnk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
本章内容列举

本章的工作是为后面章节的文件服务的运行和验证做准备的,包含以下步骤:

    在win10电脑上,安装wireshark;
    在win10电脑上,创建maven工程uploadfileclient,里面有一个java类UploadFileClient,后续所有上传文件的请求都是这个类的main方法完成的;
    我们要验证UploadFileClient.java能不能正常工作(上传文件全靠它了),所以在ubuntu电脑上创建一个文件服务的docker容器,用于接收UploadFileClient类上传的文件;
    在win10电脑上,运行UploadFileClient.java的main方法,看能否把文件上传到步骤4中搭建的文件服务器上;
    下一章的文件服务应用会做成war包运行在Tomcat上,所以我们要在Docker下创建一个Tomcat容器,并且该容器支持在线部署war包;


安装wireshark

请在官网下载wireshark安装文件,地址:https://www.wireshark.org/#download
在ubuntu电脑上,创建一个文件服务的Docker容器

在装好了docker的ubuntu电脑上运行以下命令,可以启动一个文件服务的容器:

docker run --name fileserver001 -p 8080:8080 -v /usr/local/work/fileupload/upload:/usr/Downloads -idt  bolingcavalry/springbootfileserver:0.0.1-SNAPSHOT

    1

启动后,容器的/usr/Downloads目录被映射到了ubuntu电脑的/usr/local/work/fileupload/upload目录(此目录要确保存在),这样上传的文件就能通过这个目录导出到ubuntu电脑上,便于我们验证文件是否完好无损;

注:有关该容器的镜像的会在下一章详细说明,本章我们就直接拿来用吧,作为上传文件的服务端;
上传文件的客户端开发

在win10电脑上创建一个maven工程,pom.xml如下:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <project xmlns="http://maven.apache.org/POM/4.0.0"
 3          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 5     <modelVersion>4.0.0</modelVersion>
 6 
 7     <groupId>com.bolingcavalry</groupId>
 8     <artifactId>uploadfileclient</artifactId>
 9     <version>1.0-SNAPSHOT</version>
10 
11     <!-- 指明编译源代码时使用的字符编码,maven编译的时候默认使用的GBK编码, 通过project.build.sourceEncoding属性设置字符编码,告诉maven这个项目使用UTF-8来编译 -->
12     <properties>
13         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
14     </properties>
15 
16     <dependencies>
17         <dependency>
18             <groupId>org.apache.httpcomponents</groupId>
19             <artifactId>httpclient</artifactId>
20             <version>4.3.5</version>
21         </dependency>
22 
23         <dependency>
24             <groupId>org.apache.httpcomponents</groupId>
25             <artifactId>httpmime</artifactId>
26             <version>4.3.5</version>
27         </dependency>
28     </dependencies>
29 
30 </project>



该工程只依赖了两个库:httpclient和httpmime;

创建一个java类用来发起上传文件的请求,源码如下:

 1 package com.bolingcavalry;
 2 
 3 import org.apache.http.HttpEntity;
 4 import org.apache.http.client.ClientProtocolException;
 5 import org.apache.http.client.config.RequestConfig;
 6 import org.apache.http.client.methods.CloseableHttpResponse;
 7 import org.apache.http.client.methods.HttpPost;
 8 import org.apache.http.entity.ContentType;
 9 import org.apache.http.entity.mime.MultipartEntityBuilder;
10 import org.apache.http.entity.mime.content.FileBody;
11 import org.apache.http.entity.mime.content.StringBody;
12 import org.apache.http.impl.client.CloseableHttpClient;
13 import org.apache.http.impl.client.HttpClients;
14 import org.apache.http.util.EntityUtils;
15 
16 import java.io.File;
17 import java.io.IOException;
18 
19 /**
20  * @Description : 上传文件的类,将本地文件POST到server
21  * @Author : zq2599@gmail.com
22  * @Date : 2018-02-24 18:12
23  */
24 public class UploadFileClient {
25 
26     /**
27      * 文件服务的ULR
28      */
29     private static final String POST_URL = "http://www.bolingcavalry.com:8088/springmvcfileserver/upload";
30 
31     /**
32      * 要上传的本地文件的完整路径加文件名
33      */
34     private static final String UPLOAD_FILE_FULLPATH = "D:\\temp\\201802\\21\\abc.zip";
35 
36     public static void main(String[] args) throws Exception{
37         System.out.println("start upload");
38         CloseableHttpClient httpclient = HttpClients.createDefault();
39         try {
40             HttpPost httppost = new HttpPost(POST_URL);
41 
42             //基本的配置信息
43             RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(200000).setSocketTimeout(200000).build();
44 
45             httppost.setConfig(requestConfig);
46 
47             //要上传的文件
48             FileBody bin = new FileBody(new File(UPLOAD_FILE_FULLPATH));
49 
50             //在POST中添加一个字符串请求参数
51             StringBody comment = new StringBody("This is comment", ContentType.TEXT_PLAIN);
52 
53             HttpEntity reqEntity = MultipartEntityBuilder.create().addPart("file", bin).addPart("comment", comment).build();
54 
55             httppost.setEntity(reqEntity);
56 
57             System.out.println("executing request " + httppost.getRequestLine());
58 
59             //发起POST
60             CloseableHttpResponse response = httpclient.execute(httppost);
61 
62             try {
63 
64                 HttpEntity resEntity = response.getEntity();
65                 if (resEntity != null) {
66                     String responseEntityStr = EntityUtils.toString(response.getEntity());
67                     System.out.println("response status : " + response.getStatusLine());
68                     System.out.println("response content length: " + resEntity.getContentLength());
69                     System.out.println("response entity str : " + responseEntityStr);
70                 }
71                 EntityUtils.consume(resEntity);
72             } finally {
73                 response.close();
74             }
75         } catch (ClientProtocolException e) {
76             e.printStackTrace();
77         } catch (IOException e) {
78             e.printStackTrace();
79         } finally {
80             try {
81                 httpclient.close();
82             } catch (IOException e) {
83                 e.printStackTrace();
84             }
85         }
86 
87         System.out.println("end upload");
88     }
89 }

 

上面的代码,有以下三点需要注意:

    利用httpclient的API可以发起POST请求,提交的二进制文件用FileBody对象处理,字符串用StringBody 对象处理;
    我的ubuntu电脑IP地址是192.168.119.155,所以POST_URL的值是:http://192.168.119.155:8080/upload,请将此改为您的ubuntu电脑的IP地址;
    UPLOAD_FILE_FULLPATH的值是要上传的文件在win10电脑上的路径;


验证UploadFileClient类上传文件的功能

在pom.xml所在目录执行以下命令,即可编译并运行UploadFileClient类的main方法:

mvn clean compile -U exec:java -Dexec.mainClass="com.bolingcavalry.UploadFileClient"


上述命令执行时,会输出类似以下的信息:

 1 [INFO]
 2 [INFO] --- exec-maven-plugin:1.6.0:java (default-cli) @ uploadfileclient ---
 3 start upload
 4 executing request POST http://192.168.119.155:8080/upload HTTP/1.1
 5 response status : HTTP/1.1 200
 6 response content length: 40
 7 response entity str : SpringBoot环境下,上传文件成功
 8 end upload
 9 [INFO] ------------------------------------------------------------------------
10 [INFO] BUILD SUCCESS
11 [INFO] ------------------------------------------------------------------------
12 [INFO] Total time: 10.226 s
13 [INFO] Finished at: 2018-02-25T00:00:13+08:00
14 [INFO] Final Memory: 20M/181M
15 [INFO] ------------------------------------------------------------------------


“SpringBoot环境下,上传文件成功"这一句是服务端接收文件成功后返回的信息;
在服务端验证上传成功

在ubuntu电脑执行docker logs fileserver001,能看到容器的日志,如下:

2018-02-24 16:00:13.077  INFO 1 --- [nio-8080-exec-5] c.b.s.controller.UploadController        : start upload, comment [This is comment]
2018-02-24 16:00:13.079  INFO 1 --- [nio-8080-exec-5] c.b.s.controller.UploadController        : base save path [/tmp/tomcat-docbase.8533878395220260315.8080/WEB-INF/upload], original file name [abc.zip]
2018-02-24 16:00:13.080  INFO 1 --- [nio-8080-exec-5] c.b.s.controller.UploadController        : real save path [/tmp/tomcat-docbase.8533878395220260315.8080/WEB-INF/upload/15/1], real file name [fba8a275-cfc0-4471-b4f7-21d2913450cb_abc.zip]
2018-02-24 16:00:13.080  INFO 1 --- [nio-8080-exec-5] c.b.s.controller.UploadController        : save file success [/tmp/tomcat-docbase.8533878395220260315.8080/WEB-INF/upload/15/1/fba8a275-cfc0-4471-b4f7-21d2913450cb_abc.zip]


如上所示,上传的文件存放在文件夹:/tmp/tomcat-docbase.8533878395220260315.8080/WEB-INF/upload/15/1/;

执行命令docker exec -it fileserver001 /bin/bash进入容器,再将上述文件夹内的文件复制到/usr/Downloads目录下,此文件就从docker容器被导出到ubuntu的/usr/local/work/fileupload/upload目录下了,方便您验证该文件与上传的是否一致;
创建支持在线部署的Tomcat容器

在ubuntu电脑上,执行以下命令即可创建Tomcat容器,并且该容器支持在线部署war包:

docker run --name tomcat006 -p 8088:8080 -v /usr/local/work/fileupload/upload:/usr/Downloads -idt  bolingcavalry/online_deploy_tomcat:0.0.1

  

这样文件服务的maven工程就可以直接在线部署到这个tomcat上去了,关于Tomcat在线部署的详情,请参照《实战docker,编写Dockerfile定制tomcat镜像,实现web应用在线部署》;

至此,前期的准备工作已经完成,接下来的章节我们一起来开发和部署文件服务的web应用吧;
欢迎关注我的公众号:程序员欣宸

posted on 2020-07-04 17:15  专注30  阅读(171)  评论(0)    收藏  举报

导航