首页 > 其他分享 >Springboot本地+oss存储文件上传

Springboot本地+oss存储文件上传

时间:2024-05-29 23:00:19浏览次数:20  
标签:文件 Springboot filePath oss fileUploadResult 上传 String

一、本地上传

二、oss上传


一:本地上传

废话不多说直接搂代码

html:

<body>
<form method="post" enctype="multipart/form-data" id="form">
    <input type="file" name="xxx" id="xxx">
</form>
<input type="button" value="提交" onclick="btn()">
<script src="/jquery-3.5.1.js"></script>
<script>
    /**
     * 提交文件到服务器的函数
     * 无参数
     * 无返回值
     */
    function btn() {
        // 获取文件输入元素的第一个文件
        var file = $("#xxx")[0].files[0];
        // 创建FormData对象用于存放文件数据
        var formData = new FormData();
        // 将文件添加到formData中
        formData.append("xxx",file)
 
        // 使用jQuery的ajax方法提交文件
        $.ajax({
            url:"/test/upload", // 上传的URL
            type:"post", // 请求类型为POST
            data:formData, // 文件数据
            processData:false, // 不处理数据
            contentType:false, // 不设置内容类型
            success:function (data) {
                console.log(data);
            }
        })
    }


</script>
</body>

controller:

   //用于获取配置文件中指定的文件上传路径
    @Value("${spring.servlet.multipart.location}")
    String adress;
    @RequestMapping("upload")
    public void upload(MultipartFile xxx) {
        // 获取上传文件的原始文件名
        String originalFilename = xxx.getOriginalFilename();
        // 获取文件扩展名,比如上传了图片原来的名字为1.jpg,就只截取到他的扩展名.jpg
        int i = originalFilename.indexOf(".");
        String suffix = originalFilename.substring(i);
        
        // 生成唯一的文件名,基于当前时间的毫秒数
        String pdb = "pdb" + currentTimeMillis();

        // 构建文件存储路径
        Path paths = Paths.get(adress, pdb + suffix);
        try {
            // 将上传文件的内容写入到指定路径
            Files.write(paths, xxx.getBytes());
        } catch (Exception e) {
            // 处理文件写入异常
            e.printStackTrace();
        }
    }

yml配置:

spring:
  mvc:
    view:
      prefix: /
      suffix: .html
  servlet:
    multipart:
#这里是要上传文件到的地方
      location: E:/java/img
#上传的文件大小限制
      max-file-size: 10MB

二:阿里云oss上传

什么是oss?

「OSS」的英文全称是Object Storage Service,翻译成中文就是「对象存储服务」,官方一点解释就是对象存储是一种使用HTTP API存储和检索非结构化数据和元数据对象的工具。

白话文解释就是将系统所要用的文件上传到云硬盘上,该云硬盘提供了文件下载、上传等一列服务,这样的服务以及技术可以统称为OSS,业内提供OSS服务的厂商很多,知名常用且成规模的蓝队云等。

 

步骤一:创建oss存储

 

2c54588447d343bd958616dc34a8f03e.png

上方截图步骤创建成功之后会弹出如下截图页面,请记住Endpoint的这个地址,后面后端代码中会使用到它

f24730fd41d24190b91ad15ccbb69daf.jpeg

fd97aacbc60947b7a001cb2a7b0a047c.png

OK啊这个就是我们创建好的bucket

那个又细又短的小红箭头就是我们上传文件存储的地方

里面的这个img-test文件夹是我在里面创建的,将上传的文件存放到这个文件夹里面,当然你们你也可以创建自己的

3db81cf6c50a4f198bf6734b1cc7088c.png

AccessKey ID和AccessKey Secret
是阿里云提供给用户的永久访问凭据

其中:

  • AccessKey ID 用于标识用户。
  • AccessKey Secret 用于验证用户的密钥,必须保密。

阿里云用户使用云产品的OpenAPI接口验权时需要,可从阿里云官网控制台获取,点击下图的AccessKey管理进去查看自己的ID和secret,这个也会在我们后端代码中用到

eb8cce95ccc64246aeae6fa7f35c8a4b.png

到这一步枯燥的准备工作也就完成了,现在我们可以开始我们最期待的正式环节,敲代码了

d39bf9d1cd4e4fc998292c64b015c7c5.gif

咳咳!开动开动。。。。。。

html代码就不说了,跟上面的本地上传一毛一样

第一步:首先我们添加一下所需依赖

  <!-- 引入阿里云对象存储服务(OSS)的SDK依赖 -->
        <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>2.8.3</version>
        </dependency>

