流程介绍

和数据直传到OSS相比,以上方法有三个缺点:

  • 上传慢:用户数据需先上传到应用服务器,之后再上传到OSS。网络传输时间比直传到OSS多一倍。如果用户数据不通过应用服务器中转,而是直传到OSS,速度将大大提升。而且OSS采用BGP带宽,能保证各地各运营商之间的传输速度。
  • 扩展性差:如果后续用户多了,应用服务器会成为瓶颈。
  • 费用高:需要准备多台应用服务器。由于OSS上传流量是免费的,如果数据直传到OSS,不通过应用服务器,那么将能省下几台应用服务器。

技术方案

目前通过Web前端技术上传文件到OSS,有三种技术方案:

  • 利用OSS Browser.js SDK将文件上传到OSS

    该方案通过OSS Browser.js SDK直传数据到OSS,详细的SDK Demo请参见上传文件。在网络条件不好的状况下可以通过断点续传的方式上传大文件。该方案在个别浏览器上有兼容性问题,目前兼容IE10及以上版本浏览器,主流版本的Edge、Chrome、Firefox、Safari浏览器,以及大部分的Android、iOS、WindowsPhone手机上的浏览器。更多信息请参见安装Browser.js SDK。
    使用表单上传方式,将文件上传到OSS

  • 利用OSS提供的PostObject接口,使用表单上传方式将文件上传到OSS。该方案兼容大部分浏览器,但在网络状况不好的时候,如果单个文件上传失败,只能重试上传。操作方法请参见PostObject上传方案。

  • 通过小程序上传文件到OSS

  • 通过小程序,如微信小程序和支付宝小程序,利用OSS提供的PostObject接口来实现表单上传。操作方式请参见微信小程序直传实践和支付宝小程序直传实践。

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

为了解决海量数据存储与弹性扩容,项目中我们采用云存储的解决方案- 阿里云OSS。

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


二、控制台使用

1、创建Bucket

命名:srb-file
读写权限:公共读

2、上传默认头像

创建文件夹avatar,上传默认的用户头像

三、使用RAM子用户

1、进入子用户管理页面


2、添加用户

3、获取子用户key

AccessKeyId, AccessKeySecret

4、设置用户权限

授权:AliyunOSSFullAccess

四、落地实现

1、创建模块

service-oss

2、配置pom.xml

<dependencies><dependency><groupId>com.atguigu</groupId><artifactId>service-base</artifactId><version>0.0.1-SNAPSHOT</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--lombok用来简化实体类:需要安装lombok插件--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!--aliyunOSS--><dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId></dependency><!-- 日期工具栏依赖 --><dependency><groupId>joda-time</groupId><artifactId>joda-time</artifactId></dependency><!--让自定义的配置在application.yaml进行自动提示--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency>
</dependencies>

3、配置application.yml

server:port: 8130 # 服务端口spring:profiles:active: dev # 环境设置application:name: service-oss # 服务名aliyun:oss:endpoint: 你的endponitkeyId: 你的阿里云keyidkeySecret: 你的阿里云keysecretbucketName: srb-file

五、实现文件上传

1、从配置文件读取常量

  • 创建常量读取工具类:OssProperties.java
package com.atguigu.srb.oss.util;@Setter
@Getter
@Component
@ConfigurationProperties(prefix = "aliyun.oss")
public class OssProperties implements InitializingBean {private String endpoint;private String keyId;private String keySecret;private String bucketName;public static String ENDPOINT;public static String KEY_ID;public static String KEY_SECRET;public static String BUCKET_NAME;//当私有成员被赋值后,此方法自动被调用,从而初始化常量@Overridepublic void afterPropertiesSet() throws Exception {ENDPOINT = endpoint;KEY_ID = keyId;KEY_SECRET = keySecret;BUCKET_NAME = bucketName;}
}

2、文件上传业务

  • 创建Service接口:FileService.java
package com.atguigu.srb.oss.service;import java.io.InputStream;public interface FileService {/*** 文件上传至阿里云*/String upload(InputStream inputStream, String module, String fileName);/*** 文件移除* @param url*/void removeFile(String url);
}
  • 实现:FileServiceImpl.java
