SpringBoot项目上传图片(本地/OSS)

这篇具有很好参考价值的文章主要介绍了SpringBoot项目上传图片(本地/OSS)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

SpringBoot项目图片上传

图片上传到本地

可参考视频:

【springboot上传图片的两种方式详解(本地/OSS对象存储)】 https://www.bilibili.com/video/BV1TK411Z7ad/?share_source=copy_web&vd_source=7f0416c71bcbaf44e08ad58367e3f198

视频前十分钟是从0开始编写图片保存到本地,可以照着视频敲出来,不想看也可以直接复制我下面的代码

  • Resources目录下有一个upload.html文件,和一个static文件夹,static下又有一个images文件夹,如下图

    SpringBoot项目上传图片(本地/OSS)

upload.html

  • upload.html

    这里主要就是一个form表单,用来提交数据,但是要注意的是我这个表单用了postenctype=“multipart/form-data”,以及input的类型是file

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>上传图片</title>
    </head>
    <body>
    <form action="/uplaod" method="post" enctype="multipart/form-data">
        <input type="file" name="file" value="请选择你要上传的图片">
        <input type="submit" value="上传">
    </form>
    </body>
    </html>
    

controller

  • UploadController

    想直接看源码的同学可以跳过分析,往下滑

    为了方便演示,我把业务都放在controller,,首先我们要先分析文件上传有几步

    1. 文件校验(包括但不限于,图片的大小、图片的类型、图片是否为空、上传的是否是文件等)

      • 我这里只做了一个判空的校验,可以自己加需要的校验
      if (file.isEmpty()) {
          return "图片上传失败";
      }
      
    2. 将图片重命名,图片重命名又可分为以下几步

      • 获取原来文件的后缀名,可以使用file.getOriginalFilename()获取原来的文件名

        String originalFilename = file.getOriginalFilename(); //原来的图片名
        
      • 生成一个随机的新文件名,这里可以使用UUID.randomUUID()

        String uuid = UUID.randomUUID().toString().replace("-", "");
        
      • 把新名称和原后缀名拼接起来作为新的文件名

        String fileName = uuid + ext;
        
    3. 把图片上传的指定的目录下,我们这里讲的是Resources,就以Resources为例

      • new ApplicationHome(this.getClass())可以获取当前程序运行的路径

        ApplicationHome applicationHome = new ApplicationHome(this.getClass());
        
      • 我们知道Java程序都是运行的.class字节码文件,所以getDir()获取文件夹位置其实是.class字节码文件的位置,需要使用getParentFile()两次回到项目的主程序目录

        applicationHome.getDir().getParentFile().getParentFile().getAbsolutePath()
        
      • 获取到主目录的绝对路径拼接上从这里到Resources下的images

        String pre = applicationHome.getDir().getParentFile().getParentFile().getAbsolutePath() +
                "\\src\\main\\resources\\static\\images\\";
        
      • 最后通过file.transferTo(new File(path));把文件上传到Resources下的images目录,并且返回一个url地址

        String path = pre + fileName;
        

    完整controller代码:

    @RestController
    public class UploadController {
    
        @PostMapping("/uplaod")
        public String upload(MultipartFile file) {
            //图片校验(图片是否为空,图片大小,上传的是不是图片、图片类型(例如只能上传png)等等)
            if (file.isEmpty()) {
                return "图片上传失败";
            }
            //可以自己加一点校验 例如上传的是不是图片或者上传的文件是不是png格式等等 这里省略
            //获取原来的文件名和后缀
            String originalFilename = file.getOriginalFilename();
    //        String ext = "." + FilenameUtils.getExtension(orgFileName); --需要导依赖
            String ext = "."+ originalFilename.split("\\.")[1];
            //生成一个新的文件名(以防有重复的名字存在导致被覆盖)
            String uuid = UUID.randomUUID().toString().replace("-", "");
            String newName = uuid + ext;
            //拼接图片上传的路径 url+图片名
            ApplicationHome applicationHome = new ApplicationHome(this.getClass());
            String pre = applicationHome.getDir().getParentFile().getParentFile().getAbsolutePath() + "\\src\\main\\resources\\static\\images\\";
            String path = pre + newName;
            try {
                file.transferTo(new File(path));
            } catch (IOException e) {
                e.printStackTrace();
            }
            return path;
        }
    }
    

注意:

这里截取后缀名我为了代码简洁,直接链式调用获取[1]索引位置的后缀,但是这样不太好,可以获取分割出来的字符串数组的最后一个元素

