返回顶部
首页 > 资讯 > 精选 >基于服务端怎么实现OSS文件直传
  • 617
分享到

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

2023-07-02 08:07:02 617人浏览 泡泡鱼
摘要

这篇文章主要介绍“基于服务端怎么实现OSS文件直传”,在日常操作中,相信很多人在基于服务端怎么实现OSS文件直传问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”基于服务端怎么实现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文件直传”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

    --结束END--

    本文标题: 基于服务端怎么实现OSS文件直传

    本文链接: https://lsjlt.com/news/340828.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • 基于服务端怎么实现OSS文件直传
      这篇文章主要介绍“基于服务端怎么实现OSS文件直传”,在日常操作中,相信很多人在基于服务端怎么实现OSS文件直传问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”基于服务端怎么实现OSS文件直传”的疑惑有所帮助!...
      99+
      2023-07-02
    • 阿里云OSS实践文件直传基于服务端
      目录前言优缺点流程逻辑拆解代码实现OSS 配置policy 内容有效期文件名转化 policy进一步分析完整代码前言 在日常开发中,客户端上传文件的一般流程是:客户端向服务端发送文件...
      99+
      2024-04-02
    • 微信小程序:阿里云OSS直传实践-PHP实现服务端签名
      目录 1、阿里云OSS上传方式1.1、Web端Browser.js SDK直传(不推荐)1.2、Web端上传服务端再上传至OSS1.3、服务端签名后Web端直传(推荐) 2、PHP服务端...
      99+
      2023-09-17
      微信小程序 阿里云 小程序
    • Vue Element UI + OSS怎么实现上传文件功能
      这篇文章主要为大家展示了“Vue Element UI + OSS怎么实现上传文件功能”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Vue Element UI...
      99+
      2024-04-02
    • Java基于BIO怎么实现文件上传功能
      这篇文章给大家介绍Java基于BIO怎么实现文件上传功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。客户端package com.qst.file;import java.io.BufferedI...
      99+
      2023-06-21
    • 基于Spring实现文件上传功能
      本小节你将建立一个可以接受HTTP multi-part 文件的服务。你将建立一个后台服务来接收文件以及前台页面来上传文件。要利用servlet容器上传文件,你要注册一个MultipartConfigElement类,以往需要在web.xm...
      99+
      2023-05-31
      spring 文件上传 实现文件
    • 基于HTML5+js+Java实现单文件文件上传到服务器功能
      上传单文件到服务器                  &nb...
      99+
      2023-05-31
      js java 上传
    • Java基于BIO实现文件上传功能
      本文实例为大家分享了Java基于BIO实现文件上传功能的具体代码,供大家参考,具体内容如下 客户端 package com.qst.file; import java.io.B...
      99+
      2024-04-02
    • Android基于OkHttp实现文件上传功能
      本文实例为大家分享了Android基于OkHttp实现文件上传的具体代码,供大家参考,具体内容如下 一、相关概述 Android请求访问服务端大多数情况下依旧是使用http协议,故而...
      99+
      2024-04-02
    • QT基于TCP实现文件传输系统
      本文实例为大家分享了QT基于TCP实现文件传输系统的具体代码,供大家参考,具体内容如下 一、设计目标 1、发送端选择要传输的文件,进度条显示传输的进度,手动输入要传输的ip地址和端口...
      99+
      2022-11-13
      QT TCP文件传输 QT文件传输系统 QT传输系统
    • MVC中怎么基于Ajax和HTML5实现文件上传功能
      这篇文章主要讲解了“MVC中怎么基于Ajax和HTML5实现文件上传功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MVC中怎么基于Ajax和HTML5实...
      99+
      2024-04-02
    • SpringBoot整合阿里云OSS对象存储服务实现文件上传
      目录1. 准备工作: 2. 配置: 3. 详细代码: 4. 测试: 1. 准备工作: 一、首先登录阿里云OSS对象存储控制台创建一个Bucket作为你的存储空间。 二、创建Acce...
      99+
      2024-04-02
    • 基于标准http实现Android多文件上传
      实现多文件的上传,基于标准的http来实现。 1.多文件上传MyUploader类的实现: public class MyUploader { private sta...
      99+
      2022-06-06
      HTTP 文件上传 Android
    • 基于ajax的html如何实现文件上传
      这篇文章主要介绍基于ajax的html如何实现文件上传,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1. 怎样自定义样式?1)、只管按照自己喜欢看到的样式去定义即可,如<a h...
      99+
      2024-04-02
    • 基于Vue3文件拖拽上传功能实现
      文件上成功能在我们的身边经常遇到,下面小编通过实例代码给大家分享实现方法,效果图如下所示: <template> <div :class="['drag'...
      99+
      2022-11-13
      vue3拖拽上传 vue文件拖拽上传
    • Python基于socket怎么实现TCP客户端和服务端
      这篇文章主要讲解了“Python基于socket怎么实现TCP客户端和服务端”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python基于socket怎么实现TCP客户端和服务端”吧!一、基...
      99+
      2023-06-30
    • node+axios实现服务端文件上传示例
      目录一、接口文档介绍二、文件上传2-1.初始化项目2-2.安装插件依赖2-3.上传核心代码2-4.执行脚本最近调研企业wx集成H5应用,其中有一个发送图文消息,需要上传图片到临时素材...
      99+
      2024-04-02
    • 基于nodejs+express(4.x+)实现文件上传功能
      Nodejs是一个年轻的编程框架,充满了活力和无限激情,一直都在保持着快速更新。基于Nodejs的官方Web开发库Express也在同步发展着,每年升级一个大版本,甚至对框架底层都做了大手术。在Expres...
      99+
      2022-06-04
      文件上传 功能 nodejs
    • 基于SpringBoot上传任意文件功能的实现
      一、pom文件依赖的添加<dependencies> <dependency> <groupId>org.springframework.boot</groupId> ...
      99+
      2023-05-31
      springboot 上传 任意文件
    • 基于Python怎么实现文件分类器
      本篇内容主要讲解“基于Python怎么实现文件分类器”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“基于Python怎么实现文件分类器”吧!通过自定义需要整理的文件目录,将该目录下面的全部文件按照...
      99+
      2023-07-05
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作