Fork me on GitHub

JackLin的博客

当前位置:首页 > 分类

SpringBoot 10 JavaWeb 2 Android 0 源码分析 1 Thymeleaf 1 MyBatis 0 SSM 1 翻译 0 数据库设计 9 Gradle 1 Test 1 Tomcat 1 前端设计 2 ElasticSearch 2 阿里巴巴 9 Redis 3 Docker 1 实验报告 1 SpringCloud相关 1 生活 1

阿里云ECS训练营_Day05_搭建JavaWeb开发环境

  • 2020-08-11
  • 131
  • 阿里巴巴
# 阿里云ECS训练营-Day05-打造JavaWeb开发环境 今天是最后一天了!!!内容比较简单,快速过一遍即可 ## 1. 连接ECS服务器 我习惯用 Xshell 连接服务器进行命令行操作,用 Xftp 来传输文件。 ## 2. 安装 JDK 使用 yum 安装 jdk ```bash yum -y install java-1.8.0-openjdk* ``` 查看是否安装成功 ```bash java -version ``` 安装成功之后,结果如下图所示: ![](http://image.linkaiblog.top/image-20200811183436411.png) ## 3. 安装 MySql 数据库 为了方便起见,可以直接使用宝塔面板进行安装即可! 宝塔面板官网地址:https://www.bt.cn/ 按照文档安装完之后,在“软件商店”找到 MySql 数据库,进行安装即可。 安装完成之后,用宝塔面板的 phpMyAdmin 可以连接上,或者使用 Navicat,DataGrip 之类的图形工具连接。 ----- 如果使用 yum 进行安装,那么可能用到下面几条命令: ##### 1. 修改默认 MySql 密码 ```bash set global validate_password_policy=0; #修改密码安全策略为低(只校验密码长度,至少8位)。 ALTER USER 'root'@'localhost' IDENTIFIED BY '12345678'; ``` ##### 2. 授予 root 用户远程管理权限 ```bash GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '12345678'; ``` ## 4. 安装 Tomcat 手动下载Tomcat压缩包上传至服务器或者使用 wget 命令直接下载。 ##### 4.1 使用 wget 命令下载 tomcat 压缩包 ```bash wget https://mirror.bit.edu.cn/apache/tomcat/tomcat-8/v8.5.57/bin/apache-tomcat-8.5.57.tar.gz ``` ##### 4.2 解压 ```bash tar -zxvf apache-tomcat-8.5.57.tar.gz ``` ##### 4.3 将文件复制到指定目录 ```bash mv apache-tomcat-8.5.57 /usr/local/Tomcat8.5 ``` ##### 4.4 授予权限 ```bash chmod +x /usr/local/Tomcat8.5/bin/*.sh ``` ##### 4.5 启动 tomcat ```bash /usr/local/Tomcat8.5/bin/./startup.sh ``` 访问8080端口: ![](http://image.linkaiblog.top/image-20200811184939209.png)

阿里云ECS训练营_Day04_打造离线下载服务器CCAA

  • 2020-08-10
  • 113
  • 阿里巴巴
# 安装 CCAA 这个是官方的CCAA的帮助文档地址:https://www.yuque.com/helloz/ccaa/install 官方文档放在语雀上面的,可以按照上面的步骤来,更加详细。**(记得开放安全组端口)** (PS:顺便给语雀打个广告~~) - 在服务器上输入下面命令 ```bash bash <(curl -Lsk https://raw.githubusercontent.com/helloxz/ccaa/master/ccaa.sh) cdn ``` - 之后会让你选择,输入1,然后按下回车即可 ![](http://image.linkaiblog.top/image-20200808162341201.png) - 然后设置绝对路径,默认即可,按下回车 ![](http://image.linkaiblog.top/image-20200808162514990.png) - 然后输入密钥 ![](http://image.linkaiblog.top/image-20200808162723024.png) - 然后就可以访问了**(记得要开放阿里云安全组对应端口6080)** ![](http://image.linkaiblog.top/image-20200808162916090.png) ![](http://image.linkaiblog.top/image-20200808163225791.png) - **注意:如果 Aria2 状态一直显示未连接的话,原因是端口未开放** 需要同时开放 6080,6081(文件管理),6800(AriaNg设置里)。 因为在 AriaNg 设置里面使用到了 6800 端口,如下图所示: ![](http://image.linkaiblog.top/image-20200808165406672.png) ----- 然后就可以愉快的下载了!但是,这东西好像没啥用处,好像种子文件也下不了。我试着下了个PhotoShop-CC2019,就这网速???还不如我用自己电脑直接下呢。。。。 ![](http://image.linkaiblog.top/image-20200808171146715.png)

阿里云ECS训练营_Day03_微擎的安装与使用

  • 2020-08-08
  • 117
  • 阿里巴巴
阿里云ECS训练营第3天!今天主要在服务器上安装微擎来管理微信公众号。 # 环境说明 CnetOs7,Apache2.4.43,PHP5.3 # 安装微擎 微擎官网文档地址:http://s.w7.cc/store-static-install.html 今天的安装比较简单,跟着文档走就行。 ##### (1)下载微擎的 .zip 压缩包 ##### (2)上传至站点的根目录并解压 - 我的根目录是在这个文件夹下 ![](http://image.linkaiblog.top/image-20200808153504516.png) - 解压 解压之后得到一个 install.php 文件 ```bash unzip WeEngine-Laster-Online.zip ``` ![](http://image.linkaiblog.top/image-20200808151910746.png) ##### (3)地址栏访问 - 根据自己的站点结构,访问 install.php 即可,然后或自动跳转到微擎的登录页面 - 例如我的就是访问 `http://39.98.86.223/install.php` ##### (4) 注册账号并登录 第一次使用的话,要求注册一个账号,然后登录即可。 ![](http://image.linkaiblog.top/image-20200807193535238.png) ##### (5)配置数据库,安装系统 这里数据库用户和名称就填我们的MySql创建的数据库。 ![](http://image.linkaiblog.top/image-20200808152234714.png) ##### (6)设置站点名称和密码 ![](http://image.linkaiblog.top/image-20200808152240122.png) ##### (7)进入应用控制台 ![](http://image.linkaiblog.top/image-20200808152408306.png) - 然后进入应用控制台,个人中心,就可以查看自己站点信息了 ![](http://image.linkaiblog.top/image-20200808153013248.png) ----- 到这里,微擎就基本安装完了,后面就是一些基本的使用了!

阿里云ECS训练营_Day02_MeidaWiki的搭建

  • 2020-08-07
  • 121
  • 阿里巴巴
