四步解决!OSS对象存储文件上传功能(服务端签名后直传,建议收藏)

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
对象存储 OSS,内容安全 1000次 1年
简介: 四步解决!OSS对象存储文件上传功能(服务端签名后直传,建议收藏)

普通上传方式


20210608165713393.png

普通上传方式通过InputStream作为OSS文件的数据源。用户(浏览器)把文件交给我们自已的服务器,再由服务器携带相关验证信息上传文件至阿里云,这种方式每上传一次,文件就会经过一次我们自已的服务器(占用大量带宽),我们的服务器也会在大量的用户下带来瓶颈。影响服务器处理别的请求,大大降低了效率。

服务端签名后直传

20210608165612327.png

服务端签名后直传是通过用户(浏览器)发起请求到我们自已的服务器中进行验证,验证通过后服务器会根据阿里云的账号密码生成一段policy(防伪签名) 返回给我们用户(浏览器),policy中包含了访问阿里云的授权令牌,以及要上传给阿里云哪个地址哪个位置等相关信息, 需要注意的是这段签名中并没有账号密码,用户(浏览器)拿到签名后可以直接通过我们浏览器将文件上传至阿里云(阿里云可以验证签名是否正确)。不会对服务端产生压力,而且安全可靠。


服务端签名后直传原理如下:

  1. 用户发送上传Policy请求到应用服务器
  2. 应用服务器返回上传Policy和签名给用户
  3. 用户之间上传数据到OSS


阿里云官方


20210609145441587.png

官方地址:阿里云帮助文档

1da32363c8854816b2776cc53214d678.gif

下面我们通过官方文档四步实现服务端签名后直传的代码编写。


一. 接入OSS(导入相关依赖)

这里推荐 Spring Cloud Alibaba-OSS 封装好的对象存储,只需要添加一些注解和少量配置,就可以完成文件上传操作。


20210609133154388.png

1.导入 starter (依赖)

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>aliyun-oss-spring-boot-starter</artifactId>
</dependency>

导入成功之后我们进入源码发现它会自已帮我们导入原生的sdk

20210609140239192.png

找不到相关依赖的解决方案: 完美解决导入aliyun-oss-spring-boot-starter导入依赖报错

  1. yml配置文件中配置OSS服务对应的accessKeysecretKeyendpoint
alibaba:
  cloud:
    access-key: LTAI5tGDG4tqfdsfsfW2xQF             #账号 AccessKey
    secret-key: du12BXlruM8gfgfdfgpvxTekRxQSjw      #密码 secretKey
    oss:
      endpoint: oss-cn-beijing.aliyuncs.com         #给哪块进行上传 endpoint
      bucket: md-ossbucket                #自定义属性,bucket名称

二. 开通AccessKey(访问秘钥)

不会的可以参考下方教程。
点击跳转:3分钟教你开通阿里云AccessKey秘钥,并完成对应授权!


三. 编写后端接口

package com.oss.controller;
import com.aliyun.oss.OSS;
import com.aliyun.oss.common.utils.BinaryUtil;
import com.aliyun.oss.model.MatchMode;
import com.aliyun.oss.model.PolicyConditions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.Map;
@RestController
public class OssController {
  @Autowired
  OSS ossClient;
  @Value("${alibaba.cloud.oss.endpoint}")
  private String endpoint;    //从yml文件中读取
  @Value("${alibaba.cloud.oss.bucket}")
  private String bucket;      //从yml文件中读取
  @Value("${alibaba.cloud.access-key}")
  private String accessId;  //从yml文件中读取
  @GetMapping("/oss/policy")
  @CrossOrigin
  public Map<String, String> policy(){
    //https://md-ossbucket.oss-cn-beijing.aliyuncs.com/QQ%E6%88%AA%E5%9B%BE20210609114525.png  host的格式为 bucketname.endpoint
    String host = "https://" + bucket + "." + endpoint;
    String format = new SimpleDateFormat("yyyy-MM-dd").format(new Date()); //格式化一个当前的服务器时间
    String dir = format+"/"; // 用户上传文件时指定的前缀,我们希望以日期作为一个目录
    Map<String, String> respMap =null; //返回结果
    try {
      long expireTime = 30;
      long expireEndTime = System.currentTimeMillis() + expireTime * 1000;
      Date expiration = new Date(expireEndTime);
      // PostObject请求最大可支持的文件大小为5 GB,即CONTENT_LENGTH_RANGE为5*1024*1024*1024。
      PolicyConditions policyConds = new PolicyConditions();
      policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, 1048576000);
      policyConds.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, dir);
      String postPolicy = ossClient.generatePostPolicy(expiration, policyConds);
      byte[] binaryData = postPolicy.getBytes("utf-8");
      String encodedPolicy = BinaryUtil.toBase64String(binaryData);
      String postSignature = ossClient.calculatePostSignature(postPolicy);
      respMap = new LinkedHashMap<String, String>();
      respMap.put("accessid", accessId);
      respMap.put("policy", encodedPolicy);
      respMap.put("signature", postSignature);
      respMap.put("dir", dir);
      respMap.put("host", host);
      respMap.put("expire", String.valueOf(expireEndTime / 1000));
      // respMap.put("expire", formatISO8601Date(expiration));
    } catch (Exception e) {
      // Assert.fail(e.getMessage());
      System.out.println(e.getMessage());
    } finally {
      ossClient.shutdown();
    }
    return respMap;
  }
}

