java-springboot实现图片的上传

我们在resources目录下创建image目录来存放上传的图片 

 

service层懒的写,就都写controller层了。


@RestController
@RequestMapping("/upload")
public class upload {

    @PostMapping("/pic")
    public String upLoad(@RequestParam("multipartFile")MultipartFile multipartFile) {
        //判断图片是否存在
        if (multipartFile.isEmpty()) {
            return null;
        }
        //图片的新名字,使用uuid为了图片名字的唯一性,防止重名
        String name = UUID.randomUUID().toString().replace("-","");
        /*
         * 获取上传图片的后缀
         * multipartFile.getOriginalFilename()获取图片名字
         * 例如:图片名字是picture.png,最后type会等于.png
         * substring和lastIndexOf都是String的方法,不会自己搜
         */
        String type = multipartFile.getOriginalFilename().
                substring(multipartFile.getOriginalFilename().lastIndexOf('.'));

        //保存图片的路径,我们存放在resources下static下的image
        String value = "src/main/resources/static/image/";
        //创建文件
        File file = new File(value+name+type);
        try {
            //transferTo 图片复制
            multipartFile.transferTo(file);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return file.getAbsolutePath();
    }
}

我们使用postman传照片。

结果报错了,明显我们要保存的路径是不对的,为什么,因为 multipartFile 要的是绝对路径,不是相对路径,如果是相对路径的话,他不会在你相对路径前面添加你项目的路径,而是tomcat的路径,因此我们修改一下。 

修改后:

@RestController
@RequestMapping("/upload")
public class upload {

    @PostMapping("/pic")
    public String upLoad(@RequestParam("multipartFile")MultipartFile multipartFile) {
        //判断图片是否存在
        if (multipartFile.isEmpty()) {
            return null;
        }
        //图片的新名字,使用uuid为了图片名字的唯一性,防止重名
        String name = UUID.randomUUID().toString().replace("-","");
        /*
         * 获取上传图片的后缀
         * multipartFile.getOriginalFilename()获取图片名字,例如:picture.png
         * substring和lastIndexOf都是String的方法,不会自己搜
         */
        String type = multipartFile.getOriginalFilename().
                substring(multipartFile.getOriginalFilename().lastIndexOf('.'));

        //保存图片的路径,我们存放在resources下static下的image
        //修改后的代码
        String value = "D:/code/picture/src/main/resources/static/image/";
        //创建文件
        File file = new File(value+name+type);
        try {
            //transferTo 图片复制
            multipartFile.transferTo(file);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return file.getAbsolutePath();
    }
}

我们再使用postman上传 

结果对了:我们的目录出现了上传的图片



一般照片的访问路径是要保存到数据库,然后前端根据路径找到照片的。

@RestController
@RequestMapping("/upload")
public class upload {

    @PostMapping("/pic")
    public String upLoad(@RequestParam("multipartFile")MultipartFile multipartFile) {
        //判断图片是否存在
        if (multipartFile.isEmpty()) {
            return null;
        }
        //图片的新名字,使用uuid为了图片名字的唯一性,防止重名
        String name = UUID.randomUUID().toString().replace("-","");
        /*
         * 获取上传图片的后缀
         * multipartFile.getOriginalFilename()获取图片名字,例如:picture.png
         * substring和lastIndexOf都是String的方法,不会自己搜
         */
        String type = multipartFile.getOriginalFilename().
                substring(multipartFile.getOriginalFilename().lastIndexOf('.'));

        //保存图片的路径,我们存放在resources下static下的image
        String value = "D:/code/picture/src/main/resources/static/image/";
        //创建文件
        File file = new File(value+name+type);
        try {
            //transferTo 图片复制
            multipartFile.transferTo(file);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        

        //在数据库保存照片的访问路径,数据库懒得建,就没写。
        // 打印程序的 IP 地址、端口号和照片路径
        //这里获取ip地址和端口号有高级写法,自己搜。但是我这么写也没毛病。
        String photoUrl = "http://" + "127.0.0.1" + ":" + "8080" + "/image/" + file.getName();
        System.out.println(photoUrl);

        return file.getAbsolutePath();
    }
}

 我们浏览器是能访问到的。


 如果你的程序要部署到云服务器上,那绝对路径和照片的url是要更改的

