Springboot上传图片到阿里云OSS新手教程(完整代码)

作者: ʘᴗʘ发布时间:2021-11-01 12:38 浏览量:503 点赞:372 售价:0

简介

阿里云OSS全称【阿里云对象存储OSS(Object Storage Service)】,是一款海量、安全、低成本、高可靠的云存储服务。呃,用大白话描述就是一个容量大、速度快、便宜的超大硬盘。相比很久之前网站都把图片保存在服务器硬盘,存储图片到OSS会方便很多,而且很多附加功能会减少开发者很多工作。比如阿里云OSS的图片压缩、缩略图、打水印;压缩包解压等等附加功能,可以极大的减少开发工作量。

springboot上传图片到OSS的几种方案

根据上传图片终端的不同、上传图片技术路径的不同,我们可以把springboot上传图片到OSS的方案分为两大类:

  1. 用户通过传统表单的形式,上传文件到springboot服务器,springboot服务器再调用阿里云OSS的API将图片传输到阿里云OSS。
  2. 用户先请求springboot服务器,拿到上传凭证,然后带着这个凭证直接在用户终端(浏览器、手机APP、小程序等)上传图片到阿里云OSS。

对比上述两种方案,我们可以发现方案二其实从用户体验角度是优于方案一的,方案二的主要优点如下:

  1. 图片直接从用户终端到阿里云OSS,少了springboot服务器转存阿里云OSS这一步,上传耗时会减少很多。
  2. 因为图片是直接传输到阿里云OSS的,不经过springboot的服务器,所以不消耗我们服务器的带宽和流量。
  3. 阿里云OSS的上传域名经过网络优化,并且服务器带宽很大,相比我们自己的普通域名在上传速度上大概率要快很多。

方案一:浏览器通过表单上传图片到阿里云OSS

代码主要分为三个部分:

  1. web上传的HTML网页:这个就是上传图片的页面。
  2. 接收web页面表单上传图片的接口:就是WEB网页选择图片后,点击按钮浏览器会把表单里的图片数据发送给服务器,这个接口就是接收表单发来的数据的。
  3. 阿里云OSS封装代码:springboot收到前端web页面传来的图片数据后,调用封装好的阿里云OSS API,把图片转存到阿里云OSS。
WEB网页代码和对应的springboot controller
  • web上传页面Controller
@RequestMapping(value = "/upload/webPage", method = RequestMethod.GET)
public String webPage() {
    return "webPage";
}
  • web上传页面HTML代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>上传图片</title>
</head>
<body>

<div>
    <form action="/upload/webPost" method="post" enctype="multipart/form-data">

        <input type="file" name="file">

        <button type="submit">点击开始上传</button>
    </form>
</div>

</body>
</html>
接收web表单数据的springboot controller
@RequestMapping(value = "/upload/webPost", method = RequestMethod.POST)
@ResponseBody
public String webPost(@RequestParam(name = "file") MultipartFile multipartFile) {
    if (multipartFile.isEmpty()) {
        return "上传失败,文件不能为空";
    }
    try (InputStream inputStream = multipartFile.getInputStream()) {
        aliyunOssService.uploadInputStreamFile("data/test.jpg", inputStream, CannedAccessControlList.PublicRead, null);
        return "上传成功";
    } catch (Exception e) {
        e.printStackTrace();
        return "上传失败";
    }
}
  • 其中aliyunOssService这个类是封装好的阿里云OSS API接口service,后面会展示代码。
  • 上面的代码中,上传的图片转存阿里云OSS时,文件名称是写死的,你可以根据你的需求,自己调整代码。
  • 上面的代码中,文件上传阿里云OSS时,默认写死的文件权限是“公共读”,你可以根据你的需求,调整CannedAccessControlList.PublicRead的值。
封装好的阿里云OSS API Service
package com.coderbbb.book1.service;

import com.aliyun.oss.ClientConfiguration;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.common.auth.DefaultCredentialProvider;
import com.aliyun.oss.common.comm.ResponseMessage;
import com.aliyun.oss.model.*;
import org.springframework.stereotype.Service;

import java.io.InputStream;

/**
 * @Author: longge93
 * @Date: 2021/6/10 13:32
 */
@Service
public class AliyunOssService {

    private final String ACCESS_KEY = "access key";

    private final String SECRET_KEY = "secret key";

    private final String ENDPOINT = "oss-accelerate.aliyuncs.com";

    private final String BUCKET = "666";

    private static OSSClient ossClient;

    private synchronized void createOssClient() {
        if (ossClient == null) {
            DefaultCredentialProvider defaultCredentialProvider = new DefaultCredentialProvider(ACCESS_KEY, SECRET_KEY);
            ClientConfiguration config = null;
            ossClient = new OSSClient(ENDPOINT, defaultCredentialProvider, config);
        }
    }

    private OSSClient getOssClient() {
        if (ossClient == null) {
            createOssClient();
        }
        return ossClient;
    }



