SpringBoot图片上传和访问路径映射

编写controller层接口

@ApiOperation("图片上传功能")
    @PostMapping("/admin/upload/file")
    public ApiRestResponse upload(HttpServletRequest httpServletRequest,
                                  @RequestParam("file") MultipartFile file) {
        String fileName = file.getOriginalFilename();
        //获取文件后缀
        String suffixName = fileName.substring(fileName.lastIndexOf("."));
        //生成文件名称UUID
        UUID uuid = UUID.randomUUID();
        //得到文件全名字
        String newFileName = uuid.toString() + suffixName;
        //创建文件
        //获取文件夹地址
        File fileDirectory = new File(Constant.FILE_UPLOAD_DIR);
        //文件地址
        File destFile = new File(Constant.FILE_UPLOAD_DIR +  newFileName);
        //文件夹不存在,就先创建文件夹
        if (!fileDirectory.exists()) {
            //如果文件夹创建失败就抛异常(fileDirectory.mkdir())
            if (!fileDirectory.mkdir()) {
                throw new ImoocMallException(ImoocMallExceptionEnum.MKDIR_FAILED);
            }
        }
        //到这,文件夹就肯定存在了。。
        try {
            //文件写入  file-->destFile
            //这样就把http传入的文件file写入指定的路径下的destFile文件中,完成了文件上传
            file.transferTo(destFile);
        } catch (IOException e) {
            e.printStackTrace();
        }
        //完成文件上传后,还需要指定http资源映射
        try {
            return ApiRestResponse
                    .success(getHost(new URI(httpServletRequest.getRequestURL() + "")) + "/images/"
                            + newFileName);
        } catch (URISyntaxException e) {
            return ApiRestResponse.error(ImoocMallExceptionEnum.UPLOAD_FAILED);
        }
    }

    //获取当前的ip和端口号
    private URI getHost(URI uri) {
        URI effectiveURI;
        try {
            effectiveURI = new URI(uri.getScheme(), uri.getUserInfo(), uri.getHost(), uri.getPort(),
                    null, null, null);
        } catch (URISyntaxException e) {
            effectiveURI = null;
        }
        return effectiveURI;
    }

上传到文件夹相关配置

1 application.properties配置文件:

配置上传文件的位置
在这里插入图片描述
这是错误的(最后少了/)
改为:
在这里插入图片描述
不然最后资源映射找不到。。。。。

在这里插入图片描述

2 Constant类:

对于静态属性的注入Spring方法
(注意静态属性的注入方法)
在这里插入图片描述

数据获取的流程:
Constant类通过file.upload.dir获取application.properties配置文件的地址,并注入到spring容器,然后controller层直接取数据:
在这里插入图片描述

文件的资源映射

我们需要把上传到服务器指定文件夹的文件(图片)能通过http请求显示出来。
如果不映射就无法访问上传的资源图片,如下
在这里插入图片描述

就是把资源的地址(文件的在计算机中的路径)和http请求进行绑定。
(静态资源映射)

配置WebMvcConfigurer的继承类

在这里插入图片描述

package com.imooc.mall.config;

import com.imooc.mall.common.Constant;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * 描述:     配置地址映射
 */
@Configuration
public class ImoocMallWebMvcConfig implements WebMvcConfigurer {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        //图片的资源映射
        registry.addResourceHandler("/images/**").addResourceLocations(
                "file:"+Constant.FILE_UPLOAD_DIR);
        registry.addResourceHandler("swagger-ui.html").addResourceLocations(
                "classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**").addResourceLocations(
                "classpath:/META-INF/resources/webjars/");
    }
}

前面是的http映射地址,后面是资源的文件地址。

注意

文件上传后,返回的http路径
在这里插入图片描述
配置WebMvcConfigurer的继承类中的http路径
在这里插入图片描述
应该要对应一致。。

以便通过返回的http路径可以直接请求到资源路径。。。

测试

先上传图片
在这里插入图片描述

关于postman上传图片失败的问题:见我这篇博文
在这里插入图片描述

在这里插入图片描述
返回的http请求路径:
在这里插入图片描述
在这里插入图片描述

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
SpringBoot 是一个开源的 JavaEE(Java Enterprise Edition)轻量级应用程序框架,它提供了很多便捷的功能,其中包括上传文件的功能。在 SpringBoot 中,上传文件时通常需要设置文件上传的虚拟路径(Virtual Path)。 虚拟路径是指相对于应用程序的根目录的一个虚拟目录。其作用是将不同的物理路径映射到同一个虚拟路径下,从而使得服务器端能够统一管理不同的文件。这样一来,所有的文件可以通过同一个URL地址来访问,并且可以方便地实现访问权限管理。 在 SpringBoot 中,我们通常使用文件上传组件来上传文件,如 CommonsMultipartResolver 组件或 Spring Boot 内置的 MultipartAutoConfiguration 组件。在使用这些组件时,我们需要在 application.properties 或 application.yml 文件中设置上传文件的路径,也就是虚拟路径。通常情况下,我们可以将上传的文件放在应用程序的 resources 目录下,并将其在配置文件中设置为虚拟路径。例如: # application.properties 文件配置 spring.servlet.multipart.location=classpath:/resources/upload/ 在这个例子中,我们设置了上传文件的虚拟路径为 /upload/,而实际上上传的文件会被存储在应用程序的 classpath:/resources/upload/ 目录下。这样一来,当我们需要访问上传的文件时,只需要通过 /upload/xxx 文件路径即可。同时,在代码中,我们可以通过 ResourceUtils.getFile("classpath:upload/xxx") 来获取上传的文件。 总之,SpringBoot 中的文件上传功能是非常方便和灵活的,只需要设置虚拟路径即可实现文件上传和访问功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值