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

news2024/9/29 9:29:03

图片上传和静态资源映射

  • 编写controller层接口
  • 上传到文件夹相关配置
    • 1 application.properties配置文件:
    • 2 Constant类:
  • 文件的资源映射
    • 配置WebMvcConfigurer的继承类
  • 注意
  • 测试

编写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请求路径:
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/339217.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java笔记-volatile和AtomicInteger

目录1. volatile1.1.什么是volatile1.2.JMM-Java内存模型2 验证volatile的特性2.1 可见性2.2.验证volatile不保证原子性2.3 volatile实现禁止指令重排序3.使用AtomicInteger解决volatile的不能实现原子性的问题3.2 AtomicInteger的方法说明:3.3 CAS3.4 应用1. volat…

linux-进程1-进程概述

写在最前 记录一下linux的进程学习专题 1. 程序和进程的区别 1.1 程序 程序是包含一系列信息的文件,这些信息描述了如何在运行时创建一个进程: 二进制格式标识:每个程序文件都包含用于描述可执行文件格式的元信息。内核利用此信息来解 释文…

Redis实战-session共享之修改登录拦截器

在上一篇中Redis实战之session共享,我们知道了通过Redis实现session共享了,那么token怎么续命呢?怎么刷新用户呢?本来咱们就通过拦截器来实现这两个功能。 登录拦截器优化: 先来看看现在拦截器情况: 拦截…

JavaScipt基础学习(1)

1. JavaScript特点 JavaScript是脚本编写语言;所有主流浏览器都支持JavaScript;JavaScript基于对象语言;JavaScriptb变量类型是弱类型,没有如Java一样严格的数据类型;变量是弱类型的。因此定义变量时,只使…

WindowsServer服务器系列:部署FTP文件服务

1、点击“开始”菜单,选择“服务器管理器” 2、在接下来弹出页面中选择“添加角色和功能” 3、接下来点击“下一步” 4、接下来选择“基于角色或基于功能的安装”并点击“下一步” 5、选择“从服务器池中选择服务器”并点击“下一步” 6、接下来选中“Web 服务器(II…

【数模比赛】2023美国大学生数学建模比赛(思路、代码......)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

虚拟存储管理(6)

虚拟存储管理 前面介绍的存储管理方案要求作业全部装入内存才可运行。但这会出现两种情况: 有的作业因太大,内存装不下而无法运行。系统中作业数太多,因系统容量有限只能让少数作业先运行。 1 局部性原理 定义: 程序执行时&a…

TCP网络编程中connect()、listen()和accept()三者之间的关系

基于 TCP 的网络编程开发分为服务器端和客户端两部分,常见的核心步骤和流程如下: connect()函数 对于客户端的 connect() 函数,该函数的功能为客户端主动连接服务器,建立连接是通过三次握手,而这个连接的过程是由内核…

LeetCode题目笔记——24. 两两交换链表中的节点

文章目录题目描述题目链接题目难度——中等方法一:迭代代码/C代码/python方法二:递归代码/C总结题目描述 或许这也是个经典的面试题,记录一手 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在…

模电学习6. 常用的三极管放大电路

模电学习6. 常用的三极管放大电路一、判断三极管的工作状态1. 正偏与反偏的概念2. 工作状态的简单判断二、三种重要的放大电路1. 共射电路2. 共集电极放大电路3. 共基极放大电路一、判断三极管的工作状态 1. 正偏与反偏的概念 晶体管分P区和N区, 当P区电压大于N区…

[设计模式] 建造者模式

文章目录什么是建造者模式建造者模式建造者模式中的角色UML类图代码实现建造者模式与工厂模式的区别什么是建造者模式 建造者模式(Builder Pattern)是一种创建型的设计模式,它将一个复杂对象的构建与它的表示分离,也就是复杂的构建隐藏起来,…

即时通讯系列-4-如何设计写扩散下的同步协议方案

1. 背景信息 上篇提到了, IM协议层是主要解决会话和消息的同步, 在实现上, 以推模式为主, 拉模式为辅. 本文Agenda: (How)如何同步(How)如何设计同步位点如何设计 Gap过大(SyncGapOverflow) 机制如何设计Ack机制总结 提示: 本系列文章不会单纯的给出结论, 希望能够分享的是&…

SpringCloud-Netflix学习笔记13——Zuul路由网关

什么是Zuul? Zuul包含了对请求的路由和过滤两个最主要的功能。 其中路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础,而过滤器功能则负责对请求的处理过程进行干预,是实现请求校验,服务聚合等功能…

最详细教你注册 ChatGPT,不会来找我

超强人工智能 ChatGPT 震撼来袭,它是美国人工智能研究实验室 OpenAI 新推出的一种自然语言处理工具,不想来体验一下嘛!最详细教程手把手教你注册,不会来找我! 准备工作 一个可以科学上网的工具,提供非 Ch…

文献阅读笔记 # CodeBERT: A Pre-Trained Model for Programming and Natural Languages

《CodeBERT: A Pre-Trained Model for Programming and Natural Languages》EMNLP 2020 (CCF-B)作者主要是来自哈工大、中山大学的 MSRA 实习生和 MSRA、哈工大的研究员。资源:code | pdf相关资源:RoBERTa-base | CodeNN词汇: bimodal: 双模态…

嵌入式设备搭建NFS环境(服务器/客户端、源码下载编译、文件系统适配、内核适配)

1、什么是nfs (1)NFS(Network File System)是网络文件系统,能让使用者访问网络上别处的文件就像在使用自己的计算机一样; (2)NFS是基于UDP/IP协议的应用,其实现主要是采用远程过程调用RPC机制,RPC提供了一组与机器、操作系统以及低…

CAS详解.

CAS这个机制就给实现线程安全版本的代码,提供了一个新的思路,之前通过加锁,把多个指令打包成整体,来实现线程安全。现在就可以考虑直接基与CAS来实现一些修改操作,也能保证线程安全(不需要加锁)…

OpenAi-chatgpt注册保姆级全网最详细注册教程2023年2月最新-

废话就不多说了,说多了浪费各位师傅的时间!直接冲,在开始之前需要科学上网,就没其他要求了 1、访问https://chat.openai.com/auth/login 2、点击sign up,输入账号密码,点击Continue 3、之后会来到登陆页面&#xff0…

Oracle Dataguard(主库为 Oracle rac 集群)配置教程(03)—— 创建 dataguard 数据库之前的准备工作

Oracle Dataguard(主库为 Oracle rac 集群)配置教程(03)—— 创建 dataguard 数据库之前的准备工作 / 本专栏详细讲解 Oracle Dataguard(Oracle 版本为11g,主库为双节点 Oracle rac 集群)的配置…

云计算|OpenStack|错误记录和解决方案(不定时更新)

前言: openstack的部署和使用是难度比较大的,难免会出现各种各样的问题,因此,本文将把一些在部署和使用openstack社区版时出现的错误做一个记录,并就每一个错误分析和解决问题。(尽量记录比较经典的错误&a…