springboot实现阿里云oss对象存储图片上传和回显

本项目选用阿里云的OSS服务进行文件存储

一、阿里oss服务准备(如已开通oss服务,可跳过)

阿里云对象存储OSS(Object Storage Service)是一款海量、安全、低成本、高可靠的云存储服务,可提供99.9999999999%(12个9)的数据持久性,99.995%的数据可用性。多种存储类型供选择,全面优化存储成本。即一个用于存储文件的云服务器。

(1)进入阿里云官网,搜索oss,进入oss,如未开通会有开通服务按钮,开通成功后,如下图:
(2)接着创建Bucket,点击创建Bucket按钮,会弹出如下界面,只需输入Bucket名称,地域自己选择,我选择的华东1(杭州),修改读写权限为公共读(使前端可以获取图片,从而回显)
(3)鼠标放在我主账号头像上,会弹出如下信息,点击AccessKey管理,进入后点击创建AccessKey,记住AccessKey ID和AccessKey Secret(注意:只有创建时才有,注意保存)
                                                   (4)在阿里提供的文档里可以找到如何结合代码使用oss,可以根据需求复制代码修改(可找到上次文件方法)
(5)查找Endpoint(地域节点),每个地域都不同(6)第一次使用oss服务,阿里云会免费赠送3个月,如下:每月可接受请求20万次,每月可下载oss服务内容2GB,存储文件大小为20GB

二、springboot实现阿里云oss对象存储图片上传和回显

1.首先在yml文件中配置好阿里云oss配置
sky:
  alioss:
    #阿里oss选择的Endpoint(地域节点)
    endpoint: 

    #创建AccessKey时记住的AccessKey ID
    access-key-id: access-key-id

    #创建AccessKey时记住的AccessKey Secret
    access-key-secret: access-key-secret

    #创建bucket时自定义的bucket姓名
    bucket-name: bucket姓名
2.创建配置类读取oss配置
package com.sky.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * 阿里oss配置类,用于读取配置文件的配置
 */
@Component
@Data
@ConfigurationProperties(prefix = "sky.alioss")
public class AliOssProperties {

    public String endpoint;
    public String accesskeyid;
    public String accesskeysecret;
    public String bucketName;

}
3.新建一个oss工具类,在里面编写上传文件方法(上传文件方法copy阿里云上传文件sdk文档)
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import java.io.ByteArrayInputStream;

@Data
@AllArgsConstructor
@Slf4j
public class AliOssUtil {

    private String endpoint;
    private String accessKeyId;
    private String accessKeySecret;
    private String bucketName;

    /**
     * 文件上传
     *
     * @param bytes
     * @param objectName
     * @return
     */
    public String upload(byte[] bytes, String objectName) {

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        try {
            // 创建PutObject请求。
            ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(bytes));
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }

        //文件访问路径规则 https://BucketName.Endpoint/ObjectName
        StringBuilder stringBuilder = new StringBuilder("https://");
        stringBuilder
                .append(bucketName)
                .append(".")
                .append(endpoint)
                .append("/")
                .append(objectName);

        log.info("文件上传到:{}", stringBuilder.toString());
        //返回一个文件路径字符串,从而使得前端可以回显
        return stringBuilder.toString();
    }
}
4.新建一个配置类,用于启动项目时自动生成oss工具类
import com.sky.properties.AliOssProperties;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@Slf4j
public class OssCreateConfiguration {

    /**
     * 创建AliOssUtil对象
     * @return
     */
    @Bean
    //保证只有一个aliOssUtilCreate的bean对象
    @ConditionalOnMissingBean
    public AliOssUtil aliOssUtilCreate(AliOssProperties aliOssProperties){
        log.info("开始创建阿里云文件上传工具类对象:{}",aliOssProperties);
        return new AliOssUtil(aliOssProperties.getEndpoint(),
                              aliOssProperties.getAccessKeyId(),
                              aliOssProperties.getAccessKeySecret(),
                              aliOssProperties.getBucketName());
    }
}

5.在controller层使用AliOssUtil类的upload方法,上传文件到阿里云

import com.sky.constant.MessageConstant;
import com.sky.result.Result;
import com.sky.utils.AliOssUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.UUID;

@RestController
@Slf4j
@RequestMapping("/admin/common")
@Api(tags = "通用接口")
public class CommonController {

    @Autowired
    private AliOssUtil aliOssUtil;

    @PostMapping("/upload")
    @ApiOperation("文件上传")
    public Result<String> upload(MultipartFile file){
        log.info("文件上传");
        //获取上传的文件的原始名称
        String originalFilename = file.getOriginalFilename();
        //获取上传的文件的后缀名,例如asd.png的.png后缀
        String substring = originalFilename.substring(originalFilename.lastIndexOf("."));
        //根据uuid创建新文件名
        String fileName = UUID.randomUUID().toString()+substring;
        //使用aliOssUtil的upload方法
        try {
            String uploadPath = aliOssUtil.upload(file.getBytes(), fileName);
            //返回文件上传路径
            return Result.success(uploadPath);
        } catch (IOException e) {
            log.info("文件上传失败:{}",e);
//            e.printStackTrace();
        }
        return Result.error(MessageConstant.UPLOAD_FAILED);
    }
}

注意:SpringBoot默认上传文件大小不能超过1MB,超过之后会报以下异常:

org.apache.tomcat.util.http.fileupload.FileUploadBase$FileSizeLimitExceededException:
The field file exceeds its maximum permitted size of 1048576 bytes.

解决办法:

在配置文件(application.properties/application.yml)中加入如下设置:

#Spring Boot 1.3 或之前的版本,配置:
multipart.maxFileSize = 100Mb
multipart.maxRequestSize=150Mb


#Spring Boot 1.4 版本后配置更改为:
spring.http.multipart.maxFileSize = 100Mb
spring.http.multipart.maxRequestSize = 150Mb

#Spring Boot 2.0 之后的版本配置修改为: 单位Mb改为MB了
spring.servlet.multipart.max-file-size = 100MB
spring.servlet.multipart.max-request-size = 150MB

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SpringBoot可以通过整合阿里云OSS对象存储服务来实现文件上传和管理功能。具体实现可以参考以下步骤: 1. 在service层定义FileService接口,该接口包含上传文件到阿里云OSS的方法。例如,可以使用MultipartFile作为参数,返回上传成功后的文件URL。 2. 在controller层编写FileApiController类,该类使用@RestController注解标识为控制器,并使用@RequestMapping注解指定请求路径。在该类中,通过@Autowired注入FileService,并在文件上传的接口方法中调用FileService的上传文件方法并返回上传成功后的文件URL。 3. 在配置文件中配置阿里云OSS的相关信息,包括accessKey、secretKey、bucketName等。可以使用SpringBoot提供的@ConfigurationProperties注解来读取配置文件中的信息。 4. 在pom.xml文件中添加阿里云OSS SDK的依赖。 5. 编写上传文件的前端界面,可以使用HTML或者前端框架如Vue.js、React等。 通过以上步骤的实现SpringBoot就可以整合阿里云OSS对象存储服务,实现文件上传和管理功能。这样可以将文件存储在阿里云OSS中,提高文件的安全性和可靠性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [SpringBoot整合阿里云OSS对象存储服务的实现](https://download.csdn.net/download/weixin_38649091/12721580)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [全网最详细SpringBootSpringCloud整合阿里云OSS对象存储服务](https://blog.csdn.net/weixin_55076626/article/details/127924003)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值