        // 使用 System 类的 getProperty() 方法获取用户的当前工作目录
        // 如果路径是这个D:/code/picture/src/main/resources/static/image/
        // userDir 会是 D:\code\picture
        String userDir = System.getProperty("user.dir");
        //保存图片的路径,我们存放在resources下static下的image
        String value = userDir + "\\src\\main\\resources\\static\\image\\";
      //这要写你的云服务器的ip
      String ip = "127.0.0.1";
      //你程序的端口号
      String port = "8080";
      String photoUrl = "http://" + ip + ":" + port + "/image/" + file.getName();
      //保存到你的数据库

完整代码:

@RestController
@RequestMapping("/upload")
public class upload {

    @PostMapping("/pic")
    public String upLoad(@RequestParam("multipartFile")MultipartFile multipartFile) {
        //判断图片是否存在
        if (multipartFile.isEmpty()) {
            return null;
        }
        //图片的新名字,使用uuid为了图片名字的唯一性,防止重名
        String name = UUID.randomUUID().toString().replace("-","");
        /*
         * 获取上传图片的后缀
         * multipartFile.getOriginalFilename()获取图片名字,例如:picture.png
         * substring和lastIndexOf都是String的方法,不会自己搜
         */
        String type = multipartFile.getOriginalFilename().
                substring(multipartFile.getOriginalFilename().lastIndexOf('.'));


        // 使用 System 类的 getProperty() 方法获取用户的当前工作目录
        // 如果路径是这个D:/code/picture/src/main/resources/static/image/
        // userDir 会是 D:\code\picture
        String userDir = System.getProperty("user.dir");
        //保存图片的路径,我们存放在resources下static下的image
        String value = userDir + "\\src\\main\\resources\\static\\image\\";
        //创建文件
        File file = new File(value+name+type);
        try {
            //transferTo 图片复制
            multipartFile.transferTo(file);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        //在数据库保存照片的访问路径,数据库懒得建,就没写。
        // 打印程序的 IP 地址、端口号和照片路径
        //这里获取ip地址和端口号有高级写法,自己搜。但是我这么写也没毛病。
        //这要写你的云服务器的ip
        String ip = "127.0.0.1";
        //你程序的端口号
        String port = "8080";
        String photoUrl = "http://" + ip + ":" + port + "/image/" + file.getName();
        System.out.println(photoUrl);

        return file.getAbsolutePath();
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

EPSON推出的实时时钟模块RX8130CE功耗低至300nA、从容应对各种使用场景

随着科技的进步和消费者需求的不断变化,笔记本电脑市场继续展现出强劲的发展势头一方面移动性和轻薄性成为主流,另外一方面性能在不断提升,功能也日益丰富。实时时钟模组,作为提供时间和定时功能的单元模块,是笔记本电…

esp单片机下arduino_gfx不相干显示驱动优化对flash空间的占用对比

一般情况下,很多esp32或者esp8266下的tft模块驱动都会包含很多种,而我们只需要其中一种,那就有个疑问这些被编译进的显示驱动到底占用了多少空间,是否需要把他优化掉? 这是默认的驱动列表: 84个文件&…

“选项按钮”的妙用

背景:是否厌倦了下拉菜单?现在可以使用更好玩的选项按钮了。 操作:点击“开发工具”,插入“选项按钮”的窗体控件。 插入一个选项按钮以后,右键“设置控件格式”,设定单元格链接,比如说本次设定…

投影变形的在线查看工具

投影变形的在线查看工具 地图投影是将地球椭球面转换到平面上的过程。不同的地图投影方式会导致不同类型和程度的变形。如何去了解这种变形? ESRI开发过一个投影变换工具,可以在线展示各个投影坐标系的变形情况。通过选择data-wkid,可以在网…

k8s系列之十七 Istio中的服务治理

删除前面配置的目的地规则 [rootk8s-master ~]# kubectl delete destinationrule details destinationrule.networking.istio.io "details" deleted [rootk8s-master ~]# kubectl delete destinationrule productpage destinationrule.networking.istio.io "pr…

掌握ES6的箭头函数:深入了解其实用性与规则

引言 ES6(ECMAScript 2015)引入了箭头函数,这是一种新的函数声明方式,它改变了我们编写JavaScript代码的方式。箭头函数提供了更简洁、更直观的语法,并且具有一些独特的特性和行为。本文将深入探讨箭头函数的规则、用…

常见sql面试题

昨天朋友发来一个面试题,心血来潮自己写了下,废话不多说,直接上图和答案 这里是2张表,A表studenta,学号student,name姓名,年龄age B表scoreb 流水号id ,课程course,学号…

学点儿Java_Day11_异常

1 异常概念、异常分类 ArrayIndexOutofBoundsException 数组下标越界异常 NullPointerException 空指针异常 StringIndexOutofBoundsException 字符串下标越界异常 ArithmeticException 算数异常/0 ClassCastException没法强制转换 大部分以able结尾的一般都是接口&#xff0…

Docker安装配置

1. 安装docker-ce sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum -y install docker-ce sudo systemctl enable docker 2. 设置代理 参照:https://docs.docker.com/config/daemon/systemd/#httpht…

计算机网络:物理层 - 编码与调制

计算机网络:物理层 - 编码与调制 基本概念编码不归零制编码归零制编码曼彻斯特编码差分曼彻斯特编码 调制调幅调频调相混合调制 基本概念 在计算机网络中,计算机需要处理和传输用户的文字、图片、音频和视频,他们可以统称为消息数据&#xf…

【JavaScript】面试手撕深拷贝

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 引入深拷贝的作用深浅拷贝的区别浅拷贝深拷贝 深拷贝实现方式JSON.parse(JSON.s…

求两个单链表的差集

归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍 收藏⭐ 留言​📝 但行前路,不负韶华&#…

基于SSM作业提交与批改

基于SSM作业提交与批改的设计与实现 摘要 社会的进步导致人们对于学习的追求永不止境,那么追求学习的方式也从单一的书本教程变成了多样化的学习方式。多样化的学习方式不仅仅是需要人们智慧的依靠,还需要能够通过软件的加持进行信息化的价值体现。软件…

VMware下建立CentOS 7

1.点击新建虚拟机 2.下一步 3.选择号安装程序光盘映像文件位置,下一步 4.选择版本和操作系统然后下一步 5.编辑虚拟机名称并选择安装位置,然后下一步 6.设置最大磁盘大小,下一步 7.点击完成 8.点击编辑虚拟机设置 9.将此虚拟机内存设置为2G&a…

DevSecOps平台架构系列-亚马逊云AWS DevSecOps平台架构

目录 一、概述 二、AWS DevSecOps实施原则 2.1 尽早采用安全测试,加速问题反馈 2.2 优先考虑预防性安全控制 2.3 部署检测性安全控制时,确保有与之互补的响应性安全控制 2.4 安全自动化 2.5 总结 三、AWS DevSecOps关键组件 3.1 关键组件 3.2 关…

Div2 D. Effects of Anti Pimples

解题思路 将由小到大排序若不考虑绿色的情况则为最大值的情况为,即选择在它之前的点对于同时选,会被统计贡献时考虑考虑绿色,对于每个,若选则均选对于每个预处理出,记作对由小到大排序为答案的情况为 …

Codigger用户篇:安全、稳定、高效的运行环境(一)

在当今数字化时代,个人数据的安全与隐私保护显得尤为重要。为了满足用户对数据信息的安全需求,我们推出Codigger分布式操作系统,它提供了一个运行私有应用程序的平台,旨在为用户提供一个安全、稳定、高效的私人应用运行环境。Codi…

基于Weibull、Beta、Normal分布的风、光、负荷场景生成及K-means场景削减方法

目录 一、主要内容: 二、代码运行效果: 三、Weibull分布与风机风速: 四、Beta分布与光伏辐照度: 五、Normal分布与电负荷: 六、K-means聚类算法: 七、完整代码数据下载: 一、主要内容&am…

STM32技术打造:智能考勤打卡系统 | 刷卡式上下班签到自动化解决方案

文章目录 一、简易刷卡式打卡考勤系统(一)功能简介原理图设计程序设计 哔哩哔哩: https://www.bilibili.com/video/BV1NZ421Y79W/?spm_id_from333.999.0.0&vd_sourcee5082ef80535e952b2a4301746491be0 一、简易刷卡式打卡考勤系统 &…

系列学习前端之第 6 章:一文掌握 jQuery(熟悉即可)

前言:为什么说 jQuery 熟悉即可,已日渐过时? 作为前端开发中常用的两个库或框架:Vue.js 和 jQuery。不少开发者想要学习 Vue.js 时,都会有一个疑惑:学习 Vue.js 是否一定要学习 jQuery? 从几个…