目录
一、前言
完成课设的过程中,需要实现图片的上传下传显示功能,使用的是elementUI中的upload组件来完成上传图片的功能,为了实现组内可以进行图片接口共享,需要把这一功能部署到服务器上面,且图片的存储与虚拟路径映射都应在服务器上完成,这样才能实现这一接口的不同主机共享
需要环境:
· 云服务器 装载windows server系统(这里使用的是阿里云服务器,高校学生免费版)
· Tomcat8.5(常见版本均可差异不大)
· IntelliJ
二、服务器端配置
(多图预警)
1.阿里云服务器上的操作系统
在阿里云控制台里面可以实现一键切换操作系统,没有选择linux是因为windows的界面更加熟悉一些,操作起来方便点,远程桌面连接可以直接使用win10自带的远程桌面连接工具,比阿里云控制台的网页端远程连接操作方便而且快捷的多
2. Tomcat8.5的安装
首先,windows server是比较纯净的操作系统,不包含任何运行库环境或者开发环境,所以需要手动安装jdk与jre并配置好环境变量才可以正常使用tomcat,需要注意的地方是jre和jdk不可以在同一目录下,会发生错误!这点请注意,笔者就是没有注意安在了同一目录下,又费了周折才配置好的java环境,不会配置的小伙伴,这里贴上一篇详细的配置教程(没想到吧是百度经验):
https://jingyan.baidu.com/article/6dad5075d1dc40a123e36ea3.html
配置好后如下图所示
之后就可以进行tomcat的安装了,需要注意的是,不可以直接将本地的tomcat打包传送过来,需要在访问tomcat的官网:
http://tomcat.apache.org/index.html
下载自己使用版本的安装包,再在服务器上运行安装包进行tomcat的安装,直接使用本地打包的tomcat的话,注册表文件没有注入,相应的server端的功能也会失去,无法正常运行tomcat,安装成功后大概是这个样子的
3. Tomcat端口配置
需要注意的是,安装tomcat后不进行远程连接配置的话,其他主机也是无法访问到tomcat上部署的服务的,需要在安装路径下修改server.xml文件(用记事本打开就可以),将其中的默认端口8080修改为80(访问无需加上端口号)或者任何自定义的端口号
此外对于图片的访问,我们需要在这里配置一行虚拟路径
<!-- Access log processes all example.
Documentation at: /docs/config/valve.html
Note: The pattern used is equivalent to using pattern="common" -->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
<Context path="/houseImg" docBase="C:\Program Files\MySQL\houseImg" reloadable="true" />
<!--path是配置的要映射的路径 docBase为本地路径-->
建议这里的存放路径不要放在tomcat的webapps中的应用里,因为在你创建web服务时,在tomcat上的每次部署都会重新生成一个war包,你之前的路径或者测试用的存储文件都会被清理掉,放在一个其他位置就好,另外这里没有对域名作出配置,有需要的小伙伴可以自行配置域名代替ip地址访问。这里我们在服务器上测试一下配置后的结果,启动tomcat后,我们输入刚才配置的路径与实际文件组成的url测试一下。
到这里,tomcat的配置与图片文件的路径映射就完成了,在数据库中只需要存储图片的虚拟路径就可以访问图片了,但是对于服务器外,仍然无法访问tomcat,因为服务器还需要特别配置连接端口,在阿里云服务器上,就是要设置实例的安全组策略。
至此,服务器端的配置就算完成啦,我们可以用自己的电脑访问一下刚才的图片网址测试一下是否完成。
三、Apache-cxf框架搭建web服务
1.Maven项目创建
需要特别注意的是,maven需要特别配置自己本地安装的maven文件,setting文件,才能保证文件目录结构的合理生成,否则需要自己手动添加,下面是正常生成的项目文件目录。
2.图片操作方法类的实现
要做的事情其实很简单,就是将传输过来的图片存储到本地,还要能给出访问它的路径,由于笔者做的项目当中,图片是采用base64编码传输的,还需要一点点额外的操作,就是对编码的解译,将其转换为文件存储,下面是实际操作类,实现了存储,删除,返回路径的功能,解码译码的方法是参照下面链接的教程完成的:
https://blog.csdn.net/luanpeng825485697/article/details/78242083
// Pegessi 2020.4.15
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
public class ImageStore {
static BASE64Decoder decoder = new BASE64Decoder(); // 解码
static BASE64Encoder encoder = new BASE64Encoder(); // 编码
private String path = "C://Program Files/MySQL/houseImg/"; // 要与tomcat的配置路径一致
public String base64ToImage(String base64String, String fileName, String houseID) {
// base64转换为图片 接收的base64编码不需要带表头
try {
String newpath = houseID+"/";
byte[] bytes1 = decoder.decodeBuffer(base64String);
ByteArrayInputStream bais = new ByteArrayInputStream(bytes1);
BufferedImage bi1 = ImageIO.read(bais);
File direct = new File(this.path+newpath);
if (!direct.exists()){
direct.mkdir();
}
File f1 = new File(this.path+newpath+fileName);
ImageIO.write(bi1, "jpg", f1);
return "success";
} catch (IOException e) {
e.printStackTrace();
return "error";
}
}
public String imageToBase64(String fileName) {
// 图片转换为base64编码 转换出的base64也没有表头
String packPath = fileName.substring(0,6);
File f = new File(this.path+packPath+fileName);
try {
BufferedImage bi = ImageIO.read(f);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(bi, "jpg", baos);
byte[] bytes = baos.toByteArray();
return encoder.encodeBuffer(bytes).trim();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
public String selectUrl(String fileName, String houseID){
// 返回存储图片的路径
String port = "http://39.98.**.**:2233/"; // 要与刚才设置的端口一致,服务器ip+端口
String path = "houseImg/"+houseID+"/"+fileName; // 这里是刚才设置的路径,可以自行修改
return port+path;
}
public String delImg(String fileName, String houseID){
// 删除文件 就是根据路径删除本地文件
String fullPath = path+houseID+"/"+fileName;
File file = new File(fullPath);
if (!file.isDirectory()) {
file.delete();
return "success";
}
return "fail";
}
public ImageStore(){}
}
3.web服务发布
实体类完成后,我们就可以着手将其发布成web服务了,由于我们需要的都是后端的操作,都使用的是java语句,因此选择apache-cxf框架来发布web服务,这部分比较简单,具体的使用这里就不再赘述了,简洁的invoke函数就可以调用。
需要注意的是endpointInterface是你的接口类的位置,serviceName是你要发布的服务名,细心设置好。
然后配置好本地的tomcat,部署在本地的tomcat上得到一个war包。
这个war包就是我们发布的服务啦,接下来将其传输到服务器上安装的tomcat中的webapps目录下就可以,需要注意的是如果自己导入了额外的jar包,需要将jar包同样复制到服务器端Tomcat的lib目录下,才能正常发布服务。
然后启动服务器端的tomcat就可以啦
然后我们可以测试一下刚刚发布的web服务是否成功了,我们可以直接访问服务的wsdl文档查看服务是否发布成功
至此,windows sever2019 + tomcat + 图片存储的功能就完成啦。
有问题的小伙伴欢迎在评论区留言,阿里云服务器是高校学生免费半年的,可以满足自己大部分学习的需求,使用起来也比较方便,管理什么的都有专门的教程指导~