我的编程空间,编程开发者的网络收藏夹
学习永远不晚

基于服务端怎么实现OSS文件直传

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

基于服务端怎么实现OSS文件直传

这篇文章主要介绍“基于服务端怎么实现OSS文件直传”,在日常操作中,相信很多人在基于服务端怎么实现OSS文件直传问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”基于服务端怎么实现OSS文件直传”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

    优缺点

    从“客户端 — 服务器 — OSS”的传输模式,变更为“客户端 — OSS”的模式,最大的好处是,省掉了上传服务器的这一步,上传效率更高,速度更快(相比较于一般服务器的带宽,可以认为 OSS 的宽带是“几乎无限”的)。

    当然该模式也有缺点,那就是增加了很多额外的开发工作量,主要包含 2 部分:

    (1)服务端增加生成上传 OSS 凭证的代码。

    (2)客户端增加从服务端获取上传 OSS 凭证的代码和对直传 OSS 进行适配。

    整体而言,直传模式除了增加一点开发工作量以外,从架构层面,几乎没有任何缺点。

    流程

    实际上,整个流程非常简单,包含了两步:

    (1)客户端向服务端发送请求,获取直传 OSS 的凭证。

    (2)客户端向 OSS 上传文件,并携带该凭证。

    逻辑拆解

    整个“生成上传 OSS 凭证”过程,实际上做了这么几件事:

    (1)上传凭证鉴权由 policy 提供,根据私密配置生成这个 policy

    (2)由于上传环节脱离了开发者服务器,因此你可以在 policy 中定义各种限制,例如上传最大体积、文件名等。

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

    代码实现

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

    OSS 配置

    首先定义 OSS 的配置文件,关于配置项的内容,可以参考文档:help.aliyun.com/document_de…

    const ossConfig = {  bucket: 'xxxxxxxx',  accessKeyId: 'xxxxxxxx',  accessKeySecret: 'xxxxxxxx',    url: 'xxxxxxxx',}

    policy 内容

    对于 policy ,有很多配置项,我们先考虑生成“写死”的模式,然后再优化为由函数参数传入配置项。以下是一个最基础的 policy

    有效期

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

    const timeout = 4 * 60 * 60 * 1000const expiration = new Date(Date.now() + timeout).toISOString()

    文件名

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

    import { v4 as uuidv4 } from 'uuid'const filename = uuidv4().replace(/-/gu, '')

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

    const dirname = 'file'const key = dirname + '/' + filename

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

    将以上内容整合,就形成了 policy 文本,以下是一个基础格式:

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

    转化 policy

    policyText 转化为 Base64 格式后,就是要求的 policy 了。

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

    然后对 policy 使用 OSS 密钥使用 HmacSha1 算法签名签名。

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

    最后将上述流程中的相关字段返回给客户端,即为“上传凭证”。

    进一步分析

    以上完整演示了整个流程,我们进一步分析,如何将其封装为一个通用性的函数。

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

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

    (3) policy 还有更多的配置内容,可以抽取一部分做成配置项,例如“允许上传的最大体积”。

    完整代码

    以下是封装为“服务”的使用 Nest.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    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',            url: 'xxxxxxxx',    }  }    generateClientToken(config: GenerateClientTokenConfig): ClientToken {        const dirname = config.dirname        const timeout = (config.expiration || 4) * 60 * 60 * 1000        const maxSize = (config.maxSize || 100) * 1024 * 1024        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文件直传”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    基于服务端怎么实现OSS文件直传

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档

    猜你喜欢

    基于服务端怎么实现OSS文件直传

    这篇文章主要介绍“基于服务端怎么实现OSS文件直传”,在日常操作中,相信很多人在基于服务端怎么实现OSS文件直传问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”基于服务端怎么实现OSS文件直传”的疑惑有所帮助!
    2023-07-02

    Java基于BIO怎么实现文件上传功能

    这篇文章给大家介绍Java基于BIO怎么实现文件上传功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。客户端package com.qst.file;import java.io.BufferedInputStream
    2023-06-21

    基于HTML5+js+Java实现单文件文件上传到服务器功能

    上传单文件到服务器 应公司要求,在HTML5页面上实现上传文件到服务器,对于一个还没毕业的实习生菜鸟来说,这可不得了-----不会,
    2023-05-31

    Python基于socket怎么实现TCP客户端和服务端

    这篇文章主要讲解了“Python基于socket怎么实现TCP客户端和服务端”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python基于socket怎么实现TCP客户端和服务端”吧!一、基
    2023-06-30

    基于Python怎么实现文件分类器

    本篇内容主要讲解“基于Python怎么实现文件分类器”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“基于Python怎么实现文件分类器”吧!通过自定义需要整理的文件目录,将该目录下面的全部文件按照
    2023-07-05

    java怎么实现上传文件到服务器

    Java文件上传Javaweb应用程序可以通过使用Servlet、SpringMVC或第三方库实现文件上传。Servlet方法涉及手动处理文件流和保存,而SpringMVC提供简化的支持。第三方库进一步简化了上传过程,提供了多部分表单数据支持和文件验证功能。遵循最佳实践,例如文件类型验证和安全文件保存,对于确保上传过程的安全性、可靠性和效率至关重要。
    java怎么实现上传文件到服务器
    2024-04-12

    java跨服务器文件传输怎么实现

    Java跨服务器文件传输实现Java提供了多种方法实现跨服务器文件传输,包括:基于流传输(InputStream/OutputStream、FileChannel)基于协议传输(FTP、SFTP、HTTP)第三方库(ApacheCommonsNet、JSch、ApacheHttpClient)根据具体需求选择合适的方法,考虑因素包括性能、安全性、易用性和跨平台支持。
    java跨服务器文件传输怎么实现
    2024-04-13

    服务端与客户端怎么利用socket传文件

    这篇文章给大家介绍服务端与客户端怎么利用socket传文件,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。逻辑:1.客户端将需要查找的文件名以流的形式传给服务端2.服务端接受客户端的连接,把流转化为字符串,进行一个目录的
    2023-05-31

    前端vue+express怎么实现文件的上传下载

    本篇内容主要讲解“前端vue+express怎么实现文件的上传下载”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“前端vue+express怎么实现文件的上传下载”吧!新建server.jsyar
    2023-06-22

    golang Gin上传文件返回前端及中间件怎么实现

    这篇文章主要介绍“golang Gin上传文件返回前端及中间件怎么实现”,在日常操作中,相信很多人在golang Gin上传文件返回前端及中间件怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”golan
    2023-06-30

    C#基于NAudio怎么实现对Wav音频文件剪切

    这篇文章主要讲解了“C#基于NAudio怎么实现对Wav音频文件剪切”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#基于NAudio怎么实现对Wav音频文件剪切”吧!前言C#基于NAudi
    2023-06-21

    Python socket怎么实现服务端和客户端数据传输

    今天小编给大家分享一下Python socket怎么实现服务端和客户端数据传输的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。
    2023-06-30

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录