第二步:我们搞一个统一实现类

这里呢是一些关于咱们上传访问oss时的一些校验认证,要存储的地址的一些东西,并且定义一个允许上传的格式,除了自己定义的格式以外,其他不允许被上传

@Component
public class UseOss {
    //你自己的oss存储的地址
    private final String ENDPOINT="自己的Endpoint的这个地址";
    //这两个密钥是用于身份认证
    private static final String ACCESSKEYID="你自己的accessKeyId";
    private static final String ACCESSKEYSECRET="你自己的accessKeyscret";
    //存储空间的名字
    private static final String BUCKETNAME="自己的Bucket名称";
    //路径前缀
    private static final String URLPREFIX="http://自己的Bucket名称.自己的Endpoint的这个地址/";
    //创建一个oss的示例对象
    private  OSS oss=new OSSClient(ENDPOINT, ACCESSKEYID, ACCESSKEYSECRET);
    //创建一个允许上传的格式
     private static final String[] IMAGE_TYPE = new String[]{".bmp", ".jpg",
            ".jpeg", ".gif", ".png"};
}

这一块就是最核心的代码了,多的就不说了,代码一行行的注释也是显而易见了,至于下面的UUID.randomUUID()是生成为了防止文件上传时出现文件名重复的情况,生成一个随机数,保证图片名称的唯一性,意思呢大概也就是这么个意思了。

  //文件上传
    public FileUploadResult uploadFile(MultipartFile uploadFile) {
        //设置一个自变量
        boolean isLegal = false;
        //上传过来的照片与IMAGE_TYPE做比较,如果上传过来的照片的后缀是IMAGE_TYPE类型就返回true
        for (String type : IMAGE_TYPE) {
            //    // 判断上传文件的原始文件名是否以遍历的我们设置的允许上传的格式结尾,不区分大小写
            if (StringUtils.endsWithIgnoreCase(uploadFile.getOriginalFilename(),
                    type)) {
                isLegal = true;
                break;
            }
        }
        //封装Result对象,并且将文件的byte数组放置到result对象中
        FileUploadResult fileUploadResult = new FileUploadResult();
        //进入判断的逻辑是:该照片不是我们想要允许的格式,直接设置该实体类的状态,返回
        if (!isLegal) {
            fileUploadResult.setStatus("error");
            return fileUploadResult;
        }
        //如果走到这一步,说明满足所有条件的照片
        //获得文件的名字
        String fileName = uploadFile.getOriginalFilename();
        System.out.println("fileName: "+fileName); //全名加上路径
        //照片存储的路径
        String filePath = getFilePath(fileName);//文件真实存储路径,并将这个照片的名字进行改变
        System.out.println("filePath: "+filePath);//images/2db0e12b-c59e-45ef-b35d-ceb218f4d2c4.png
        // 上传到阿里云
        try {
            //根据Bucket的名字来确定是哪个存储空间,filePath存储在存储空间哪个位置,以流的形式 将uploadFile写入到filePath
            oss.putObject(this.BUCKETNAME, filePath, new
                    ByteArrayInputStream(uploadFile.getBytes()));
        } catch (Exception e) {
            e.printStackTrace();
            //上传失败
            fileUploadResult.setStatus("error");
            return fileUploadResult;
        }
        //补充实体类
        fileUploadResult.setStatus("done");
        fileUploadResult.setResponse("success");
        //this.aliyunConfig.getUrlPrefix() + filePath 文件路径需要保持数据库
        //this.aliyunConfig.getUrlPrefix()+filePath 访问照片的真实路径
        fileUploadResult.setName(this.URLPREFIX + filePath);
        fileUploadResult.setUid(String.valueOf(System.currentTimeMillis()));
        return fileUploadResult;
    }
    public  String getFilePath(String sourceFileName) {
        //获得文件后缀
        int index = sourceFileName.lastIndexOf(".");
        String suffix = sourceFileName.substring(index);
       //这里生成了一个新路径
        //在我们存储空间下的 /自己的Bucket下创建的文件夹名称/ + 随机数  + 文件后缀
        return "beifangke-test/" + UUID.randomUUID() + suffix;
    }

第三步:Controller调用一下这个工具类

    @Autowired
    UseOss useOss;
    @RequestMapping("/aliyunFile")
    public FileUploadResult aliyunFile(MultipartFile xxx) {
        FileUploadResult fileUploadResult = useOss.uploadFile(xxx);
        return fileUploadResult;
    }

咱们上传一下LookLook!

当控制台接收到这个返回的时候也就算是OK了