package com.atguigu.srb.oss.service.impl;import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.CannedAccessControlList;
import com.atguigu.srb.oss.service.FileService;
import com.atguigu.srb.oss.util.OssProperties;
import org.joda.time.DateTime;
import org.springframework.stereotype.Service;import java.io.InputStream;
import java.util.UUID;@Service
public class FileServiceImpl implements FileService {@Overridepublic String upload(InputStream inputStream, String module, String fileName) {// 创建OSSClient实例。OSS ossClient = new OSSClientBuilder().build(OssProperties.ENDPOINT,OssProperties.KEY_ID,OssProperties.KEY_SECRET);// 判断BUCKET_NAME是否存在if(!ossClient.doesBucketExist(OssProperties.BUCKET_NAME)){ossClient.createBucket(OssProperties.BUCKET_NAME);ossClient.setBucketAcl(OssProperties.BUCKET_NAME, CannedAccessControlList.PublicRead);}// 上传文件流。// 文件目录结构 "avatar/2021/02/27/uuid.jpg"//构建日期路径String timeFolder = new DateTime().toString("/yyyy/MM/dd/");//文件名生成fileName = UUID.randomUUID().toString() + fileName.substring(fileName.lastIndexOf("."));String key = module + timeFolder + fileName;ossClient.putObject(OssProperties.BUCKET_NAME, key, inputStream);// 关闭OSSClient。ossClient.shutdown();//文件的url地址//https:// bucketname   .  endpoint / + keyreturn "https://" + OssProperties.BUCKET_NAME + "." + OssProperties.ENDPOINT + "/" + key;}@Overridepublic void removeFile(String url) {// 创建OSSClient实例。OSS ossClient = new OSSClientBuilder().build(OssProperties.ENDPOINT,OssProperties.KEY_ID,OssProperties.KEY_SECRET);// https://srb-file-200921.oss-cn-beijing.aliyuncs.com/// test/2021/02/27/f1673221-efb4-4356-98f4-9f0595caa927.jpgString host = "https://" + OssProperties.BUCKET_NAME + "." + OssProperties.ENDPOINT + "/";String objectName = url.substring(host.length());// 删除文件。如需删除文件夹,请将ObjectName设置为对应的文件夹名称。如果文件夹非空,则需要将文件夹下的所有object删除后才能删除该文件夹。ossClient.deleteObject(OssProperties.BUCKET_NAME, objectName);// 关闭OSSClient。ossClient.shutdown();}
}

3、控制层

  • 创建controller.admin:FileController.java
package com.atguigu.srb.oss.controller.api;import com.atguigu.common.exception.BusinessException;
import com.atguigu.common.result.R;
import com.atguigu.common.result.ResponseEnum;
import com.atguigu.srb.oss.service.FileService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;import javax.annotation.Resource;
import java.io.IOException;
import java.io.InputStream;@Api(tags = "阿里云文件管理")
@CrossOrigin //跨域
@RestController
@RequestMapping("/api/oss/file")
public class FileController {@Resourceprivate FileService fileService;@ApiOperation("文件上传")@PostMapping("/upload")public R upload(@ApiParam(value= "文件", required = true)@RequestParam("file") MultipartFile file,@ApiParam(value = "模块", required = true)@RequestParam("module") String module){try {InputStream inputStream = file.getInputStream();String originalFilename = file.getOriginalFilename();String url = fileService.upload(inputStream, module, originalFilename);return R.ok().message("文件上传成功").data("url", url);} catch (IOException e) {throw new BusinessException(ResponseEnum.UPLOAD_ERROR, e);}}@ApiOperation("删除oss文件")@DeleteMapping("/remove")public R remove(@ApiParam(value = "要删除的文件", required = true)@RequestParam("url") String url){fileService.removeFile(url);return R.ok().message("删除成功");}
}

阿里云存储OSS(服务端直传)相关推荐

  1. 分布式电商项目二十六:使用阿里云存储的服务端签名后直传(前端联调)

    使用阿里云存储的服务端签名后直传(前端联调) 在前端显示上传的界面,可以根据人人fast-vue的结构,在src\components目录下添加upload文件夹,直接添加vue组件即可,总计三个组件 ...