    public String uploadInputStreamFile(String key, InputStream inputStream, CannedAccessControlList acl, Callback callback) throws Exception {

        PutObjectRequest putObjectRequest = new PutObjectRequest(BUCKET, key, inputStream);
        ObjectMetadata metadata = new ObjectMetadata();
        metadata.setObjectAcl(acl);
        putObjectRequest.setMetadata(metadata);

        if (callback != null) {
            putObjectRequest.setCallback(callback);
        }

        PutObjectResult putObjectResult = getOssClient().putObject(putObjectRequest);
        ResponseMessage responseMessage = putObjectResult.getResponse();
        if (responseMessage != null && callback != null) {
            InputStream content = responseMessage.getContent();
            String result = new String(content.readAllBytes());
            content.close();
            return result;
        }
        return null;
    }

}

上面代码中的一些配置项介绍:

  • ACCESS_KEY 阿里云账号的access key
  • SECRET_KEY 阿里云账号的secret key
  • ENDPOINT 在阿里云OSS管理后台可以查看到
  • BUCKET 同上,在阿里云OSS后台查看

上面的代码是对阿里云OSS SDK功能的封装,依赖阿里云提供的OSS SDK,maven引入代码如下:

<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.13.2</version>
</dependency>
效果演示

运行代码后,在上传WEB页面,点击选择文件,然后点击上传

Springboot上传图片到阿里云OSS新手教程(完整代码)

然后登陆阿里云OSS控制台,即可查看到上传的文件

Springboot上传图片到阿里云OSS新手教程(完整代码)

浏览器直接上传文件到阿里云OSS

请阅读:浏览器Web、小程序前端等直接上传图片文件到阿里云OSS(springboot版完整代码),这篇文章详细介绍了通过浏览器、微信小程序、Vue等常见前端,直接上传文件到阿里云OSS的过程,并有完整代码可供参考。

版权声明:《Springboot上传图片到阿里云OSS新手教程(完整代码)》为CoderBBB作者「ʘᴗʘ」的原创文章,转载请附上原文出处链接及本声明。

原文链接:https://www.coderbbb.com/articles/30

其它推荐:

  • 【thymeleaf文档精华版】springboot thymeleaf常用语法中文教程

    现在虽然Vue、React等前端框架盛行,但是部分需要SEO的页面,还是得用thymeleaf之类的模板引擎来渲染。thymeleaf的官方文档,写的太过详细,显得比较啰嗦。本文主要是把thymeleaf官方的英文文档,结合作者自己的使用经验,整理成了一篇可以用来速查的中文教程,方便大家。

  • Springboot配置PC端和移动端使用不同模板(多皮肤换肤思路也差不多)

    日常开发中,一个网页往往需要同时适配PC端和移动端。简单的页面我们可以使用CSS来完成自适应,但比较复杂的页面可能需要给PC端和移动端分别开发不同的模板。那么Springboot如何能根据访问的终端特点(User-Agent)来自动使用对应的模板呢?

  • 使用IntelliJ创建第一个简单的Springboot项目

    本文详细介绍了如何使用IntelliJ开发第一个Springboot项目,并打包成jar文件部署到生产环境。内容包括:IntelliJ的常用操作、Springboot多环境配置等常用操作介绍。

  • 【过来人推荐】Netty报错:LEAK: ByteBuf.release() was not called before it's garbage-collected

    netty报错:ByteBuf.release() was not called before it's garbage-collected的完美解决方案!过来人经过N次该报错后总结的经验,不长篇大论讲理论,真金白银给你解决方案。

  • springboot+vue播放视频流(无需下载视频,可以拖动进度、倍速播放)

    springboot+vue播放视频流详细教程!不用自己实现range头,springboot本身是支持range分片返回文件的!本教程介绍的方法可以通过三五行代码直接实现springboot播放视频流。

  • 解决win10无法打开Microsoft Store

    本文解决了Windows10系统无法正常打开Microsoft Store页面的问题。通过设置Internet的TLS1.2选项,完美解决该问题。

  • Vditor粘贴、上传图片到阿里云OSS(WEB直传方式)

    当我们在Vditor中粘贴站外图片或直接上传本地图片的时候,我们希望图片直接上传到阿里云OSS上,不经过我们的业务服务器转发,这样可以有效降低业务服务器的带宽占用,同时还能提高图片的上传速度。本文介绍了如何配置Vditor,让其可以完美直传图片到阿里云OSS中。

  • Springboot整合Redis和redis常用操作演示

    本文介绍如何在springboot中引入redis数据库,并执行各类redis操作。过程非常简单,只要引入一些jar包,并配置redis连接信息即可。

  • springboot使用redis限制并发请求、限流

    日常开发中经常会遇到需要限流、限制并发的需求,网上有很多算法、框架的介绍,但通常比较复杂,对于小项目来讲过于复杂。本文介绍了一种通过redis incr函数来实现的简便限流算法,并提供了完整源代码,可以快速的整合到你的项目中,实现API限流。

  • springboot3+EhCache3缓存+JDK17整合指南

    本文介绍了如何在springboot3中整合使用EhCache3作为缓存。和EhCache2相比,EhCache3的整合方法完全不同。同时,由于在springboot3中删除了EhCacheCacheManager类,也让整合方法完全不同。参考本文,可以快速完成整合。