springboot整合阿里云OSS存储(对象存储)图文详解-———入门操作指南。

1.开通服务

登录阿里云的官方申请oss服务阿里云官网

搜索oss对象存储 然后申请,这里我已经申请过了 

2.然后打开控制台

 按顺序创建一个Bucket仓库

 有的时候仓库可能没有添加到访问路径我们可以自己手动添加根据提示选择

 进入仓库看看详细信息

这里我们需要记录一下外网访问节点,后面访问的时候需要用到

 然后我们鼠标放在又上角头像图标上,在弹出框选择AccessKey管理或者直接搜索

申请一个 key-value秘钥 可以理解为远程访问的 账户密码。

3.实践

我主要讲解一些常用 的方法更多的内容需要参考官方文档

阿里云oss官方文档

3.1 创建Maven项目,引入依赖

    <dependencies>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
        </dependency>
        <!-- swagger ui -->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.2</version>
        </dependency>


        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.22</version>
        </dependency>
        
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.62</version>
        </dependency>
        <!-- aliyun-oos -->
        <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>2.8.3</version>
        </dependency>
        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
            <version>2.10.1</version>
        </dependency>
        <!-- apache-common-lang3 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.8.1</version>
        </dependency>
    </dependencies>

3.2 创建oss工具类 实现 查询创建仓库功能 和基本配置信息

package com.dfp.common.aliyun;

import com.aliyun.oss.OSSClient;
import com.aliyun.oss.model.CannedAccessControlList;
import com.aliyun.oss.model.CreateBucketRequest;
import lombok.Data;
@Data
public class OssUtil {
    private static String ENDPOINT="你的节点";//外网访问节点
    private static String AccessKeyID="你的id"; //accID
    private static String AccessKeySecret="你的密码";//ACCSecret
    private static String BUKETNAME="demotest-dfp2";//仓库名称
    private static String SUFFER_URL ="http://"+BUKETNAME+"."+ENDPOINT; //上传成功返回的url,仓库名称+节点地址
    /**
     * 获取oss链接
     */
    public OSSClient getOSSClient(){
        OSSClient ossClient=new OSSClient(ENDPOINT,AccessKeyID,AccessKeySecret);
        //判断是否存在仓库
        if (ossClient.doesBucketExist(BUKETNAME)){
            System.out.println("存在仓库");
            ossClient.shutdown();
        }else{
            System.out.println("不存在仓库....创建一个仓库"+BUKETNAME);

            CreateBucketRequest bucketRequest=new CreateBucketRequest(null);
            bucketRequest.setBucketName(BUKETNAME);//设置仓库名称
            bucketRequest.setCannedACL(CannedAccessControlList.PublicRead);//设置仓库权限 公共读

            ossClient.createBucket(bucketRequest);
            ossClient.shutdown();
        }
        return ossClient;
    }
    public static void main(String[] args) {
        OssUtil util=new OssUtil();
        util.getOSSClient();
    }

}

我们运行一下main方法

到阿里云的控制台刷新

多了一个仓库地址这样我们就远程创建了一个地址。 

4 上传文件(与3.2关系不大)

4.1构建一个较为完整的项目

 4.2配置类

package com.dfp.aliyunossdemo.config;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClient;
import lombok.Data;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@Data
public class AliyunOSSConfig {
    private String endPoint="xxxxxxxx";// 地域节点
    private String accessKeyId="xxxxxxxxx";
    private String accessKeySecret="xxxxxxxxxxxxxx";
    private String bucketName="demotest-dfp";// OSS的Bucket名称
    private String urlPrefix="demotest-dfp.oss-cn-shenzhen.aliyuncs.com";// Bucket 域名
    private String fileHost="fileTest";// 目标文件夹
    @Bean
    public OSS OSSClient(){
        return new OSSClient(endPoint,accessKeyId,accessKeySecret);
    }
}
package com.dfp.aliyunossdemo.config;

import com.google.common.base.Predicates;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.ParameterBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.service.Parameter;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

import java.util.ArrayList;
import java.util.List;

@Configuration
@EnableSwagger2
public class Swagger2Config {
    @Bean

    public Docket createRestApi() {

        // 为swagger添加header参数可供输

        return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select()
                .apis(RequestHandlerSelectors.basePackage("com.dfp"))
                .paths(PathSelectors.any()).build();
//                .globalOperationParameters();
    }

    /**
     * @Description: 构建 api文档的信息
     */
    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                // 设置页面标题
                .title("使用swagger2构建短视频后端api接口文档")
                // 设置联系人
                .contact(new Contact("dfp", "http://www.dfp.com", "1156655386@qq.com"))
                // 描述
                .description("欢迎访问短视频接口文档,这里是描述信息")
                // 定义版本号
                .version("1.0").build();
    }
}

4.3Service层

package com.dfp.aliyunossdemo.service;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.model.OSSObject;
import com.aliyun.oss.model.ObjectMetadata;
import com.dfp.aliyunossdemo.config.AliyunOSSConfig;
import com.dfp.aliyunossdemo.enums.Result;
import com.dfp.aliyunossdemo.enums.ResultCodeEnum;
import com.dfp.aliyunossdemo.enums.StatusCode;
import org.joda.time.DateTime;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;
@Service
public class FileUploadService {
    //设置允许上传文件格式
    private static final String[] IMAGE_TYPE=new String[]{".bmp",".jpg",".jpeg",".png",".gif",".mp3",".mp4",".mkv"};
    @Autowired
    private OSS ossClient;
    @Autowired
    private AliyunOSSConfig aliyunOSSConfig;