运行

  • 启动Spring Boot项目

  • 访问 http://localhost:8080/upload.html 路径,在浏览器打开upload.html

    SpringBoot项目上传图片(本地/OSS)

  • 选择上传的图片,点击上传

  • 上传成功后,浏览器返回保存后的绝对路径(这里我为了容易看懂返回的是绝对路径,一般项目中用到的其实是相对路径),如果图片上传失败,浏览器会显示图片上传失败的提示信息

    SpringBoot项目上传图片(本地/OSS)

  • 图片上传完成之后,我们可以到项目中的==/images==目录下查看,如果图片存在就说明我们已经成功的将图片上传到我们的项目中了

    SpringBoot项目上传图片(本地/OSS)

  • 同样,我们可以到浏览器访问这张图片

    SpringBoot项目上传图片(本地/OSS)

  • 一般项目中其实并不会到这一步就结束,而是将这个图片的路径保存到数据库,但是我这里就不继续往下演示了

将图片上传到本地的功能也实现了,有需要的同学可以继续往下看OSS对象存储

OSS对象存储

SpringBoot项目上传图片(本地/OSS)
在分布式项目中,通常一个项目中会用到很多服务器,如果我们还像单体项目中将文件/图片上传到本地,而下一次访问的时候,如果我们访问的服务器不是上一次保存的服务器的话,我们就访问不到自己上传的数据,这显然不是我们希望的,这时候我们就用到OSS对象存储

  1. 首先你需要一个阿里云OSS对象存储

    创建Bucket

    • 名称:随便起
    • 地域:想你的服务器在哪就选哪个(也是随便选)
    • 存储类型:标准存储
    • 冗余存储:关闭
    • 版本控制:关闭
    • 读写权限:公共读写

    SpringBoot项目上传图片(本地/OSS)

    具体流程可以参考视频:

    【springboot上传图片的两种方式详解(本地/OSS对象存储)】 https://www.bilibili.com/video/BV1TK411Z7ad/?share_source=copy_web&vd_source=7f0416c71bcbaf44e08ad58367e3f198

    这个视频从11分钟开始讲的是OSS对象存储,照着视频做一样可以实现,另外本篇博客也是基于该视频

  2. 代码

    • 导入依赖

      <dependency>
          <groupId>com.aliyun.oss</groupId>
          <artifactId>aliyun-sdk-oss</artifactId>
          <version>3.15.0</version>
      </dependency>
      <dependency>
          <groupId>commons-io</groupId>
          <artifactId>commons-io</artifactId>
          <version>2.4</version>
      </dependency>
      <dependency>
          <groupId>commons-beanutils</groupId>
          <artifactId>commons-beanutils</artifactId>
          <version>1.9.3</version>
      </dependency>
      
    • 新建一个工具类UploadUtil在util包下

      1. 需要到阿里云官网获取几个参数

        • 阿里域名(开头加https://,结尾加/,这个不能漏)

        • 地域节点(开头加http://,一样不能少)

          SpringBoot项目上传图片(本地/OSS)

        • accessKeyId

        • accessKeySecret

          SpringBoot项目上传图片(本地/OSS)

      2. 生成一个新的文件名

      3. 使用OSS客户端对象上传图片返回url

      UploadUtil

      public class UploadUtil {
          //域名(开头需要https://,结尾要/)
          public static final String ALI_DOMAIN = "https://你的阿里云域名/";
      
          public static String uploadImg(MultipartFile file) throws Exception {
              //生成的文件名
              String uuid = UUID.randomUUID().toString().replace("-", "");
              String originalFilename = file.getOriginalFilename();
              String ext = "." + FilenameUtils.getExtension(originalFilename);
              String fileName = uuid + ext;
              //地域节点(开头需要http://)
              String endpoint = "你的地域节点";
              String accessKeyId = "你的accessKeyId";
              String accessKeySecret = "你的accessKeySecret";
              //OSS客户端对象
              OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
              ossClient.putObject(
                      "你的仓库名", //仓库名
                      fileName, //文件名
                      file.getInputStream()
                      );
              ossClient.shutdown();
              return ALI_DOMAIN + fileName;
          }
      }
      

      controller

      @PostMapping("/upImg")
      public String upImg(MultipartFile file) throws IOException {
          return UploadUtil.uploadImage(file);
      }
      

      upload.html

      <form action="/upImg" method="post" enctype="multipart/form-data">
          <input type="file" name="file" value="上传图片">
          <input type="submit" value="上传">
      </form>
      
    • 测试方法和本地运行一致

    • 上传成功后可以讲路径复制到浏览器访问,也可以打开阿里云官网OSS对象存储查看上传的图片

可能会遇到的问题

如何搭建spring boot项目

搭建一个spring boot项目

  • pom.xml导入web依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
  • 编写启动类
@SpringBootApplication
public class Run {
    public static void main(String[] args) {
        SpringApplication.run(Run.class, args);
    }
}

如何使用Postman测试文件上传

如果要使用postman测试,可以不用写html页面

Params上加上Content-Type=multipart/form-data,Body中选择form-data
SpringBoot项目上传图片(本地/OSS)

SpringBoot项目上传图片(本地/OSS)文章来源地址https://www.toymoban.com/news/detail-413119.html

到了这里,关于SpringBoot项目上传图片(本地/OSS)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 若依OSS如何支持本地上传,保存到服务器本地?

    SysOssController改动: ISysOssService改动: SysOssServiceImpl 改动: OssClient改动: windows配置: linux配置: 记得修改your.domain:8080为你自己服务器的接口ip或域名和端口。 数据示例:

    2024年04月16日
    浏览(39)
  • 【Node】腾讯云OSS存储上传图片

    目录 准备工作 后端Koa 前端Vue 建议 购买腾讯云OSS存储后需要获得以下几个变量 SecretId:秘钥id SecretKey:秘钥 Bucket:存储桶名称 可在腾讯云的图像界面创建存储桶 Region:购买时选择的区域 我这里是南京 prefix:可选 腾讯云中自定义的文件夹名称 我这里是indexImages 后端项目中

    2024年02月07日
    浏览(49)
  • JAVA开发(腾讯云OSS图片上传)

    需求背景: 项目中需要上传图片。 存储方式: 使用腾讯云的OSS组件。 代码实现: 1、使用腾讯云OSS需要使用的参数信息: OSS的域名; OSS的地域节点; OSS存储桶的名称; OSS权限凭证; OSS权限访问秘钥; OSS图片存储策略; 使用的缩略图策略; 允许上传的图片类型; 参数

    2024年02月11日
    浏览(53)
  • 【flutter直接上传图片到阿里云OSS】

    flutter直接上传文件到阿里云需要获取凭证,通过调用阿里云获取凭证的接口能拿到下面这些参数 获取凭证的接口一般是后台去对接阿里云,前端调后台接口即可。(STS.的这种AccessKeyId安全性高一些) 1.获取OSSToken信息 token信息实体类 上传方法 调用方式 以上直接是上传图片到

    2024年02月11日
    浏览(40)
  • 使用Mavon-Editor编辑器上传本地图片到又拍云云存储(Vue+SpringBoot)

    需求:将本地的图片上传到服务器或者云存储中,考虑之后,这里我选的是上传到又拍云云存储。 原理:Mavon-Editor编辑器有两个重要的属性和事件 所以需要将用到Mavon-Editor编辑器的组件中添加上这个属性和事件。 然后在方法中定义imgAdd函数 代码片段: 其中请求路径是你自

    2024年02月12日
    浏览(55)
  • Spring Boot 实现文件本地以及OSS上传

    Maven依赖 封装工具类 上面的代码我们可以定义一个工具类,这样在任何需要文件上传的地方只需要调用 upload 方法即可,大大减少了代码量 使用工具类

    2024年03月08日
    浏览(46)
  • java实现上传图片或视频到oss中

    当上传图片和视频到OSS时,你可以使用阿里云的Java SDK来实现。以下是一个示例的Java代码,包括图片和视频的上传功能: 在上述代码中,你需要替换以下变量的值: ACCESS_KEY_ID和ACCESS_KEY_SECRET:阿里云的访问密钥,可以在阿里云控制台获取。 BUCKET_NAME:OSS存储桶的名称。 IMA

    2024年02月07日
    浏览(38)
  • Vue中实现图片上传,上传后的图片回显,存储图片到服务器 【使用对象存储OSS】

    前言 以下只提供一种思路,对新手可能不太友好。 这里将前端Vue上传的图片直接存储到服务器上, Alibaba Cloud OSS : 阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。您可以在任何应用、任何时间、任何地点存储

    2024年02月06日
    浏览(74)
  • SpringBoot项目中前后端对图片的上传与接收操作

    在一个在线图片分享系统中,前端使用JS+jQuery,后端使用Maven管理项目,采用分层次目录结构(Controller、Service、Mapper等)的一个Java语言编写的SSM(Spring+SpringBoot+Mybatis)项目中,需要实现一个前端标签上传图片,后端Controller层接收并处理图片。 上传图片的方式有很多,可以

    2024年02月09日
    浏览(39)
  • JAVA通过阿里云OSS存储实现图片上传功能

    首先我们需要在阿里云注册账号,实名认证后开通OSS功能,点击进入OSS功能的管理平台 进入概览页面后,点击Bucket列表,创建一个Bucket(相当于一个存放文件的文件夹)  关键是要获得下面几个关键的信息,只有拥有这些信息才能连接上这个Bucket进行操作: 添加对应依赖  

    2024年02月05日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包