# 阿里云ECS训练营-Day02-MediaWiki搭建 官网地址:https://www.mediawiki.org/wiki/Download ### 1. 环境搭建 服务器:Centos7 PHP版本:PHP7.4 Apache版本:2.4.43 MySql版本:5.5.62 > 说明 由于 MediaWiki 需要Web服务软件,**PHP7.2.9或更高版本**,同时还需要数据库服务器。 ![](http://image.linkaiblog.top/image-20200807180859554.png) 所以为了方便起见,我们这里直接使用宝塔面板进行安装,这是我的宝塔面板已经安装的软件: ![](http://image.linkaiblog.top/image-20200807190129035.png) ### 2. 下载安装 MediaWiki ##### (1)下载压缩包 进入下载页面(https://www.mediawiki.org/wiki/Download),下载压缩包即可,我这里选择的压缩包版本是 `1.3.42` 下载完之后,按照官网的说法,我们需要将 MediaWiki 解压的 Web服务器的根目录。我们可以在宝塔面板的 `网站` 功能中,创建一个站点,并选择目录为 `/data/wwwroot/default`,这样在外部就可以访问了。**(这样更方便,宝塔面板会帮助我们创建目录结构)** ![](http://image.linkaiblog.top/image-20200807181223792.png) ##### (2) 解压至指定目录 用 xftp 将文件将下载好的压缩包上传至 `/data/wwwroot/default` 然后解压即可。 ```bash tar -zxcf mediawiki-1.34.2.tar.gz ``` 之后再对该根目录赋予权限 ```bash chown -R www /data/wwwroot/default/mediawiki-1.34.2 ``` ![](http://image.linkaiblog.top/image-20200807181615912.png) ##### (3)访问测试 完成上面操作之后,我们可以进入 mediawiki 的根目录,可以看到里面有一个 index.php 文件,这个就是我们要在浏览器中访问的文件。 > 但是,第一次访问出现了下面的问题 ![](http://image.linkaiblog.top/image-20200807125748598.png) 网上查了一些,应该是 php 环境没搭好,还要再安装一个 `fileinfo `的扩展。使用宝塔面板安装完该扩展,**然后在重启 php 服务**,如下所示: ![](http://image.linkaiblog.top/image-20200807125835133.png) 然后刷新页面,如下所示。 ![](http://image.linkaiblog.top/image-20200807155706816.png) 这样就表明你的 MediaWiki 安装好了,后面就是进行配置使用了。 ### 3. 配置使用 MediaWiki ##### (1)选择语言 ![](http://image.linkaiblog.top/image-20200807182148767.png) ##### (2)选择数据库 这个按照自己的喜好选,MySql和SQlite都可以,我这里选择的是 MySql ![](http://image.linkaiblog.top/image-20200807184817138.png) ![](http://image.linkaiblog.top/image-20200807184841951.png) ##### (3)安装配置完成 ![](http://image.linkaiblog.top/image-20200807185424763.png) #####(4)按照提示,将 LocalSettings.php 放在 index.php 同级目录即可 ![](http://image.linkaiblog.top/image-20200807185324314.png) ##### (5)安装配置成功 ![](http://image.linkaiblog.top/image-20200807185424763.png) ------ ok,到这里,MeidaWiki就基本搭建好了!

阿里云ECS训练营_Day01_打造专属云笔记

  • 2020-08-06
  • 203
  • 阿里巴巴
