文件直传 OSS 实践(一):服务端篇

前言

在日常开发中,客户端上传文件的典型过程是客户端向服务器发送文件,然后将文件从服务器转储到专用存储服务器或云计算供应商的存储服务(如阿里云OSS),通过将文件从客户端直接传输到第三方存储服务,可以避免此问题。

本文以阿里云对象存储服务(OSS)为例,详细说明了将文件从客户端直接传递到OSS的整个过程,并提效率的拼音供了如何打开整个htm阿里嘎多l文件的代码演示。

阿里嘎多缺点

从客户机-服务器-阿里供应链OSS的传输模式改为客户机-Ohtml文件怎么打开SS模式,最大的好处是省略了上传服务器效率符号的这一步,上传效率高,速度快(相对于普通服务器的带宽,可以认为是OSS)

字符串是什么意思然,这种模式也有缺点。也就是说,增加了很多额外的开发工字符串逆序输出工html网页制作架构图模板量,主要由两阿里巴巴1688货源批发官网部分组成。(莎字符士比亚,《北方发展》)。

(1)服务器端添加字符生成效率意识方面存在的问题上传阿里嘎多OSS凭据的代码。Html个人主页完整代码

(2)客户HTML端添加从服务器接收上传OSS凭据的代码,并适应直达OSS。

总的来说,效率公式直通模式除了增加文字效率公式间隔点开发工作量外,在体系结构层面上几乎没有缺点。

流程

实际上,整个过程效率符号非常简单,由两个阶段组成。

(1)客户端直接html向服务器端发送html代码请求,以获取OSS凭据。

(2)客户端将文件上传到O效率意识方面存在的问题阿里SS,并携带证阿里云书。

逻辑拆html5架构图怎么制作

关于如何生成凭据(也称为签名效率是什么意思),请参阅正式文档(help.aliyun字符常量.com/document _ de).)可以阅读,但由于文档生成时间快,对初学者来说很效率意识方面存在的问题难理解效率意味着什么,所以本文通过效率计算公式展示了整个过程。

在整个上传OSS凭据生成过程中,实际上执行了以下几项任务:

(1)上传凭证由pohtml简单网页代码licy提供,Genali员工离职感想是根据个人构成生成文字的policy。

(2)上载链接已与开发人员服务器分离,因此policy可以定义各种限制,包括最大卷上载、文件名等。

(3)将policy转换为指定的格式。

a-i字符常量d=”heading-4″>代码实现

我们先考虑将流程的每一步实现,然后再将流程代码阿里巴巴股票封装成函数。 ​

OSS 配置

首先定义字符架构师和程序员的区别间距 OSS 的配置文件,关于配置项的内容,可以参考文档:help.aliyun.com/document_de… ​

/** OSS 配置项 */
const ossConfig = {
  bucket: 'xxxxxxxx',
  accessKeyId: 'xxxxxxxx',
  accessKeySecret: 'xxxxxxxx',
  /** OSS 绑定的域名 */
  url: 'xxxxxxxx',
}

policy 内容

对于 policy ,有很多配置项,字符型变量我们先考虑生成“写死”的模式,然后再优化阿里拍卖为由函数阿里供应链参数传入配置项。以下是一个最基础的 policy 。 ​

有效期

首先定义一个有效时长(单位:毫秒),然后该凭证的有效截止时间则为“当前时间 + 有效时长”,最后需要转化为 ISO 时间字符串格式架构。 ​

/** 有效时长:例如 4 小时 */
const timeout = 4 * 60 * 60 * 1000
/** 到期时间:当前时间 + 有效时间 */
const expiration = new Date(Date.now() + timeout).toISOString()

文件名

文件名建议使用 UUID(笔者习惯性使用去掉短横线的 UUID),避免重复。 ​

import { v4 as uuidv4 } from 'uuid'
/** 随机文件名(去掉短横线的 uuid) */
const filename = uuidv4().replace(/-/gu, '')

一般架构图建议按照不同的业务模块,将文件划分不同的目录,例如这里使用 file 目录,那么完效率集整的 OSS 文件路径则为: ​

/** 目录名称 */
const dirname = 'file'
/** 文件路径 */
const key = dirname + '/' + filename

需要注意的是,文件路径不能以架构 “/” 开头(OSS 本身的要求)。 ​

将以上内容整合,就形成了 polic架构工程师y 文本,以下是一阿里巴巴股票个基础格式: ​

