阿里云OSS文件上传

解决海量数据存储与弹性扩容以及高并发的问题,项目中我们采用云存储的解决方案-阿里云OSS

一、对象存储OSS

1、开通“对象存储OSS”服务

  1. 申请阿里云账号
  2. 实名认证
  3. 开通“对象存储0SS”服务
  4. 进入管理控制台

2、创建 Bucket

Bucket名称:自己取

地域:华北2(北京)

存储类型:标准存储

同城冗余存储:关闭

版本控制:不开通

读写权限:公共读

服务器加密方式:无

实时日志查询:不开通

定时备份:不开通

点击创建 bucket

3、上传文件

4、创建RAM子用户

记住自己的 AccessKey ID 和 AccessKey Secret

二、使用SDK

1、点击学习路径进入

2、找到java开发参考

3、创建一个maven项目

此处省略。。。。

4、太耐 pom 依赖

<dependency>
        <groupId>com.aliyun.oss</groupId>
        <artifactId>aliyun-sdk-oss</artifactId>
</dependency>

 5、修改 application.yml 文件

aliyun:
  oss:
    endpoint: oss-cn-beijing.aliyuncs.com
    keyId: 自己的 AccessKey ID
    keySecret: 自己的 AccessKey Secret
    bucketName: 创建 bucket 的名字

6、创建实体类: 

package com.entity;

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

/**
 * 丛配置文件读取变量
 */
@Data
@Component
@ConfigurationProperties(prefix = "aliyun.oss")
public class OssProperties {
    private String endpoint;
    private String keyId;
    private String keySecret;
    private String bucketName;
}

7、创建 service 接口和实现类

package com.service;

import java.io.InputStream;

/**
 * @Author cb
 * @createTime 
 * @Version
 * @注释:文件上传服务接口
 */
public interface FileService {
    
    String upload(InputStream inputStream, String module, String originalFileName);
}

请参考SDK中的:Java->上传文件->简单上传->流式上传->上传文件流  

package com.service.impl;

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.common.auth.CredentialsProviderFactory;
import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import com.service.FileService;
import com.entity.OssProperties;
import jakarta.annotation.Resource;
import org.joda.time.DateTime;
import org.springframework.stereotype.Service;

import java.io.FileInputStream;
import java.io.InputStream;
import java.util.UUID;

/**
 * @Author cb
 * @createTime 
 * @Version
 * @注释:文件上传服务实现类
 */
@Service
public class FileServiceImpl implements FileService {

    @Resource
    private OssProperties ossProperties;
    /**
     * 阿里云Oss文件上传
     *
     * @param inputStream     上传文件的输入流
     * @param module          上传到oss的文件目录
     * @param originalFileName 原始文件名
     * @return 返回上传上去之后的url地址
     */
    @Override
    public String upload(InputStream inputStream, String module, String originalFileName) {
        
        String endpoint = ossProperties.getEndpoint();
        String accessKeyId = ossProperties.getKeyId();
        String accessKeySecret = ossProperties.getKeySecret();
        String bucketName = ossProperties.getBucketName();
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
       
        String folder = new DateTime().toString("yyyy/MM/dd");
        // 文件名
        String fileName = UUID.randomUUID().toString();
        //文件扩展名
        String fileExtention = originalFileName.substring(originalFileName.lastIndexOf("."));
        
        String objectName = module+"/"+folder+"/"+fileName+fileExtention;
        ossClient.putObject(bucketName, objectName, inputStream);
        // 关闭OSSClient。
        ossClient.shutdown();
        
        return "https://"+bucketName+"."+endpoint+"/"+objectName;
    }
}

 8、创建Controller类实现API接口

package com.controller;

import com.result.R;
import com.result.ResultCodeEnum;
import com.utils.ExceptionUtils;
import com.service.FileService;
import com.exception.JavaclimbException;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;

/**
 * @Author 
 * @createTime 
 * @Version
 * @注释:阿里云文件管理控制类
 */
@Tag(name = "阿里云文件管理",description = "阿里云文件管理")
@RestController
@RequestMapping("/admin/oss/file")
@Slf4j
@CrossOrigin
public class FileController {
    @Resource
    private FileService fileService;

    @Operation(description = "阿里云文件上传")
    @PostMapping(value = "/upload")
    public R upload(@Parameter(description = "文件",required = true)@RequestParam("file") MultipartFile file,
                    @Parameter(description = "模块",required = true)@RequestParam("module") String module){
        try {
            InputStream inputStream = file.getInputStream();
            String orginalFileName = file.getOriginalFilename();
            String url = fileService.upload(inputStream,module,orginalFileName);
            return R.ok().message("文件上传成功").data("url",url);
        } catch (IOException e) {
            log.error(ExceptionUtils.getMessage(e));
            throw new JavaclimbException(ResultCodeEnum.FILE_UPLOAD_ERROR);
        }
    }


}

三、测试

上传成功;如有问题指导联系我改正,谢谢;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值