# 阿里云ECS训练营-Day01-打造专属云笔记 ### 前言 **今天是关于使用 VuePress 搭建静态云笔记的,之前对 Node.js 和 Vue 都不太了解,还是尝试去做了。官网文档配合视频简介,对 VuePress 有了一个基本的了解,也复习了一些 Linux 的操作,收获不错。** VuePress官网地址:https://www.vuepress.cn/ ------ > 该系列博客时关于阿里云ESC训练营7天进阶路线对应的博客。 ### 1. 设置安全组 VuePress默认使用8080端口,开放即可 ![](http://image.linkaiblog.top/image-20200806164912644.png) ### 2. 安装Node.js 视频中用的 wget 下载安装包,我这里用的本地下载然后上传到服务器上。 支持yum和npm安装 ---- ##### (1)去 Node.js 官网下载安装包,上传至服务器 压缩包放在 `/tmp` ##### (2)解压 解压到该目录:`/usr/local/lib/nodejs` - 先递归创建目录 ``` mkdir -p /usr/local/lib/nodejs ``` > 问题1 ![](http://image.linkaiblog.top/image-20200806170802207.png) 这个文件是以 `.xz` 为后缀的,而 `z` 参数不适用,应该用 `J` 参数 ![](http://image.linkaiblog.top/image-20200806171014840.png) > 问题2 由于疏忽,未指定目录,应该用 `-C` 指定解压到的目录 ![](http://image.linkaiblog.top/image-20200806171040858.png) ----- 最终的命令: ```bash tar -xJvf node-v12.18.3-linux-x64.tar.xz -C /usr/local/lib/nodejs ``` ##### (3)验证安装是否成功 进入解压后的目录里面的 bin 目录,执行命令 `./node -v`,显示版本号即安装成功 ```bash [root@jacklin bin]# pwd /usr/local/lib/nodejs/node-v12.18.3-linux-x64/bin [root@jacklin bin]# ls node npm npx [root@jacklin bin]# ./node -v v12.18.3 ``` ##### (4)配置环境变量 为了方便,在其他目录下也可以使用node命令,在 `/etc/profile` 后面添加一句 ```bash export PATH=$PATH:/usr/local/lib/nodejs/node-v12.18.3-linux-x64/bin ``` 然后执行 `source /etc/profile`立即生效即可 ### 3. 安装 VuePress ##### (1)使用 npm 安装 官网文档:https://www.vuepress.cn/guide/getting-started.html 这里先使用淘宝的镜像仓库并验证。 ```bash [root@jacklin /]# npm config set registry https://registry.npm.taobao.org [root@jacklin /]# npm config get registry https://registry.npm.taobao.org/ [root@jacklin /]# npm install -g vuepress ``` ![](http://image.linkaiblog.top/image-20200806173614539.png) ##### (2)尝试使用 --> 全局安装 跟着官网走,先简单的尝试一下 ```bash [root@jacklin /]# cd home # 随便进入一个文件夹 [root@jacklin home]# mkdir vuepress-starter # 创建一个项目根目录 [root@jacklin home]# cd vuepress-starter/ [root@jacklin vuepress-starter]# echo 'Hello VuePress ---- By JackLin' > README.md # 编辑文件 [root@jacklin vuepress-starter]# ls README.md [root@jacklin vuepress-starter]# vuepress dev . # 开始写作 wait Extracting site metadata... tip Apply theme @vuepress/theme-default ... tip Apply plugin container (i.e. "vuepress-plugin-container") ... tip Apply plugin @vuepress/register-components (i.e. "@vuepress/plugin-register-components") ... tip Apply plugin @vuepress/active-header-links (i.e. "@vuepress/plugin-active-header-links") ... tip Apply plugin @vuepress/search (i.e. "@vuepress/plugin-search") ... tip Apply plugin @vuepress/nprogress (i.e. "@vuepress/plugin-nprogress") ... ✔ Client Compiled successfully in 7.82s ℹ 「wds」: Project is running at http://0.0.0.0:8080/ ℹ 「wds」: webpack output is served from / ℹ 「wds」: Content not from webpack is served from /home/vuepress-starter/.vuepress/public ℹ 「wds」: 404s will fallback to /index.html success [17:52:33] Build 82f839 finished in 7822 ms! > VuePress dev server listening at http://localhost:8080/ ✔ Client Compiled successfully in 224.24ms success [17:52:33] Build a3f338 finished in 225 ms! ( http://localhost:8080/ ) ``` 注意:此时服务正在运行,进入浏览器查看,可以查看到内容如下所示: ![](http://image.linkaiblog.top/image-20200806181952100.png) 此时的文件目录是这样的: ```bash [root@jacklin vuepress-starter]# ls -al total 12 drwxr-xr-x 2 root root 4096 Aug 6 18:12 . drwxr-xr-x. 13 root root 4096 Aug 6 18:12 .. -rw-r--r-- 1 root root 33 Aug 6 18:12 README.md ``` 然后执行 `vuepress build .` 构建静态文件之后的文件目录是这样的;这个 .vuepress目录是隐藏目录 ```bash [root@jacklin vuepress-starter]# ls -al total 16 drwxr-xr-x 3 root root 4096 Aug 6 18:23 . drwxr-xr-x. 13 root root 4096 Aug 6 18:12 .. -rw-r--r-- 1 root root 33 Aug 6 18:12 README.md drwxr-xr-x 3 root root 4096 Aug 6 18:23 .vuepress [root@jacklin vuepress-starter]# cd .vuepress/ [root@jacklin .vuepress]# ls -al total 12 drwxr-xr-x 3 root root 4096 Aug 6 18:23 . drwxr-xr-x 3 root root 4096 Aug 6 18:23 .. drwxr-xr-x 3 root root 4096 Aug 6 18:23 dist [root@jacklin .vuepress]# cd dist [root@jacklin dist]# ls 404.html assets index.html [root@jacklin dist]# cd assets [root@jacklin assets]# ls css img js ``` ##### (3) 现有项目 ---> 深入了解 刚才只是简单的尝试了一下,现在是在项目中使用 VuePress,用来管理文档。 按照官网的说法,应将 VuePress 安装为本地依赖。那就来呗! 从官网截的目录结构图:**约定优于配置**,所有要遵守他的目录结构 ![](http://image.linkaiblog.top/image-20200806184815522.png) 还有一个是视频中的截图,我们就按照这个目录结构来搭建基本结构吧。 ![](http://image.linkaiblog.top/image-20200806180527253.png) - 创建另一个根目录 ```bash mkdir vuepress-starter2 ``` - 初始化项目 一开始对 Node.js 不是很了解,看了群里大佬们的文章才知道用 `npm init ` 来初始化项目 ```bash npm init -y ``` - 之后再 package.json 中加入下面脚本 ```json { "scripts": { "docs:dev": "vuepress dev docs", "docs:build": "vuepress build docs" } } ``` ![](http://image.linkaiblog.top/image-20200806184608250.png) - 接着创建 docs 目录 ```bash mkdir docs ``` - 在 docs 目录下新建 Markdown 文件 ``` echo '# VuePress 现有项目 ---- by JackLin' > README.md ``` - 在 docs 下面创建 .vuepress 目录,再在 .vuepress 里面创建 public 目录和 config.js 文件 - 退到根目录,执行 `vuepress dev docs`,然后在浏览器访问 ![](http://image.linkaiblog.top/image-20200806190117843.png) 至于后面的如何具体配置,官网应该写了,网上也有文章,我就不重复了。

