Nest 实现OSS 服务端签名直传并设置上传回调

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
对象存储 OSS,内容安全 1000次 1年
简介: Nest 实现OSS 服务端签名直传并设置上传回调

回顾

前文《Nestjs+Vue实现阿里云OSS服务端签名直传》详细介绍了如何在 Nest 服务端基于 Post Policy 生成临时签名,响应给客户端,再由客户端实现文件直传 OSS 的过程。

这种方案的优点是能减轻应用服务器的压力,节省流量,最重要是安全。但是在客户端将文件上传到 OSS 的结果如何,文件存储的地址,文件大小等信息,客户端和服务端都全然不知。

所以在前面的基础上,可以再加上一个步骤,设置上传回调,这样 OSS 完成文件存储后,可以将相关信息响应给服务端,服务端将处理结果再响应给 OSS ,再由 OSS 将信息响应给客户端。整个流程如下:

流程图CN

准备

需要准备一个域名和一台有公网IP的服务器,将域名解析到服务器上,在服务器中运行 Nest 程序,用来和 OSS 服务通信。

存储桶的跨域设置

前文中将允许的来源设置为了 *,现在改为真实的域名。

在存储桶中选择“数据安全” - “跨域设置”,编辑跨域规则:

image-20230520133318328

Nest 服务端

使用前文示例的代码,只需要做一些小小的改动即可。

添加路由方法

oss.controller.ts 中新增一个控制器方法,用来处理 OSS 发来的回调请求。从请求头中解析出 x-oss-pub-key-url ,用来判断请求来源,并且从请求体中解析出文件信息。

import {
   
    Controller, Get, Post } from '@nestjs/common';
import {
   
    OssService } from './oss.service';
@Controller('oss')
export class OssController {
   
   
  constructor(private oss: OssService) {
   
   }

  // 接收 OSS 回调
  @Post('result')
  getResult(@Headers('x-oss-pub-key-url') xOssPubKeyUrl: string,  @Body() file: any) {
   
   
    return this.oss.getResult(xOssPubKeyUrl, file);
  }
}

添加服务方法

oss.service.ts 先修改原来的 getSignature 方法,生成签名等信息后,还要设置回调请求需要的参数:

