oss对象存储的使用--spring Boot

什么是阿里云OSS

阿里云 OSS为您提供基于网络的数据存取服务。使用 OSS,您可以通过网络随时存储和调用包括文本、图片、音频和视频等在内的各种结构化或非结构化数据文件。
在使用阿里云 OSS 之前,您需要了解 OSS 的几个基本概念。阿里云 OSS 将数据文件以对象(object)的形式上传到存储空间(bucket)中。 您可以创建一个或者多个存储空间,然后向每个存储空间中添加一个或多个文件。您可以通过获取已上传文件的地址进行文件的分享和下载。您还可以通过修改存储空间或文件的属性或元信息来设置相
应的访问权限。
您可以通过阿里云管理控制台执行基本和高级 OSS 任务,您还可以通过阿里云开发工具包或直接在应用程序中进行 RESTful API 调用执行基本和高级 OSS 任务。有关更多信息,本文档将向您介绍如何使用阿里云管理控制台来完成以下基本任务。
在这里插入图片描述

以上是我复制阿里云这样的

最近写项目遇上了上传的业务,中间经历了些许坎坷,写个博客总结一下。

开通OSS

阿里云官网
打开官网依次选择 产品-热门产品-对象存储oss
在这里插入图片描述
这里应该是立即开通,我已经开过了
开通后进入控制台
在这里插入图片描述

创建Bucket

在这里插入图片描述
创建Bucket的时候,会让你填写相关信息,一般来说我们只填名称和选择区域,其他都默认就好。

Bucket名称是唯一的,这个唯一同其他所有用户

区域就是你想把你东西存放到哪个地方,从功能来说,选哪个都一样。

选择完毕后,点击【确定】完成创建。
在这里插入图片描述

创建AccessKey

获取授权信息
在这里插入图片描述

第一次创建,会弹出这个东西。一般来说,个人的数据没有那么必要折腾,选择【继续使用AccessKey】。而如果是公司用的话,基于安全原因,一般选择【开始使用字用户AccessKey】
在这里插入图片描述
选择完毕后,点击【创建AccessKey】
在这里插入图片描述

然后他会向你发验证码,确认是否是本人操作,输入验证码后,就会得到相关的的 AccessKeyId 和 AccessKeySecret 了
在这里插入图片描述

demo

阿里云官方也提供了SDk示例 官方SDK

demo会根据实际项目开发的标准编写

pom.xml

        <!-- 阿里云oss依赖 -->
        <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>3.13.2</version>
        </dependency>

        <!-- 日期工具栏依赖 -->
        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
            <version>2.10.13</version>
        </dependency>

配置文件

server:
  port: 8089
  servlet:
    context-path: /

spring:
  datasource:
    url: jdbc:mysql:///alibaba?serverTimezone=GMT
    username: root
    password: root
  thymeleaf:
    prefix: classpath:/templates/pages/
    suffix: .html
    
logging:
  level:
    com.alibaba: DEBUG

aliyun:
  oss:
    file:
      endpoint: <<外网访问>>
      keyid: <<AccessKey ID>>
      keysecret: <<accessKeySecret>>
      bucketname: <<Bucket>
      folder: <<文件夹名>>

配置常量类读取配置信息

package com.alibaba.SpringBootDemo.entity;

import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class ConstanPropertiesUtils implements InitializingBean {
	
	//读取配置文件内容
    @Value("${aliyun.oss.file.endpoint}")
    private String endpoint;

    @Value("${aliyun.oss.file.keyid}")
    private String keyId;

    @Value("${aliyun.oss.file.keysecret}")
    private String keySecret;

    @Value("${aliyun.oss.file.bucketname}")
    private String bucketName;
    
    @Value("${aliyun.oss.file.folder}")
    private String folder;
    
  //定义公开静态常量
    public static String END_POIND;
    public static String ACCESS_KEY_ID;
    public static String ACCESS_KEY_SECRET;
    public static String BUCKET_NAME;
    public static String FOLDER;
    
    
	@Override
	public void afterPropertiesSet() throws Exception {
		END_POIND = endpoint;
        ACCESS_KEY_ID = keyId;
        ACCESS_KEY_SECRET = keySecret;
        BUCKET_NAME = bucketName;		
        FOLDER = folder;
	}
}

html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<h1>文件上传</h1>
<form method="post" action="/saveTbItemCat" enctype="multipart/form-data">
	<input type="file"  name="file" multiple="multiple"/><br/><br/>
	<input type="submit" value="上传" /><br/>
</form>
</body>
</html>
单文件上传
controllrt
    @PostMapping("saveTbItemCat")
    public CommonResult saveTbItemCat(TbItemCat tbItemCat, MultipartFile file){
        tbItemCatService.saveTbItemCat(tbItemCat,file);
        return CommonResult.success("新增成功");
    }
service
    //新增产品分类
    int saveTbItemCat(TbItemCat tbItemCat, MultipartFile file);