345c0b7156cb4aa3a7397eb611b39e86.png

 

咱们点开自己创建的文件夹瞅一眼,呕吼!哥们的三国杀移动版新皮肤钟会.潜蛟觊天(动+静)图片也算是上传出来了,非常帅啊!

74e355a2e3164860bcbcec737e783331.png

cc3e9ea240b14e4bbec3823657907787.png

 

标签:文件,Springboot,filePath,oss,fileUploadResult,上传,String
From: https://blog.csdn.net/weixin_68620988/article/details/139245254

相关文章

  • 【Mac】关于Mac的github配置和本地项目上传
    目录前言什么是github?有什么用?github个人账户创建Mac的git环境配置生成密钥将密钥添加到github创建github仓库将本地文件上传至github仓库一些常用的git命令总结前言  本文主要介绍了Mac的git环境配置,github仓库的创建,本地文件上传到github仓库以及常用的git命......
  • Java项目:205Springboot + vue实现的养老院管理系统(含论文)
    作者主页:夜未央5788 简介:Java领域优质创作者、Java项目、学习资料、技术互助文末获取源码项目介绍基于Springboot+vue实现的养老院管理系统系统包含老人、家属、管理员三个角色系统包含登录、注册、主页、老人管理、家属管理、家属意见管理、寝室管理、老人事故信......
  • WEB入门 - 文件上传
    WEB入门-文件上传参考文章https://fushuling.com/index.php/2023/08/20/ctfshow刷题记录持续更新中/https://www.cnblogs.com/sen-y/p/15579078.htmlhttp://i0921.cn/blog/5dc52b0aba304f6314a9229f/662062c9ed9f76063b6ceb80web151<buttontype="button"class="layui......
  • 基于Springboot + vue实现的网上订餐系统--附源码+论文+数据库
    基于Springboot+vue实现的网上订餐系统摘 要随着我国经济的飞速发展,人们的生活速度明显加快,在餐厅吃饭排队的情况到处可见,近年来由于新兴IT行业的空前发展,它与传统餐饮行业也进行了新旧的结合,很多餐饮商户开始通过网络建设订餐系统,通过专门的网上订餐系统,一方面节省了用......
  • springmvc和springboot有什么区别?
    springmvc和springboot有什么区别?SpringMVC和SpringBoot是两个与Java开发相关的框架/工具,它们在JavaWeb应用程序开发中有着不同的作用和优势。SpringMVC:定位:SpringMVC是一种基于Java的Web框架,用于构建Web应用程序的控制器层。功能:它提供了一个模型-......
  • 采用Java+ SpringBoot+ IntelliJ+idea开发的ADR药物不良反应监测系统源码
    采用Java+SpringBoot+IntelliJ+idea开发的ADR药物不良反应监测系统源码ADR药物不良反应监测系统有哪些应用场景?ADR药物不良反应监测系统有哪些应用场景?ADR药物不良反应监测系统具有广泛的应用场景,以下是一些主要的应用场景:一、医院临床监测:药品不良反应智能监测系统基......
  • Arduino实现温湿度传感器以及数据上传到云(乐维互联)
    0准备材料0.1ESP-01S引脚及定义官方定义:序号pin功能1GND地线2IO0/GPIO0工作模式选择:①悬空:FlashBoot,工作模式②下拉:UARTDownLoad下载模式3IO2/GPIO2通用IO4RX/RXD数据接收端5TX/TXD谁发送端63V3/VCC3.3V,模块供电7RST1)外......
  • 【毕业论文】基于springboot的考研信息管理系统
       本科生毕业论文论文题目:基于springboot的考研信息管理系统学   院:软件学院年   级:2020级专   业:软件工程姓   名:王帅学   号:20203241指导教师:杨丰       2024 年5 月 ......
  • Springboot配置文件中账号密码等敏感信息的加解密
    说明:使用过SpringBoot配置文件的朋友都知道,资源文件中的内容通常情况下是明文显示,安全性比较低。打开application.properties或application.yml,比如MySQL登录密码,Redis登录密码以及第三方的密钥等等一览无余。这里介绍一个加解密组件jasypt,用以提高配置文件中敏感配置数据的......
  • SpringBoot如何使用日志Logback,及日志等级详解
    SpringBoot默认已经集成了SLF4J(SimpleLoggingFacadeforJava)作为日志的接口,以及Logback作为日志的实现。这意味着在大多数情况下,你无需做额外的配置即可开始记录日志。下面是一个简要的指南,包括如何在SpringBoot应用中使用SLF4J和Logback,以及一些实际的代码示例。默......