SpringBoot中图片上传在Linux服务器部署路径找不到

  • Post author:
  • Post category:linux




SpringBoot中图片上传在Linux服务器部署找不到的问题


说明

在Windows部署是, 写的默认指定盘符(C), 这种方法在Linux部署时是不可行的, 所以要将路径改成相对路径, windows部署路径就在所部属的盘符, linux部署路径就在根路径。



一 配置WebMvcConfig

@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
    @Autowired
    private AccessLimtInterceptor accessLimtInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(accessLimtInterceptor);
        super.addInterceptors(registry);
    }

    @Value("/jiuqi/upload/")
    private String imagePath;

    @Value("/upload/")
    private String upload;

    /**
     * @param registry
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        //addResourceHandler()里配置需要映射的文件夹
        //addResourceLocations()配置文件夹在系统中的路径,使用绝对路径,格式为“file:你的路径”  
        //registry.addResourceHandler(upload + "**").addResourceLocations("file:C:\\jiuqi\\upload\\");
        registry.addResourceHandler(upload + "**").addResourceLocations("file:" + imagePath);
    }
}

这里将

addResourceLocations("file:C:\\jiuqi\\upload\\")

指的是将图片保存到指定的

C

改成

addResourceLocations("file:" + imagePath)

这样可以理解为保存在文件运行的更目录下,

Windows

运行保存在项目运行的盘符目录下,

Linux

运行保存在根目录下。



二 编写uploadController

引入一个图片处理依赖

Thumbnailator

<!-- https://mvnrepository.com/artifact/org.tinygroup/org.tinygroup.thumbnails -->
<dependency>
    <groupId>net.coobird</groupId>
    <artifactId>thumbnailator</artifactId>
    <version>0.4.14</version>
</dependency>


思路:


(1)

首先获取图片: xxx.jpg


(2)

将图片重命名并且加上图片原有的后缀: xx-xx-xx.jpg


(3)

将图片保存在固定目录中: /jiuqi/upload/xx-xx-xx.jpg


(4)

最后返回服务器IP+端口号+目录(反射的目录)+图片名称: http://localhost:8080/upload/xx-xx-xx.jpg


注意:

(3)中/jiuqi/upload/是物理真实路径

(4)中/upload是反射的虚拟路径

//配置图片保存的路径
@Value("/jiuqi/upload")
private String folder;

//配置图片反射
@Value("/upload/")
private String uploadPath;

//文章图片的上传
@PostMapping("/blogs/imgUpload")
@ResponseBody
public FileInfo imageUpload(HttpServletRequest request, @RequestParam(value = "editormd-image-file", required = false) MultipartFile file) throws IOException {

    /**
         * filename 图片名
         * basePath  服务器IP加端口号
         * simpleUUID 图片重命名
         * photoName 图片重命名加后缀
         * fileNamePath 图片加保存的路径
         * fileUrl 图片的链接地址
         */
    String filename, basePath, simpleUUID, photoName, fileNamePath, fileUrl;

    if (file != null && !file.isEmpty()) {
        //获取文件名
        filename = file.getOriginalFilename();
        //获取协议号
        basePath = request.getScheme()
            + "://"
            + request.getServerName()//获取IP地址
            + ":"
            + request.getServerPort()//获取端口号
            + request.getContextPath();//获取工程路径

        String[] split = filename.split("\\.");

        //只接受jpg、png、gif、jpeg、bmp、webp文件
        if ("jpg".equalsIgnoreCase(split[1]) ||
            "png".equalsIgnoreCase(split[1]) ||
            "gif".equalsIgnoreCase(split[1]) ||
            "jpeg".equalsIgnoreCase(split[1]) ||
            "bmp".equalsIgnoreCase(split[1]) ||
            "webp".equalsIgnoreCase(split[1])) {

            simpleUUID = IdUtil.simpleUUID();
            photoName = simpleUUID + "." + split[1];
            
            fileNamePath = folder + File.separator + photoName;
            File destFile = new File(fileNamePath);
            判断是否存在, 不存在就创建
            if (!destFile.getParentFile().exists()) {
                destFile.getParentFile().mkdirs();
            }
            //压缩图片并保存
            Thumbnails.of(file.getInputStream()).scale(0.8).toFile(destFile);
            fileUrl = basePath + uploadPath + photoName;

            return new FileInfo(1, "上传成功", fileUrl);
        }
    }
    return null;
}

最后返回是一个实体类

FileInfo

@Data
@AllArgsConstructor
@NoArgsConstructor
public class FileInfo {
    private int success = 1;
    private String message = "上传成功";
    private String url;
}



版权声明:本文为qq_46036214原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。