    public String upload(MultipartFile file){
        String bucketNanme=aliyunOSSConfig.getBucketName();
        String endPoint = aliyunOSSConfig.getEndPoint();
        String accessKeyId = aliyunOSSConfig.getAccessKeyId();
        String accessKeySecret = aliyunOSSConfig.getAccessKeySecret();
        String fileHost = aliyunOSSConfig.getFileHost();
        //返回的Url
        String returnUrl="";
        //审核上传文件是否符合规定格式
        boolean isLegal=false;
        for (String type:IMAGE_TYPE){
            if (StringUtils.endsWithIgnoreCase(file.getOriginalFilename(),type)){
                isLegal=true;
                break;
            }
        }
        if (!isLegal){
//            如果不正确返回错误状态码
            return StatusCode.ERROR.getMsg();
        }
        //获取文件的名称
        String originalFilename = file.getOriginalFilename();
        //截取文件类型
        String fileType = originalFilename.substring(originalFilename.lastIndexOf("."));
//        最终保存文件名称
        String newFileName= UUID.randomUUID().toString()+ fileType;
        //构建日期路径  ps :oss目标文件夹/yyyy/MM/dd文件名称
        String filePath=new SimpleDateFormat("yyyy/MM/dd").format(new Date());
//        文件上传文件的路径
        String uploadUrl=fileHost+"/"+filePath+"/"+newFileName;
//        获取文件输入流
        InputStream inputStream=null;
        try{
            inputStream=file.getInputStream();

        }catch (IOException e){
            e.printStackTrace();
        }
        //文件上传到阿里云oss
//        ossClient.put
        ossClient.putObject(bucketNanme,uploadUrl,inputStream);//,meta
        returnUrl="http://"+bucketNanme+"."+endPoint+"/"+uploadUrl;
        return returnUrl;

    }

 
}

4.4 异常处理统一返回结果

package com.dfp.aliyunossdemo.enums;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

/**
 * 全局统一返回结果类
 */
@Data
@ApiModel(value = "全局统一返回结果")
public class Result<T> {

    @ApiModelProperty(value = "返回码")
    private Integer code;

    @ApiModelProperty(value = "返回消息")
    private String message;

    @ApiModelProperty(value = "返回数据")
    private T data;

    public Result(){}

    protected static <T> Result<T> build(T data) {
        Result<T> result = new Result<T>();
        if (data != null)
            result.setData(data);
        return result;
    }

    public static <T> Result<T> build(T body, ResultCodeEnum resultCodeEnum) {
        Result<T> result = build(body);
        result.setCode(resultCodeEnum.getCode());
        result.setMessage(resultCodeEnum.getMessage());
        return result;
    }

    public static <T> Result<T> build(Integer code, String message) {
        Result<T> result = build(null);
        result.setCode(code);
        result.setMessage(message);
        return result;
    }

    public static<T> Result<T> ok(){
        return Result.ok(null);
    }

    /**
     * 操作成功
     * @param data
     * @param <T>
     * @return
     */
    public static<T> Result<T> ok(T data){
        Result<T> result = build(data);
        return build(data, ResultCodeEnum.SUCCESS);
    }

    public static<T> Result<T> fail(){
        return Result.fail(null);
    }

    /**
     * 操作失败
     * @param data
     * @param <T>
     * @return
     */
    public static<T> Result<T> fail(T data){
        Result<T> result = build(data);
        return build(data, ResultCodeEnum.FAIL);
    }

    public Result<T> message(String msg){
        this.setMessage(msg);
        return this;
    }

    public Result<T> code(Integer code){
        this.setCode(code);
        return this;
    }

    public boolean isOk() {
        if(this.getCode().intValue() == ResultCodeEnum.SUCCESS.getCode().intValue()) {
            return true;
        }
        return false;
    }
}

4.5 控制层

package com.dfp.aliyunossdemo.controller;

import com.dfp.aliyunossdemo.enums.Result;
import com.dfp.aliyunossdemo.enums.ResultCodeEnum;
import com.dfp.aliyunossdemo.service.FileUploadService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;

import static com.dfp.aliyunossdemo.enums.ResultCodeEnum.DATA_ERROR;
import static com.dfp.aliyunossdemo.enums.ResultCodeEnum.PARAM_ERROR;


@Api(description = "阿里云测试文档Api")
@RestController
@RequestMapping("/api/file")
public class TestController {
    @Autowired
    private FileUploadService fileUploadService;

    @ApiOperation(value = "文件上传")
    @PostMapping("/upload")
    public Result upload(MultipartFile file)  {


        String returnFileUrl = null;
        if (file != null) {
            returnFileUrl = fileUploadService.upload(file);
            if (StringUtils.isEmpty(returnFileUrl)){
//                返回路径为空表示异常
                return Result.fail(DATA_ERROR);
            }
            return Result.ok(returnFileUrl);
        } else {
            return Result.fail(PARAM_ERROR);
        }
    }
    @PostMapping("/down/{filename}")
    public Result DownLoad(@PathVariable String filename , HttpServletResponse response){
        return  null;

    }
    /**
    * 文件删除api
     * @param: fileName
     * @return: com.alibaba.fastjson.JSONObject
     * @create: 2020/10/31 17:35
            * @author: csp1999
     */
    @ApiOperation(value = "文件删除")
    @GetMapping("/delete/{fileName}")
    public JSONObject DeleteFile(@PathVariable("fileName") String fileName) {
        JSONObject jsonObject = new JSONObject();

        String status = fileUploadService.delete(fileName);
        return null;

    }

}

运行项目测试

打开sw2进行测试 localhost:+项目端口号

 

 在浏览器输入这个网址或者在你的阿里云oss控制台看这个图片又就表示成功了

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
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 ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值