如何解决SpringBoot集成百度UEditor图片上传后直接访问404
作者:编程小白 发布时间:2022-03-03 19:27:13
SpringBoot项目上传图片一般是上传至远程服务器存储,开发过程中可能会上传至当前项目的某个静态目录中,此时就会遇到这个问题,文件在上传之后直接访问并不能被访问到,必须重新加载项目。
首先分析一下原因:
我们知道,如果使用类似 /upload/image/1.jpg 这种格式进行图片的访问的时候,SpringBoot读取的并不是本项目中直接的静态目录,而是在进行编译的时候生成target目录下的文件,如下图所示:
那么问题就来了,我们在运行的过程中上传一个图片的话,并不能重新加载当前这个项目,也就是target目录下的文件一直是之前的文件,尽管有人说我进行了SpringBoot热部署(dev-tools),能够自动重新加载项目,但是问题是热部署也需要一定的时间去分析和重新加载项目,所以上传文件后直接进行访问肯定就不能实现了。
简单来说:文件只是单纯的上传到项目的文件夹中,并没有在target目录下生成对应的文件,导致访问不到。
在网上看了一个博客,说可以在将文件复制到本地的时候也将文件复制到项目的target目录下,这样就可以访问了,听着也非常的有道理,但是实践出真知,经过我的测试,并不能实现,不知道是因为我的问题还是什么,所以并不推荐大家使用这个方法,当然感兴趣的也可以测试一下,毕竟这个听着是真的很有道理。
解决办法:配置映射路径 * ,将虚拟路径映射为真是图片地址,达到回显的目的(已测试,有效)
简单来说就是将UEditor要访问的路径映射成为本地的路径,废话不多说直接上代码:
注:SpringBoot1版本是extends WebMvcConfigurerAdapter类,SpringBoot2版本是implements WebMvcConfigurer,这个地方有点不一样
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry){
registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
registry.addResourceHandler("/static/ueditor/**").addResourceLocations("classpath:/static/ueditor/");
registry.addResourceHandler("/public/**").addResourceLocations("classpath:/public/");
registry.addResourceHandler("/static/upload/image/**").addResourceLocations("file:" + UploadUtils.getImgDirFile().getAbsolutePath() + "/"); //添加这一行
}
UploadUtils.java
public class UploadUtils {
// 项目根路径下的目录 -- SpringBoot static 目录相当于是根路径下(SpringBoot 默认)
public final static String IMG_PATH_PREFIX = "static/upload/image";
public static File getImgDirFile(){
// 构建上传文件的存放 "文件夹" 路径
String fileDirPath = new String("src/main/resources/" + IMG_PATH_PREFIX);
File fileDir = new File(fileDirPath);
if(!fileDir.exists()){
// 递归生成文件夹
fileDir.mkdirs();
}
return fileDir;
}
}
重点在于getAbsolutePath()方法,这个函数的作用是获取当前项目在当前运行环境下的绝对路径,如我现在在开发过程中获得的结果就是D:\WorkSpace\IDEA-WorkSpace\......
设置完毕之后就可以正常显示了。
注:如果你所使用的是SpringBoot多模块项目,那么通过这个方法获取到的往往是父项目所在的地址,因此也会出现问题,解决这个问题的办法是配置当前项目启动类的工作环境是在具体的某个项目
设置完毕后即可解决这个问题
附:之前在说这个问题的时候,也有人给我提了一个建议,就是不将图片放置在项目中,而是放置在某个固定的盘符中,这样返回请求路径的时候直接请求本地地址,等将来发布到服务器的时候使用Nginx。
不过问题是我对Nginx并不是很了解,所以等我学会了Nginx之后再来完善吧,你们可以先替我试试好不好用
来源:https://www.cnblogs.com/guo-xu/p/11823848.html


猜你喜欢
- maven简介及优势 maven是一个项目构建和管理的工具,提供了帮助管理 构建、文档、报告
- 今天,我们接着讲微信支付的系列教程,前面,我们讲了这个微信红包和扫码支付。现在,我们讲讲这个公众号支付。公众号支付的应用环境常见的用户通过公
- 介绍Apache Kafka 是分布式发布-订阅消息系统,在 kafka官网上对 kafka 的定义:一个分布式发布-订阅消息传递系统。 它
- 区别一如果Mybatis Plus是扳手,那Mybatis Generator就是生产扳手的工厂。通俗来讲——MyBatis:一种操作数据库
- 本文实例讲述了C#计算字符串哈希值(MD5、SHA)的方法。分享给大家供大家参考。具体如下:一、关于本文本文中是一个类库,包括下面几个函数:
- 好问题。答案就是这篇文章的题目所建议的,这是一种合理的设计。在这种情况下,newInstance()方法是一种“静态工厂方法",让
- 1. 自动化装配介绍Spring Boot针对mvc做了大量封装,简化开发者的使用,内部是如何管理资源配置,Bean配置,环境变量配置以及启
- 1、冒泡排序排序原理:相邻两个元素比较,如果前者比后者大,则交换两个元素。每执行一次,都会确定一个最大值,其位置就固定了,下一次就不需要再参
- using System;using System.Collections.Generic;using System.Linq; using
- Unity3D UGUI Text得分数字增加 代码一、首先在Hierarchy中创建Text,并绑定脚本。using UnityEngin
- 熔断与降级为什么在RPC环节中有熔断以及降级的需求,详细的原因这里不多解释,从网上搜索一张图做示意。熔断我理解熔段主要解决如下几个问题:当所
- 淘宝物流信息TimeLine的制作方法:仿照的TimeLine效果图: 代码实现:package com.zms.timelineview;
- 先上一张效果图using UnityEngine;using System.Collections;public class TestRot
- 引言前边两章说了点基础的,从这章开始,我们挖挖源码。看看RocketMQ是怎么工作的。首先呢,这个生产者就是送孩子去码头的家长,孩子们呢,就
- 拿到了项目框架工程代码却没有uml图,那么方法之间的调用关系功能流转就不容易看出来,那么如何产生类图呢,记忆里方法有下:1.rose逆向工程
- 1.1、Web Service基本概念Web Service也叫XML Web Service WebService是一种可以接收从Inte
- 文章来源:aspcn 作者:孙雯服务器Sockets列表9.2是一个服务器应用程序的一部分.列表9.2 一个简单的服务器程序 /** &n
- 一、管理网络状态使用网络进行数据通信前,需要先获取网络状态。使用ConnectivityManager获取网络状态步骤:1.获取Connec
- textField用于文本输入,它提供了很多属性:const TextField({ ... TextEditi
- 新建多国语言包要在android studio项目中新建多国语言包,有两种方式,一种是手动建,一种是用使用android studio辅助建