  2. SpringBoot集成阿里云存储OSS服务

    前言 该文章会先简单的介绍一下阿里云的OSS存储,然后演示如何在SpringBoot项目中集成OSS,每一步都有记录,保证初学者也能看懂. 文章目录 前言 1.阿里云存储OSS是什么? 2.Sprin ...

  3. 阿里云存储OSS中设置上传文件content type

    阿里云存储OSS中设置上传文件ContentType 如果你使用浏览器上传文件,则浏览器会自动在header中设置正确地content type,然后对文件的访问会得到正确地回应. 如果采用编程的方式 ...

  4. 阿里云号码认证服务服务端PHP版

    TP5.1写的api 官方接入说明:https://github.com/aliyun/openapi-sdk-php/blob/master/README-zh-CN.md?spm=a2c4g.11 ...

  5. 【虚拟专用网】阿里云ubuntu服务器服务端和windows11客户端搭建

    安装包和依赖 安装软件依赖 apt-get install openssl libssl-dev apt-get install lzop 安装 OpenVPN 和 Easy-RSA apt inst ...

  6. SpringBoot集成腾讯云存储COS服务

    前言 该文章会先简单的介绍一下腾讯云的COS存储,然后演示如何在SpringBoot项目中集成COS,每一步都有记录,保证初学者也能看懂. 文章目录 前言 1.腾讯云对象存储介绍 1.1.开通&quo ...

  7. 解码2017双11:全球狂欢新记录背后的阿里云存储

    摘要: 2017天猫双11再次刷新纪录,这背后是大数据的支撑和阿里云计算的能力的体现.手淘.天猫APP主站的所有图片和视频都存储在阿里云对象存储OSS之上,全球数以亿计的消费者,对这些商品的访问的流量 ...

  8. 阿里云OSS服务端签名前端JS直传(php)示例

    阿里云OSS服务端签名后前端JS直传(php)示例 需求:服务端上传图片太慢,需要使用前端直传的方式.但前端把阿里云的 AccessKey ID 和 AccessKey Secret 放在前端文件中会 ...

  9. 阿里云对象存储OSS服务开通

    一.阿里云对象存储OSS服务开通 1.开通"对象存储OSS"服务 2.进入管理控制台 二.控制台使用 1.创建Bucket 命名:srb-file 读写权限:公共读 2.上传默认头 ...

最新文章

  1. 我的Linux生涯之文件链接
  2. DeepFake疑遭审查
  3. flask-blueprint的简单使用
  4. redis将散裂中某个值自增_0基础掌握Django框架(49)Redis
  5. Linux驱动小技巧 | 利用DRIVER_ATTR实现调用内核函数
  6. Handler基本概念
  7. 好的文案,极大的降低沟通成本
  8. scala几种循环判断语句_Scala循环控制语句– while,while和for循环
  9. 使用XUtils进行文件的断点下载
  10. 一个类的两个接口有同名函数,JAVA如何调用
  11. 北斗卫星导航系统基础篇之(二)
  12. python解析pdf乱码,python pdfkit 中文乱码问题的解决方案
  13. 网易MuMu模拟器安装及配置
  14. 爬虫:信息提取的一般方法
  15. openWRT的DTS文件配置--MT7620A
  16. 抽奖 html5 jquery,jquery实现抽奖系统
  17. 最大流/最小割算法总结
  18. 无线通信技术(习题课)
  19. PVE+集客AC+K2T-AP
  20. 对B/S架构和C/S架构的分析

热门文章

  1. 浙江省机电工程师职称评审条件及流程
  2. 猎豹浏览器关掉图片显示
  3. 【JavaScript】- 实现图片放大镜效果
  4. 智能家居实体门店老板如何搭建线上运营体系,实现业绩倍增?
  5. opencv实现哈哈镜变换
  6. 计算机通信属于那一类商标,通讯服务商标注册属于第几类?
  7. RBO 和CBO分析
  8. 杨国安教授对企业生命周期的解读
  9. tcpdump 和Wireshark抓包
  10. 最适合手机的linux系统,10大主流Linux系统大盘点,总有一个适合你