阿里云AI训练营_Day04_车辆检测系统

  • 2020-06-08
  • 172
  • 阿里巴巴
## 项目介绍 参加阿里云AI训练营的第4天,完成一个车辆检测系统 主要思路:用户上传身份证和受损车辆图片,识别结果返回前端,同时将数据存入数据库。 ## 项目用到文档地址 阿里云达摩院视觉开放平台:https://vision.aliyun.com/ 阿里云视觉开放平台 “车辆损伤识别” 地址:https://help.aliyun.com/document_detail/155002.html?spm=a2c4g.11174283.6.755.77e06bdfN9iMtt ## 项目模块1-各种识别服务 ### (1)说明 一开始的设想是用到身份证识别和车辆识别2个服务,但是发现同时导入 2 个依赖之后,有一些 jar 包会冲突,导致身份证识别的部分由于缺少一些 jar 包而不能正常运行。最后只用到了机动车识别和车辆损伤识别2个服务。 ### (2)导入项目依赖 这里的依赖我们使用较早的版本 ```xml <!-- 内容识别对应依赖 --> <!-- https://mvnrepository.com/artifact/com.aliyun/objectdet --> <dependency> <groupId>com.aliyun</groupId> <artifactId>objectdet</artifactId> <version>0.0.5</version> </dependency> <!-- 图片识别 --> <dependency> <groupId>com.aliyun</groupId> <artifactId>ocr</artifactId> <version>1.0.3</version> </dependency> ``` 之后同样要开通 “目标检测服务” 才能正常运行。 ### (3)创建 Client,Config类 虽然身份证识别部分会报错,但是这里依旧吧身份证识别部分的代码贴出来 > CraService.java ```java @Value("${accessKeyId}") private String accessKeyId; @Value("${accessKeySecret}") private String accessKeySecret; // "内容识别" --> 导入这个类:import com.aliyun.objectdet20191230.Client; private com.aliyun.objectdet.Client objectClient; private com.aliyun.ocr.Client ocrClient; private RuntimeObject runtimeObject; private RuntimeOptions runTimeOperations; @PostConstruct public void initClient() throws Exception { Config objectConfig = new Config(); objectConfig.type = "access_key"; objectConfig.regionId = "cn-shanghai"; objectConfig.accessKeyId = accessKeyId; objectConfig.accessKeySecret = accessKeySecret; // 注意这里的域名,我们是 “内容识别” 服务,所以开头是 objectdet= objectConfig.endpoint = "objectdet.cn-shanghai.aliyuncs.com"; objectClient = new com.aliyun.objectdet.Client(objectConfig); runtimeObject = new RuntimeObject(); com.aliyun.ocr.models.Config ocrConfig = new com.aliyun.ocr.models.Config(); ocrConfig.type = "access_key"; ocrConfig.regionId = "cn-shanghai"; ocrConfig.accessKeyId = accessKeyId; ocrConfig.accessKeySecret = accessKeySecret; // 注意这里的域名,我们是 “内容识别” 服务,所以开头是 objectdet= ocrConfig.endpoint = "ocr.cn-shanghai.aliyuncs.com"; ocrClient = new com.aliyun.ocr.Client(ocrConfig); runTimeOperations = new RuntimeOptions(); } ``` 需要注意的是两个 Client 是不同的包下面的 Client 类,一个是 “内容识别” 的,另一个是 “图像识别” 的。 ### (4)调用关键 API 这里原本调用了3个服务,分别是 “身份证识别”,“机动车识别”,“车辆受损识别”,关键代码如下: ```java // “机动车识别” public String myDetectVehicle(String filePath) throws Exception { DetectVehicleAdvanceRequest request = new DetectVehicleAdvanceRequest(); request.imageURLObject = new FileInputStream(filePath); DetectVehicleResponse response = objectClient.detectVehicleAdvance(request, runtimeObject); String result = null; // 发现这是一个内部类 for (DetectVehicleResponse.DetectVehicleResponseDataDetectObjectInfoList item:response.data.detectObjectInfoList ) { System.out.println(item.type); System.out.println(item.score); if ("vehicle".equals(item.type)) { System.out.println("检测成功!是机动车"); } else { System.out.println("该图片不是机动车!"); } result = item.type; } return result; } // “车辆损伤识别” public String myRecognizeVehicle(String filePath) throws Exception { // 使用 xxxAdvanceRequest,支持本地图片上传 RecognizeVehicleDamageAdvanceRequest request = new RecognizeVehicleDamageAdvanceRequest(); request.imageURLObject = new FileInputStream(filePath); // 识别 “车辆损伤” RecognizeVehicleDamageResponse response = objectClient.recognizeVehicleDamageAdvance(request, runtimeObject); return getHurtResult(response.data.elements); } // “身份证识别” --------> public String MyRecognizeIdCard(String filePath, String side) throws Exception { RecognizeIdentityCardAdvanceRequest request = new RecognizeIdentityCardAdvanceRequest(); request.imageURLObject = Files.newInputStream(Paths.get(filePath)); request.side = side; RecognizeIdentityCardResponse response = ocrClient.recognizeIdentityCardAdvance(request, runTimeOperations); if ("face".equals(side)) { return JSON.toJSONString(response.data.frontResult); } else { return ""; } } ``` ### (5) 车辆损伤补充代码 看文档我们知道,由于车辆损伤有很多种情况,所以我们需要对数据进行一定的处理,思路是通过一个 switch~case 语句区分各种损伤的具体情况。 ![](http://image.linkaiblog.top/image-20200608180242183.png) > 具体代码: ```java // 对 “车辆损伤” 识别出来的数据进行一定的处理,方便前台展示 public String getHurtResult(RecognizeVehicleDamageResponse.RecognizeVehicleDamageResponseDataElements[] items) { StringBuffer type = new StringBuffer("检测到的车辆损伤为:"); for (RecognizeVehicleDamageResponse.RecognizeVehicleDamageResponseDataElements item:items ) { switch (item.type) { case "1": type.append("轻微刮擦 "); break; case "2": type.append("重度刮擦 "); break; case "3": type.append("轻度变形 "); break; case "4": type.append("中度变形 "); break; case "5": type.append("重度变形 "); break; case "6": type.append("crack破损孔洞 "); break; case "7": type.append("翼子板和大灯缝隙 "); break; case "8": type.append("翼子板保险杠缝隙 "); break; case "9": type.append("大灯轻微刮擦 "); break; case "10": type.append("大灯重度刮擦 "); break; case "11": type.append("大灯破损 "); break; case "12": type.append("后视镜轻微刮擦 "); break; case "13": type.append("后视镜玻璃破损 "); break; case "14": type.append("后视镜脱落 "); break; case "15": type.append("挡风玻璃破损 "); break; } } return type.toString(); } ``` ## 项目模块2-图片上传服务,及数据库操作 这部分做的比较简易,没有美化样式,能看就行~就是一个简单的 from 表单 > test.html ```html <form th:action="@{/upload}" enctype="multipart/form-data" method="post"> 身份证:<input type="file" name="identityfile"> 受损车辆:<input type="file" name="carfile"> <input type="submit" value="upload"> </form> ``` ---- 图片上传对应的 Controller,上传完成之后,同时进行识别,然后在将识别输入存入数据库中 > CarController.java ```java @RequestMapping("/upload") public String fileUpload(@RequestParam("carfile") MultipartFile carFile, @RequestParam("identityfile") MultipartFile identityFile, Model model) throws IOException { // 1. 上传图片 ----》 “身份证” String identityPath = aiCarService.fileUpload(identityFile); // 2. 上传图片 -----》 “受损车辆” String carPath = aiCarService.fileUpload(carFile); // 3. 调用 Service 层分析图片 String face = null; String carStr = null; String carStr2 = null; try { // 3.1 身份证识别 ---> 只需要识别正面 // face = carService.MyRecognizeIdCard(identityPath , "face"); // 3.2 机动车检查 carStr = aiCarService.myDetectVehicle(carPath); // 3.3 车辆损伤识别 carStr2 = aiCarService.myRecognizeVehicle(carPath); } catch (Exception e) { e.printStackTrace(); } // 4. 保存数据到数据库中 Car car = new Car(null, carStr, carStr2); carService.insert(car); // 4. 将图片路径放入 Model 中 String carFileName = carFile.getOriginalFilename(); String identityFileName = identityFile.getOriginalFilename(); model.addAttribute("carfilename", "/upload/" + carFileName); model.addAttribute("identityfilename", "/upload/" + identityFileName); model.addAttribute("face", face); if ("vehicle".equals(carStr)) { model.addAttribute("carStr", "检测成功!是机动车"); } else { model.addAttribute("carStr", "您上传的图片不是机动车,请重新上传!!"); } model.addAttribute("carStr2", carStr2); return "result"; } ``` 对应的 Service > CarService.java ```java /** * @Description: 图片上传服务 * @Param: [file] * @return: void * @Author: 林凯 * @Date: 2020/6/8 */ public String fileUpload(MultipartFile file) { // 1. 获取文件名 String uploadFileName = file.getOriginalFilename(); // 2. 上传路径保存设置 UUID String path = "src/main/resources/static/upload"; // 2.1 如果路径不存在,创建一个 File realPath = new File(path); if (!realPath.exists()){ realPath.mkdir(); } // 3. 上传文件,并保存 InputStream is = null; //文件输入流 OutputStream os = null; try { is = file.getInputStream(); os = new FileOutputStream(new File(realPath, uploadFileName)); int len = 0; byte[] buffer = new byte[1024]; while ((len = is.read(buffer)) != -1) { os.write(buffer, 0, len); os.flush(); } } catch (IOException e) { e.printStackTrace(); } finally { try { os.close(); } catch (IOException e) { e.printStackTrace(); } try { is.close(); } catch (IOException e) { e.printStackTrace(); } } return path + "\\" + uploadFileName; } ``` 返回结果给前端,前端的处理部分 > result.html ```html <img th:src="${carfilename}" alt=""> <img th:src="${identityfilename}" alt=""> <p th:text="${carStr}"></p> <p th:text="${carStr2}"></p> ``` ## 测试效果 首先进入上传图片页面,并上传2张图片 ![](http://image.linkaiblog.top/image-20200608185634408.png) 然后点击 upload 上传并查看结果: ![](http://image.linkaiblog.top/image-20200608190502181.png) 数据库里面的结果: ![](http://image.linkaiblog.top/image-20200608190901927.png) ## 阿里云高校计划 最后在贴一张阿里云的广告:”阿里云高校计划“,快来加入我们吧! ![](http://image.linkaiblog.top/image-20200606222043666.png)