基于若依开发的项目发布在Linux上面遇到的问题汇总
上传文件失败问题
现象:
出现FileNotFoundException
,检查路径可得知文件的根路径错误,那个路径前缀/tmp/tomcat........
。
原因:
若依的上传文件方法限制。
修正:
yml配置存储资源路径时,需要使用“/”不能使用“\”。
如下配置:
# 项目相关配置
ruoyi:
# 名称
name: RuoYi
# 版本
version: 3.4.0
# 版权年份
copyrightYear: 2019
# 实例演示开关
demoEnabled: true
# 文件路径
profile: /opt/static/
# 获取ip地址开关
addressEnabled: true
图片回显不成功问题
现象:
服务器已经成功将文件上传,且能够能够找到图片并能够正常打开,但是却不能通过url正常访问。
原因:
若依ResourcesConfig类将上传路径的url写死了。
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry)
{
/** 文件上传路径 */
registry.addResourceHandler("/profile/**").addResourceLocations("file:" + Global.getProfile());
/** swagger配置 */
registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
}
修正:
- 上传时将url路径拼接成http://localhost/profile/。这样在访问资源的时,就可以通过这一条规则映射到上传文件路径。
- 将registry.addResourceHandler("/profile/**")里面的路径通过字符串进行拼接,使其和数据库存的图片url保持一致。(拼接和存储在数据库字段需要保持一致)
删除不成功问题
现象:
在windows系统中能够正常删除的方法,但是在Linux里面就不再好使。会提示文件找不到的异常。
原因:
这是因为创建File对象时,路径错误。Java虽然是跨平台的语言,但是如果编码写死了,那跨平台就是不可能的事情。
修正:
将拼接好的路径,需要调用该语句
String result = path.replaceAll("/",File.separator);
file.separator这个代表系统目录中的间隔符,说白了就是斜线,不过有时候需要双线,有时候是单线,你用这个静态变量就解决兼容问题了。
而且当路径错误时,常常会出现以相对路径创建文件对象,这样也会导致找不到文件的异常发生。
File fDir=new File(File.separator); //File.separator表示根目录
File file = new File(fDir,result);
通过这样创建就能够保证是以绝对路径创建文件。
下面是我的删除文件api,可以参考。
public static AjaxResult deleteFile(String key) throws Exception {
//获取上传文件路径
String uploadPath = Global.getUploadPath();
System.out.println("上传文件路径:"+uploadPath);
//测试参数
key = key.replace(REPLACE_STR,"");
key = uploadPath+key;
//将/改为\,实现跨平台
key = key.replaceAll("/",File.separator);
System.out.println("key:"+key);
File fDir=new File(File.separator); //File.separator表示根目录,比如现在就表示在D盘下。
File file = new File(fDir,key);
System.out.println("绝对路径:"+file.getAbsoluteFile());
//文件存在
if (file.exists()){
//文件
if (file.isFile()){
//删除是否成功
if (file.delete()){
return AjaxResult.success();
}else {
throw new Exception("删除文件失败");
// return AjaxResult.error("删除文件失败!联系管理员");
}
}else {
throw new Exception("只能删除文件");
// return AjaxResult.error("只能删除文件!");
}
}else {
throw new Exception("文件不存在!");
// return AjaxResult.error("文件不存在!",null);
}
}
因为这是在公司发布项目的时候遇到的问题,在遇到问题的时候没有及时将bug登记下来。而是发布成功以后,才回忆和记录,这样导致很多现象只能通过口头描述,缺少直观的感觉,十分抱歉。