const policyText = {
  expiration: expiration,
  conditions: [
    ['eq', '$bucket', ossConfig.bucket],
    ['eq', '$key', key],
  ],
}

转化 p效率公式olicy

policyText 转化为 Base64html个人网页完整代码 格式后,就是要求字符型变量policy 了。

// 将 policyText 转化为 Base64 格式
const policy = Buffer.from(JSON.stringify(policyText)).toString('base64')

然后对HTML policy 使用 OS阿里巴巴1688货源批发官网S 密钥使用 Hmac架构图怎么画Sha1 算法签名签名。字符是什么

import * as crypto from 'crypto'
// 使用 HmacSha1 算法签名
const signature = crypto.createHmac('sha1', ossConfig.accessKeySecret).update(policy, 'utf8').digest('base64')

最后将上述流程中的相关字架构师证书效率意识方面存在的问题段返回给客户端,即为“上传凭证”。html标签

进一步分析

以上完整演示了整个流程,我们进一步分析,如何将其封装为一架构师效率公式工资个通用性html5的函数。 ​

(1)凭证的有效时长可以根据不同的业务模块分别定义,于是架构图怎么制作做成函数配置项。

(2)目录名称也可以做成配置项。

(3) policy 还有阿里众包更多的配置内容(见文档 help字符是什么.aliyun.com/document_de…),可以抽取一部分做成配置项,例阿里巴巴批发网官网如“允许上传的最大体积”。 ​

完整代码

以下是封装为“服务”的使用 Nes阿里巴巴1688货源批发官网t.js Web 框架的相关代码,来源自笔者的线上项目(略有调整和删改),供参考。 ​

import { Injectable } from '@nestjs/common'
import * as crypto from 'crypto'
import { v4 as uuidv4 } from 'uuid'
export interface GenerateClientTokenConfig {
  /** 目录名称 */
  dirname: string
  /** 有效时间,单位:小时 */
  expiration?: number
  /** 上传最大体积,单位:MB */
  maxSize?: number
}
/** 直传凭证 */
export interface ClientToken {
  key: string
  policy: string
  signature: string
  OSSAccessKeyId: string
  url: string
}
export interface OssConfig {
  bucket: string
  accessKeyId: string
  accessKeySecret: string
  url: string
}
@Injectable()
export class OssService {
  private readonly ossConfig: OssConfig
  constructor() {
    this.ossConfig = {
      bucket: 'xxxxxxxx',
      accessKeyId: 'xxxxxxxx',
      accessKeySecret: 'xxxxxxxx',
      /** OSS 绑定的域名 */
      url: 'xxxxxxxx',
    }
  }
  /**
   * 生成一个可用于客户端直传 OSS 的调用凭证
   *
   * @param config 配置项
   *
   * @see [配置内容](https://help.aliyun.com/document_detail/31988.html#title-6w1-wj7-q4e)
   */
  generateClientToken(config: GenerateClientTokenConfig): ClientToken {
    /** 目录名称 */
    const dirname = config.dirname
    /** 有效时间:默认 4 小时 */
    const timeout = (config.expiration || 4) * 60 * 60 * 1000
    /** 上传最大体积,默认 100M */
    const maxSize = (config.maxSize || 100) * 1024 * 1024
    /** 随机文件名(去掉短横线的 uuid) */
    const filename = uuidv4().replace(/-/gu, '')
    /** 文件路径 */
    const key = dirname + '/' + filename
    /** 到期时间:当前时间 + 有效时间 */
    const expiration = new Date(Date.now() + timeout).toISOString()
    const { bucket, url, accessKeyId } = this.ossConfig
    const policyText = {
      expiration: expiration,
      conditions: [
        ['eq', '$bucket', bucket],
        ['eq', '$key', key],
        ['content-length-range', 0, maxSize],
      ],
    }
    // 将 policyText 转化为 Base64 格式
    const policy = Buffer.from(JSON.stringify(policyText)).toString('base64')
    // 使用 HmacSha1 算法签名
    const signature = crypto.createHmac('sha1', this.ossConfig.accessKeySecret).update(policy, 'utf8').digest('base64')
    return { key, policy, signature, OSSAccessKeyId: accessKeyId, url }
  }
}

在完整以上服阿里巴巴批发网官网务方法后,后续就可以在“控制器”层调用该方法用于分发上传凭证,客户端可直接使用该上传凭证将文件直传至 OSS 中。 ​

文件直传 OSS 实践(一):服务端篇

发表评论

提供最优质的资源集合

立即查看 了解详情