为什么项目里上传的图片要存放在所部署的linux服务器目录下,而不是直接放在java项目里的静态目录下(webapp)?
因为当项目运行时把图片上传到java项目中静态目录下时,上传文件存储在了项目的target目录下,当项目下次重新部署时,需要把target目录下的上传的文件拷贝出来,重新加到项目里,这样就比较麻烦,万一把tomcat中webapps下的项目文件夹删除了,之前项目中上传的图片就丢了。
上传图片放在linux服务器目录下的好处:
项目重新部署时,不需要向之前一样把target目录下的图片文件夹拷贝出来,而是直接部署即可,因为图片上传在了项目所部署的linux服务器目录下。
线上linux服务器tomcat配置具体步骤:
1.在tomcat的<Host>标签下配置
<Context path="/static" docBase="/home/application" reloadable="false"></Context>
2.在java项目properties配置文件中文件上传路径为 signatureDir = /home/application,可以通过java代码在上传路径后面再拼接文件夹。
3.数据库中存放的是相对路径/static/2021/01/123.png,以tomcat中server.xml中配置的<Context>标签下的path="/static"开头(其中2021 01 都是文件夹)
4.前端读取图片时img的src="/static/2021/01/123.png"(其中2021 01 都是文件夹)
说明:图片路径映射方式是-> ip:8080/static会找到linux服务器下的文件夹/home/application,然后再找到/home/application下的两个文件夹2021和01,最后找到图片123.png。
本地测试时,tomcat配置的<Context>标签如下:
<Context path="/static" docBase="D:\develop" reloadable="false"></Context>
本地测试时java项目properties配置文件中文件上传路径为 signatureDir = D:\\develop
其他都相同,部分java代码仅供理解上文(*-*)
byte[] resultBytes = Base64.decode(base64);
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
String format = sdf.format(date);
String[] splits = format.split("-");
//获取图片存储路径
String userfilesBaseDir = signatureDir;
//根据年、月新建yyyy文件夹,MM文件夹
//获取UUID,做图片名称
String UUID = IdGen.uuid();
//绝对路径,通过文件流生成图片
String absPath=userfilesBaseDir+"/"+splits[0]+"/"+splits[1];
String picFilePath =absPath+"/"+ UUID+".png";
//相对路径,存入数据库
String relaPath="/static/"+splits[0]+"/"+splits[1]+"/"+UUID+".png";
File filePath =new File(absPath);
boolean flag=true;
//文件夹不存在,则创建
if(!filePath.exists()){
flag =filePath.mkdirs();
}
//文件夹创建失败则抛出异常
if(!flag){
throw new RuntimeException("***");
}
try {
FileOutputStream out = new FileOutputStream(picFilePath);
out.write(resultBytes);
out.close();
}catch (IOException e) {
e.printStackTrace();
}
参考文章:1.tomcat搭建图片服务器