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

作者: ʘᴗʘ发布时间:2021-11-01 12:38 浏览量:348 点赞:276 售价: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

其它推荐: