共计 4469 个字符,预计需要花费 12 分钟才能阅读完成。
在Java Web开发过程中,不免会遇到图片上传的场景,下面的是我的代码:
@PostMapping("/fileUpload")
public List<Map<String, String>> fileUpload(@RequestParam(value = "file") MultipartFile file, HttpServletRequest request) {
// 原始文件名
String fileName = file.getOriginalFilename();
assert fileName != null;
// 获取后缀名
String suffixName = fileName.substring(fileName.lastIndexOf("."));
// 上传后的临时存储的路径
String filePath = request.getSession().getServletContext().getRealPath("blogImages");
// 生成一个新文件名
fileName = UUID.randomUUID() + suffixName;
// 每一天生成生成日期目录,方便管理
String fileAdd = new SimpleDateFormat("yyyyMMdd").format(new Date());
//获取文件夹路径
filePath = filePath + File.separator + fileAdd + File.separator;
log.info("path:{}", filePath);
File dest = new File(filePath + "/" + fileName);
// 先判断文件是否存在
if (!dest.getParentFile().exists()) {
boolean mkdirs = dest.getParentFile().mkdirs();
}
String src = dest.getAbsolutePath();
//根据自己系统的resource 目录所在位置进行自行配置 F:\IdeaProjects\blog\src\main\resources\static\images\blogImages
String destDir = System.getProperty("user.dir") + File.separator + "src" + File.separator + "main" + File.separator + "resources" + File.separator + "static" + File.separator + "images" + File.separator + "blogImages" + File.separator + fileAdd + File.separator;
File destFile = new File(destDir + fileName);
try {
file.transferTo(dest);
if (!destFile.getParentFile().exists()) {
boolean mkdirs = dest.getParentFile().mkdirs();
}
copyFile(src, destDir, fileName);
} catch (IOException e) {
e.printStackTrace();
}
String imageSrc = "/static/blogImages/" + fileAdd + "/" + fileName;
log.info("imageSrc:{}", imageSrc);
List<Map<String, String>> result = new ArrayList<>();
Map<String, String> map = new HashMap<>();
map.put("imageSrcValue", prefixRequestUrl + imageSrc);
map.put("imageSrc", prefixRequestUrl + imageSrc);
result.add(map);
return result;
}
1.第一个问题是这个虚拟路径,在tomcat上部署的项目获取到的是webapps下面
// 上传后的临时存储的路径
String filePath = request.getSession().getServletContext().getRealPath("blogImages");
2.tomcat在项目重新部署是会先将webapps下面全部清空,然后解压war包重新启动,此时之前的图片资源就会丢失
重新部署之前:
我的图片资源文件夹blogImages是存在的;
重新部署之后:
我的图片资源文件夹blogImages不存在了;
解决方案
第一步
我的代码中增加了逻辑,在图片上传临时路径后,有一处新的copy方法
/**
* 文件复制
*
* @param src
* @param destDir
* @param fileName
* @throws IOException
*/
public void copyFile(String src, String destDir, String fileName) throws IOException {
FileInputStream in = new FileInputStream(src);
File fileDir = new File(destDir);
if (!fileDir.isDirectory()) {
fileDir.mkdirs();
}
File file = new File(fileDir, fileName);
if (!file.exists()) {
file.createNewFile();
}
FileOutputStream out = new FileOutputStream(file);
int c;
byte buffer[] = new byte[1024];
while ((c = in.read(buffer)) != -1) {
for (int i = 0; i < c; i++) {
out.write(buffer[i]);
}
}
in.close();
out.close();
}
把上传的图片重新拷贝一份到服务器本地磁盘路径上:
//根据自己系统的resource 目录所在位置进行自行配置 F:\IdeaProjects\blog\src\main\resources\static\images\blogImages
String destDir = System.getProperty("user.dir") + File.separator + "src" + File.separator + "main" + File.separator + "resources" + File.separator + "static" + File.separator + "images" + File.separator + "blogImages" + File.separator + fileAdd + File.separator;
File destFile = new File(destDir + fileName);
运行之后在我的tomcat目录下面会出现以下我配置的路径(可以视具体情况配置):
root@ab9d09eef062:/usr/local/tomcat/src/main/resources/static/images/blogImages# pwd
# 如下就是部署之后存放图片资源的磁盘路径(后面配置会用到)
/usr/local/tomcat/src/main/resources/static/images/blogImages
root@ab9d09eef062:/usr/local/tomcat/src/main/resources/static/images/blogImages#
第二步
找到tomcat配置目录
root@ab9d09eef062:/usr/local/tomcat# cd conf/
root@ab9d09eef062:/usr/local/tomcat/conf# ls -l
total 236
drwxr-s--- 3 root root 4096 Dec 23 00:06 Catalina
-rw-r--r-- 1 root root 13132 Dec 23 00:04 catalina.policy
-rw-r--r-- 1 root root 7468 Dec 23 00:04 catalina.properties
-rw-r--r-- 1 root root 1493 Jan 1 11:24 context.xml
-rw-r--r-- 1 root root 1172 Dec 23 00:04 jaspic-providers.xml
-rw-r--r-- 1 root root 2365 Dec 23 00:04 jaspic-providers.xsd
-rw-r--r-- 1 root root 2971 Dec 23 00:05 logging.properties
-rw-r--r-- 1 root root 7896 Jan 2 17:48 server.xml
-rw-r--r-- 1 root root 2208 Dec 23 00:04 tomcat-users.xml
-rw-r--r-- 1 root root 2617 Dec 23 00:04 tomcat-users.xsd
-rw-r--r-- 1 root root 177096 Dec 23 00:04 web.xml
修改server.xml文件
root@ab9d09eef062:/usr/local/tomcat/conf# vim server.xml
<!--找到<Host>标签 -->
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<!--增加<Context>标签 配置如下:docBase服务器上存储图片的具体路径(上文有提到)path浏览器访问图片的路径,reloadable可不配置默认即可 我的图片资源目录即为blogImages -->
<Context docBase="/usr/local/tomcat/src/main/resources/static/images/blogImages" path="/myBlog/static/blogImages" reloadable="true"/>
<!-- 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" />
</Host>
大功告成,重启tomcat即可
正文完