nodejs使用aws-sdk上传下载(移动云EOS)

前言

最近对接了一个新的对象储存库,和 minio 类似,是移动云的 EOS,实际上使用的是 亚马逊的 aws 云服务框架

我们实际除了使用平台配置和查看文件、权限等参数,就是在对接 aws 的框架,至于为什么,因为移动 EOS 的文档太老了,他使用的又是纯粹的 AWS 的服务,因此直接对接 AWS 库即可,不然会被他的文档误导(无法使用,还好自己灵活对接,找到的库的来源,不然就得问他们技术了)

对接下来一天就完全完成功能了,当然要看了这篇文章,基础功能可能几十分钟功能就能完成了

下面是使用的文档地址:

aws-sdk安装使用aws-sdk/client-s3/S3Client参数介绍aws-sdk/s3-request-presigner上传签名相关介绍@aws-sdk/client-s3的npm@aws-sdk/s3-request-presigner的npm

对象储存库 aws-sdk

对接这个对象库,实际上一般只使用两个库 @aws-sdk/client-s3@aws-sdk/s3-request-presigner如果只是内部使用,前端对接的,那么只需要一个库 @aws-sdk/client-s3 即可 @aws-sdk/s3-request-presigner是一个后端用来签名给前端用的库,避免前端对接 aws 相关文档了

安装基础库

需要加入两个库,一个基础功能库,一个签名库,如果只是一个端使用(@aws-sdk/client-s3),不需要用到后面的签名库(@aws-sdk/s3-request-presigner)

js 复制代码
yarn add @aws-sdk/client-s3 @aws-sdk/s3-request-presigner

或者 
npm i @aws-sdk/client-s3 @aws-sdk/s3-request-presigner

初始化 S3Client

S3Client 使用我们的基础库 @aws-sdk/client-s3 ,初始化需要用到它,我们可以直接通过传递参数创建一个对象

js 复制代码
this.client = new S3Client({
    //必传,添加我们的地区即可,EOS 等平台上面有该参数,用自己的
    region: 'tianjin1',
    //endpoint 记得自己加上 https://,记得不要用桶域名,直接使用基础域名即可
    endpoint: env.config.AWS_POINT,
    //验证用户身份和校验的两个key,可以通过平台申请
    credentials: {
        accessKeyId: env.config.AWS_ACCESSKEY,
        secretAccessKey: env.config.AWS_SECRETKEY,
    },
})

上传查看对象

这个功能讲的是单端对接用的,服务器也可能用到,一般用不到,这一直接以下载为例了,上传 和 minio 基本一个样子

aws-sdk/client-s3/S3Client参数介绍

需要使用基础的 send方法发送指令,指令直接根据文档创建即可,一般都有 Bucket、Key两个参数,一个是桶名字,一个是文件名

下载

这里就先以下载 为例 需要使用到 GetObjectCommand格式对象,返回的内容在 Body 中,是 Stream流,可以读取

js 复制代码
//获取text文本(转化utf8)
this.client.send(
    new GetObjectCommand({
        Bucket: this.bucketName,
        Key: filename,
    }),
)
.then(async function (obj) {
    //这里直接转化成text文本了
    await obj?.Body.transformToString('utf-8')
})
.catch(function (err) {
    reject(err)
})

Body 中的 stream流的参数转化,系统已经给我们了,可以直接转化成自己想要的格式

js 复制代码
export interface SdkStreamMixin {
    transformToByteArray: () => Promise<Uint8Array>;
    transformToString: (encoding?: string) => Promise<string>;
    transformToWebStream: () => ReadableStream;
}

上传

上传和下载类似,使用的是 PutObjectCommand, 只不过需要往其 Body 中塞取内容,其有下面几种类型,直接看着转化就行了

js 复制代码
NodeJsRuntimeStreamingBlobPayloadInputTypes = string | Uint8Array | Buffer | Readable;

上传代码大致如下所示

js 复制代码
this.client.send(
    new PutObjectCommand({
        Bucket: this.bucketName,
        Key: filename,
        Body: ...
    }),
)

服务端签名(服务端终点)

前面的都是单端对接后端直接用的,一般是web端直接操作了,直接服务端签名的则是比较通用,无论是单端还是多端都可以,非常方便快捷

签名的目的就是为了授权给其他端,让其他端可以直接通过签名的url或者参数,直接下载或者上传文件,这样其他端可以很方便的实现下载或者上传逻辑

签名使用的就不是基础库 @aws-sdk/client-s3 了,而是 @aws-sdk/s3-request-presigner,通过该库的 getSignedUrl 方法实现下载上传签名即可

js 复制代码
//下载签名,可以设置签名有效期,不传也会有默认的有效期
async signedUrl(filename: string) {
    const command = new GetObjectCommand({
        Bucket: this.bucketName,
        Key: filename,
    })
    const url = await getSignedUrl(this.client, command, {
        expiresIn: 7 * 24 * 3600,
    })
    console.log(url)
}

//上传签名,可以设置签名有效期,不传也会有默认的有效期
async signUpload(filename: string) {
    const command = new PutObjectCommand({
        Bucket: this.bucketName,
        Key: filename,😂
    })
    const url = await getSignedUrl(this.client, command, {
        expiresIn: 24 * 3600, //限制一天上传完毕
    })
    console.log(url)
}

签名后会返回一个 url,专门用来下载、上传,对于上传,put 直接上传,post 的 fromdate 上传,放到 file 中即可

下面就是签名好的url,看尾巴就知道是哪个了

js 复制代码
//签名号的上传url
https://.../2.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-......&x-id=GetObject

//签名号的下载url
https://.../4.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-......&x-id=PutObject

最后

看他和 minio 一对比,发现太像了,很多技术都是殊途同归的,因此接触新的东西无疑对我们来说是一个提升,老将不死只是逐渐凋零

相关推荐
threerocks1 小时前
AI 原生软件开发生命周期手册 - 如何借助 AI,逐阶段改造软件开发生命周期
前端·javascript·后端
ly76892 小时前
JavaScript 从入门到进阶:核心语法、异步编程与工程化实践
开发语言·javascript·ecmascript
沙盘客4 小时前
AFSIM 示例解读(03)· 六自由度飞行仿真 six_dof(下):机场运作与弹道导弹投送
java·javascript·经验分享
默_笙6 小时前
👍 我的代码被 ESLint 抓包了:单引号、var、没分号——全被当场点名
前端·javascript
oh,huoyuyan6 小时前
JS 动态网页抓不到?试试火车采集器网页抓取工具
开发语言·javascript·ecmascript
汉堡大王95278 小时前
用 Trae Work 自动化任务,6 分钟生成一份前端生态周报
前端·javascript·人工智能
章鱼小丸子逃跑中8 小时前
【2025最新版】如何将fnm与node.js安装在D盘?【保姆级安装及人性话理解教程】
前端·javascript·npm·node.js
CAD老兵10 小时前
在浏览器里对比 DWG/DXF 图纸 —— @mlightcad/cad-diff-viewer
前端·javascript·github
WL_arm10 小时前
Vibe Coding(氛围编程)入门
javascript·css·人工智能·html5
艾醒(AiXing-w)10 小时前
LangChain 1.0 入门(二):LangChain 全模型标准化接入最佳实践(小白参数详解版)
前端·javascript·langchain