impl
  @Override
    public int saveTbItemCat(TbItemCat tbItemCat, MultipartFile file) {
        //分类照片不能为空
        if (StringUtils.isEmpty(file.getOriginalFilename())){
            throw new ServiceException("请选择照片");
        }
        // yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
        String endpoint = ConstanPropertiesUtils.END_POIND;
        // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
        String accessKeyId = ConstanPropertiesUtils.ACCESS_KEY_ID;
        String accessKeySecret = ConstanPropertiesUtils.ACCESS_KEY_SECRET;
        String bucketName = ConstanPropertiesUtils.BUCKET_NAME;

        try {
            // 创建OSSClient实例。
            OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
            // 获取文件流。
            InputStream inputStream = file.getInputStream();
            // 获取文件上传名称
            String fileName = file.getOriginalFilename();
            //添加唯一值
            String uuid = UUID.randomUUID().toString().replace("-", "");
            //合并名称
            fileName = uuid + fileName;
            //把文件按照日期进行分类
            String dataPath = new DateTime().toString("yyyy/MM/dd");
            //合并名称
            fileName = dataPath + "/" + fileName;
            ossClient.putObject(bucketName, fileName, inputStream);
            // 关闭OSSClient。
            ossClient.shutdown();
            //把上传文件路径返回
            String url = "https://" + bucketName + "." + endpoint + "/" + fileName;
            //将图片路径写入数据库
            tbItemCat.setItemImage(url);
            //将分类信息写入数据库
            int rows = tbItemCatDao.insertTbItemCat(tbItemCat);
            if (rows == 0) {
                throw new ServiceException("保存失败");
            }
            return rows;
        }catch (Exception e){
            e.printStackTrace();
            return 0;
        }
    }
测试

浏览器输入:http://localhost:8089/doLongin
在这里插入图片描述

删除文件
controller
    @GetMapping("/delete")
    public CommonResult delete(String url, Integer id){
        tbItemCatService.deleteBatchIds(id);
        tbItemCatService.removeFile(url);
        return CommonResult.success("删除成功");
    }
service
    //删除产品分类
    void deleteBatchIds(Integer id);
    
    //删除分类中的图片
    void removeFile(String url);
impl
   @Override
    public void deleteBatchIds(Integer ids) {
        //TODO 检查当前删除的菜单,是否被别的地方引用
        tbItemCatDao.deleteByids(ids);
    }
    @Override
    public void removeFile(String url) {
        // yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
        String endpoint = ConstanPropertiesUtils.END_POIND;
        // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
        String accessKeyId = ConstanPropertiesUtils.ACCESS_KEY_ID;
        String accessKeySecret = ConstanPropertiesUtils.ACCESS_KEY_SECRET;
        // 填写Bucket名称。
        String bucketName = ConstanPropertiesUtils.BUCKET_NAME;

        String host = "https://" + bucketName + "." + endpoint + "/";

        // 填写文件完整路径。文件完整路径中不能包含Bucket名称。
        String objectName = url.substring(host.length());

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

        // 删除文件或目录。如果要删除目录,目录必须为空。
        ossClient.deleteObject(bucketName, objectName);

        // 关闭OSSClient。
        ossClient.shutdown();

    }
批量上传
comtroller
    @PostMapping("saveOss")
    @ResponseBody
    @ApiImplicitParams({
            @ApiImplicitParam(name = "ordersn",value = "订单号",required = true)
    })
    public CommonResult saveOss(@RequestParam("file")MultipartFile[] file)throws Exception{
        System.out.println("数组的长度为" + file.length);
        for (int i = 0; i < file.length; i++){
            String originalFilename = file[i].getOriginalFilename();
            InputStream inputStream = file[i].getInputStream();
            ossService.saveMemberInformation(originalFilename,inputStream);
        }
        return CommonResult.success("上传成功");
    }
service
    Object saveMemberInformation(String fileNames, InputStream inputStreams);
impl
    @Override
    public Object saveMemberInformation(String fileNames, InputStream inputStreams){
        //通过工具类获取值
        String endpoint = ConstanPropertiesUtils.END_POIND;
        String accessKeyId = ConstanPropertiesUtils.ACCESS_KEY_ID;
        String accessKeySecret = ConstanPropertiesUtils.ACCESS_KEY_SECRET;
        String bucketName = ConstanPropertiesUtils.BUCKET_NAME;
        String folder = ConstanPropertiesUtils.FOLDER_INFORMATION;

        //创建OSS客户端
        OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);

        try {
            ConcurrentLinkedQueue concurrentLinkedQueue = new ConcurrentLinkedQueue(
                    Arrays.asList(fileNames));
            ConcurrentLinkedQueue<InputStream> streamConcurrentLinkedQueue = new ConcurrentLinkedQueue<>(
                    Arrays.asList(inputStreams));
            Iterator<InputStream> inputStreamss = streamConcurrentLinkedQueue.iterator();
            ConcurrentLinkedQueue c = new ConcurrentLinkedQueue();
            for (Iterator<String> iterator = concurrentLinkedQueue.iterator();
                 iterator.hasNext() && inputStreamss.hasNext(); ) {
                ossClient.putObject(new PutObjectRequest(bucketName, folder + fileNames, inputStreamss.next()));
                c.add(fileNames);
                System.out.println(fileNames);
                String url = "https://" + bucketName + "." + endpoint + "/" + folder + fileNames;
                System.out.println(url);
				
				//数据库信息写入
                Long token = JwtUtils.getMemberIdByJwtToken(request);
                UmsMemberOrderInformation information = new UmsMemberOrderInformation();
                information.setOrderSn(ordersn);
                information.setFileName(fileNames);
                information.setFilePath(url);
                information.setMemberId(token);
                information.setCreateTime(new Date());
                information.setUpdateTime(new Date());
                baseMapper.insert(information);
            }
            return (String[]) c.toArray(new String[0]);
        } catch (Exception e) {
            e.printStackTrace();
            System.err.println(e.getMessage());
        } finally {
            ossClient.shutdown();
        }
        return null;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值