测试接口

2021060915352313.png

以后前台想要上传文件,需要给我们后台发送这个请求,拿到签名数据,携带签名数据以及要上传的文件提交给阿里云,阿里云会进行校验以及存储相关的文件。


四.编写前端代码

最后我们可以使用Vue+ElementUI(文件上传组件)来实现,这里就不进行前台的演示了。


8802d1dae33d4e99a0016f6190b838a6.png

谢谢观看,一键三连加关注!


相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
相关文章
|
2月前
|
弹性计算 前端开发 小程序
微信小程序上传文件至阿里云OSS直传(java后端签名+前端直传)
当前的通用文件上传方式是通过前端上传到服务器,再由服务器转存至对象存储。这种方式在处理小文件时效率尚可,但大文件上传因受限于服务器带宽,速度较慢。例如,一个100MB的文件在5Mbps带宽的阿里云ECS上上传至服务器需160秒。为解决此问题,可以采用后端签名的方式,使微信小程序直接上传文件到阿里云OSS,绕过服务器中转。具体操作包括在JAVA后端引入相关依赖,生成签名,并在微信小程序前端使用这个签名进行文件上传,注意设置正确的请求头和formData参数。这样能提高大文件上传的速度。
|
14天前
|
分布式计算 大数据 MaxCompute
MaxCompute产品使用合集之使用pyodps读取OSS(阿里云对象存储)中的文件的步骤是什么
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
15天前
|
运维 Java Serverless
Serverless 应用引擎产品使用之数据文件(例如sdxl)超过了OSS(对象存储服务)的单个上传大小限制(5GB)如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
21 1
|
26天前
|
存储 安全 API
对象存储OSS产品常见问题之在URL中包含签名如何解决
对象存储OSS是基于互联网的数据存储服务模式,让用户可以安全、可靠地存储大量非结构化数据,如图片、音频、视频、文档等任意类型文件,并通过简单的基于HTTP/HTTPS协议的RESTful API接口进行访问和管理。本帖梳理了用户在实际使用中可能遇到的各种常见问题,涵盖了基础操作、性能优化、安全设置、费用管理、数据备份与恢复、跨区域同步、API接口调用等多个方面。
49 0
|
27天前
|
存储 数据可视化 安全
对象存储OSS产品常见问题之有几十亿个txt文件,单个4kb,使用oss如何解决
对象存储OSS是基于互联网的数据存储服务模式,让用户可以安全、可靠地存储大量非结构化数据,如图片、音频、视频、文档等任意类型文件,并通过简单的基于HTTP/HTTPS协议的RESTful API接口进行访问和管理。本帖梳理了用户在实际使用中可能遇到的各种常见问题,涵盖了基础操作、性能优化、安全设置、费用管理、数据备份与恢复、跨区域同步、API接口调用等多个方面。
54 11
|
27天前
|
存储 弹性计算 文件存储
对象存储OSS产品常见问题之OSS Bucket 创建好后更改存储类型如何解决
对象存储OSS是基于互联网的数据存储服务模式,让用户可以安全、可靠地存储大量非结构化数据,如图片、音频、视频、文档等任意类型文件,并通过简单的基于HTTP/HTTPS协议的RESTful API接口进行访问和管理。本帖梳理了用户在实际使用中可能遇到的各种常见问题,涵盖了基础操作、性能优化、安全设置、费用管理、数据备份与恢复、跨区域同步、API接口调用等多个方面。
49 0
|
27天前
|
JavaScript 网络安全 开发工具
对象存储oss使用问题之文件上传在暂停时报错:ResponseError: socket hang up如何解决
《对象存储OSS操作报错合集》精选了用户在使用阿里云对象存储服务(OSS)过程中出现的各种常见及疑难报错情况,包括但不限于权限问题、上传下载异常、Bucket配置错误、网络连接问题、跨域资源共享(CORS)设定错误、数据一致性问题以及API调用失败等场景。为用户降低故障排查时间,确保OSS服务的稳定运行与高效利用。
41 0
|
27天前
|
运维 编译器 API
对象存储oss使用问题之进行文件上传时报错java.io.EOFException如何解决
《对象存储OSS操作报错合集》精选了用户在使用阿里云对象存储服务(OSS)过程中出现的各种常见及疑难报错情况,包括但不限于权限问题、上传下载异常、Bucket配置错误、网络连接问题、跨域资源共享(CORS)设定错误、数据一致性问题以及API调用失败等场景。为用户降低故障排查时间,确保OSS服务的稳定运行与高效利用。
29 0
|
27天前
|
安全 网络安全 开发工具
对象存储oss使用问题之flutter使用http库进行post请求文件上传返回400如何解决
《对象存储OSS操作报错合集》精选了用户在使用阿里云对象存储服务(OSS)过程中出现的各种常见及疑难报错情况,包括但不限于权限问题、上传下载异常、Bucket配置错误、网络连接问题、跨域资源共享(CORS)设定错误、数据一致性问题以及API调用失败等场景。为用户降低故障排查时间,确保OSS服务的稳定运行与高效利用。
41 1
|
1月前
|
开发工具 对象存储
阿里云OSS文件上传
阿里云OSS文件上传
76 0