async getSignature() {
   
   
    const config = {
   
   
      // ...
      // 设置上传回调URL,即回调服务器地址,用于处理应用服务器与 OSS 之间的通信
      // OSS 会在文件上传完成后,把文件信息通过此回调URL发送给应用服务器
      callbackUrl: 'http://kunwu.tech:3000/oss/result',
    };

    // 上传回调。
    const callback = {
   
   
      // 设置回调请求的服务器地址
      callbackUrl: config.callbackUrl,
      // 设置回调的内容,${object} 等占位符会由 OSS 进行填充
      // ${object}表示文件的存储路径,${mimeType}表示资源类型,对于图片类型的文件,可以通过${imageInfo.height}等去设置宽高信息
      callbackBody:
        'filename=${object}&size=${size}&mimeType=${mimeType}&height=${imageInfo.height}&width=${imageInfo.width}',
      // 设置回调的内容类型,也支持 application/json
      callbackBodyType: 'application/x-www-form-urlencoded',
    };

    // 响应给客户端的签名和策略等信息
    return {
   
   
      // ...
      // 传给客户端的回调参数,需要通过Buffer.from 对 JSON 进行 Base64 编码
      callback: Buffer.from(JSON.stringify(callback)).toString('base64'),
};

还需要再增加一个方法,来处理 OSS 发来的请求。它接收控制器传递的两个参数,判断请求来源是 OSS 服务器之后,就可以将文件信息响应给客户端:

async getResult(xOssPubKeyUrl: string, file: any) {
   
   
    // 通过 Base64 解码公钥地址
    const pubKeyAddr = Buffer.from(xOssPubKeyUrl, 'base64').toString('ascii');

    //  判断请求头中的 x-oss-pub-key-url 是否来源于OSS服务器
    if (!pubKeyAddr.startsWith('https://gosspublic.alicdn.com/')) {
   
   
      // 如果不是来源于OSS服务器,则返回 “verify not ok”,表明回调失败
      return {
   
   
        status: 'verify not ok',
      };
    }
    // 如果 x-oss-pub-key-url 来源于OSS服务器,则返回“Ok”和文件信息,表明回调成功
    return {
   
   
      status: 'Ok',
      file,
    };
}

前端

在前面的基础之上,现在向服务器请求签名信息返回的结果中会包含一条 callback

image-20230520140339812

向 OSS 上传文件时,需要将 callback 也携带上:

// 使用Policy和签名上传图片到 OSS
const handleUpload = async () => {
   
   
  // .....
  const ossData = await getOssData()

  // .....

  // 设置回调信息
  formdata.append('callback', ossData.callback)

}

在浏览器中选择一个文件上传到 OSS,查看下响应信息:

image-20230520140647166

可以看到,这个信息就是我们在服务端设置的 /oss/result 接口的返回的数据:

return {
   
   
 status: 'Ok',
 file,
};

总结

代码已上传,点击这里查看

本文在上篇文章的基础上,增加了设置回调请求的步骤,这样就形成了一个完整的闭环:

  1. 客户端上传文件前,先请求临时签名

  2. 服务端生成临时签名,并设置回调请求地址

  3. 客户端拿到签名、回调请求地址等信息后,将文件上传到 OSS

  4. OSS 完成文件存储后,按照回调地址将结果发送给服务器
  5. 服务器处理完后,将结果响应给 OSS
  6. 最后 OSS 将结果响应给客户端

这一块内容在文档中有详细的介绍,可以参考:

相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
目录
相关文章
|
1月前
|
弹性计算 前端开发 小程序
微信小程序上传文件至阿里云OSS直传(java后端签名+前端直传)
当前的通用文件上传方式是通过前端上传到服务器,再由服务器转存至对象存储。这种方式在处理小文件时效率尚可,但大文件上传因受限于服务器带宽,速度较慢。例如,一个100MB的文件在5Mbps带宽的阿里云ECS上上传至服务器需160秒。为解决此问题,可以采用后端签名的方式,使微信小程序直接上传文件到阿里云OSS,绕过服务器中转。具体操作包括在JAVA后端引入相关依赖,生成签名,并在微信小程序前端使用这个签名进行文件上传,注意设置正确的请求头和formData参数。这样能提高大文件上传的速度。
|
18天前
|
DataWorks 安全 关系型数据库
DataWorks产品使用合集之同步数据到OSS时,文件的切分单位如何设置
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
19小时前
|
分布式计算 DataWorks API
DataWorks操作报错合集之在将ODPS空间设置成保护模式后,导出到OSS的任务出现了权限问题,该怎么解决
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
9 1
|
15天前
|
Web App开发 前端开发 安全
设置跨域规则后调用OSS时仍然报“No ‘Access-Control-Allow-Origin‘”的错误
设置跨域规则后调用OSS时仍然报“No ‘Access-Control-Allow-Origin‘”的错误
27 0
|
18天前
|
机器学习/深度学习 人工智能 分布式计算
人工智能平台PAI产品使用合集之在easy_rec中,将model_dir设置为oss地址时,oss相关配置需要加载在环境中,有完整的示例吗
阿里云人工智能平台PAI是一个功能强大、易于使用的AI开发平台,旨在降低AI开发门槛,加速创新,助力企业和开发者高效构建、部署和管理人工智能应用。其中包含了一系列相互协同的产品与服务,共同构成一个完整的人工智能开发与应用生态系统。以下是对PAI产品使用合集的概述,涵盖数据处理、模型开发、训练加速、模型部署及管理等多个环节。
|
1月前
|
存储 安全 API
对象存储OSS产品常见问题之在URL中包含签名如何解决
对象存储OSS是基于互联网的数据存储服务模式,让用户可以安全、可靠地存储大量非结构化数据,如图片、音频、视频、文档等任意类型文件,并通过简单的基于HTTP/HTTPS协议的RESTful API接口进行访问和管理。本帖梳理了用户在实际使用中可能遇到的各种常见问题,涵盖了基础操作、性能优化、安全设置、费用管理、数据备份与恢复、跨区域同步、API接口调用等多个方面。
|
1月前
|
存储 小程序 API
oss防盗链设置(Referer Configuration)
oss防盗链设置(Referer Configuration)
356 5
|
1月前
|
分布式计算 大数据 MaxCompute
MaxCompute产品使用合集之使用pyodps读取OSS(阿里云对象存储)中的文件的步骤是什么
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
18天前
|
SQL 分布式计算 DataWorks
DataWorks产品使用合集之如何将CSV文件从阿里云OSS同步到ODPS表,并且使用列作为表分区
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
DataWorks产品使用合集之如何将CSV文件从阿里云OSS同步到ODPS表,并且使用列作为表分区
|
1月前
|
SQL 分布式计算 监控
基于阿里云 EMR Serverless Spark 版快速搭建OSS日志分析应用
本文演示了使用 EMR Serverless Spark 产品搭建一个日志分析应用的全流程,包括数据开发和生产调度以及交互式查询等场景。
56450 7
基于阿里云 EMR Serverless Spark 版快速搭建OSS日志分析应用

热门文章

最新文章

相关产品

  • 对象存储