栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

1.开通服务

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

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

2.然后打开控制台

 按顺序创建一个Bucket仓库

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

 进入仓库看看详细信息

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

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

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

3.实践

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

阿里云oss官方文档

3.1 创建Maven项目,引入依赖
    
        
            io.springfox
            springfox-swagger2
            2.9.2
        
        
        
            io.springfox
            springfox-swagger-ui
            2.9.2
        


        
            org.projectlombok
            lombok
            1.18.22
        
        
        
            com.alibaba
            fastjson
            1.2.62
        
        
        
            com.aliyun.oss
            aliyun-sdk-oss
            2.8.3
        
        
            joda-time
            joda-time
            2.10.1
        
        
        
            org.apache.commons
            commons-lang3
            3.8.1
        
    
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,仓库名称+节点地址
    
    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();
    }

    
    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 {

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

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

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

    public Result(){}

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

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

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

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

    
    public static Result ok(T data){
        Result result = build(data);
        return build(data, ResultCodeEnum.SUCCESS);
    }

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

    
    public static Result fail(T data){
        Result result = build(data);
        return build(data, ResultCodeEnum.FAIL);
    }

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

    public Result 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;

    }
    
    @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控制台看这个图片又就表示成功了

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/778033.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号