当前位置: 首页 > news >正文

AWS S3在客户端应用不能使用aws-sdk场景下的文件上传与下载

简介

通常情况下,应用程序上传文件到AWS S3,会使用aws-sdk,但是有些情况下,客户端应用会有安装限制,比如不能安装aws-sdk,此时我们就需要通过其他方式实现文件上传与下载。

这里我们提供一个服务端,在服务端安装aws-sdk。对于文件上传,服务端通过aws-sdk生成一个upload policy,然后将这个upload policy返回给客户端,客户端通过这个upload policy上传文件。对于文件下载,服务端通过aws-sdk生成一个presigned url,然后将这个presigned url返回给客户端,客户端通过这个presigned url下载文件。

文件上传

服务端安装aws-sdk

npm install @aws-sdk/client-s3 
npm install @aws-sdk/s3-request-presigner
npm install @aws-sdk/s3-presigned-post

服务端生成upload policy

在服务端的 controller 里添加一个路由产生并返回 upload policy

import { S3Client } from "@aws-sdk/client-s3";
import { createPresignedPost } from '@aws-sdk/s3-presigned-post';
import { Conditions } from "@aws-sdk/s3-presigned-post/dist-types/types";...app.get("/s3/getUploadPolicy", async (req: Request, res: Response) => {const bucket = req.query.bucket?.toString();const key = req.query.key?.toString();const id = req.query.id?.toString();if (bucket && key) {const fields = {'x-amz-meta-uuid': '' + id};const conditions: Conditions[] = [['starts-with', '$key', key],['content-length-range', 16, 10 * 1024 * 1024],['starts-with', '$Content-Type', '']];const params = {Bucket: bucket,Key: key,Conditions: conditions,Fields: fields,Expires: 10 * 60 * 60,};const client = new S3Client();const policy = await createPresignedPost(client, params);res.json({ policy: policy });} else {res.json({ error: 'error' });}
});

客户端上传文件

客户端上传需要使用form-data库做表单提交,因此需要先安装form-data库

npm install form-data

客户端上传代码如下:

import * as FormData from 'form-data';
import { createReadStream } from "fs";async function testForUpload(bucket: string, key: string, id: string, file: string) {// http://localhost:3000/s3/getUploadPolicy?bucket=mybucket&key=abc.tar.gz&uuid=12345const url = `http://localhost:3000/s3/getUploadPolicy?bucket=${bucket}&key=${key}&uuid=${id}`;const response = await fetch(url);const policy = await response.json();console.log(policy);const form = new FormData();form.append('key', policy.fields.key);form.append('Content-Type', 'application/gzip');form.append('X-Amz-Credential', policy.fields['X-Amz-Credential']);form.append('X-Amz-Algorithm', policy.fields['X-Amz-Algorithm']);form.append('X-Amz-Date', policy.fields['X-Amz-Date']);form.append('Policy', policy.fields.Policy);form.append('X-Amz-Signature', policy.fields['X-Amz-Signature']);form.append('x-amz-meta-uuid', policy.fields['x-amz-meta-uuid']);form.append('file', createReadStream(file));await form.submit(policy.url);
}
// testForUpload('mybucket', 'abc.tar.gz', '12345', '/Volumes/mydisk/test/abc.tar.gz');
  • 客户端代码首先调用服务端接口获取upload policy,请求的时候传递bucket、key和id,服务端会根据这些参数生成upload policy;
  • 然后客户端使用form-data库生成一个form,将参数、policy和文件添加到form中,然后将form提交到服务端返回的url;

文件下载

服务端安装aws-sdk

npm install @aws-sdk/client-s3 
npm install @aws-sdk/s3-request-presigner
npm install @aws-sdk/s3-presigned-post

服务端生成签名的文件下载链接

在服务端的 controller 里添加一个路由产生并返回签名的文件访问url

import {S3Client,GetObjectCommand,
} from "@aws-sdk/client-s3";
import {getSignedUrl} from '@aws-sdk/s3-request-presigner';...app.get("/s3/getDownloadUrl", async (req: Request, res: Response) => {const bucket = req.query.bucket?.toString();const key = req.query.key?.toString();if (bucket && key) {const client = new S3Client();const url = await getSignedUrl(client,new GetObjectCommand({Bucket: bucket,Key: key,}),{expiresIn: 10 * 60 * 60,});res.json({ url: url });} else {res.json({ error: 'error' });}
});

然后客户端请求此链接,并添加bucket和key参数,比如http://localhost:3000/s3/getDownloadUrl?bucket=mybucket&key=abc.tar.gz,即可获取签名的文件下载链接。

相关文章:

AWS S3在客户端应用不能使用aws-sdk场景下的文件上传与下载

简介 通常情况下,应用程序上传文件到AWS S3,会使用aws-sdk,但是有些情况下,客户端应用会有安装限制,比如不能安装aws-sdk,此时我们就需要通过其他方式实现文件上传与下载。 这里我们提供一个服务端&#…...

深入解析 Transformers 框架(四):Qwen2.5/GPT 分词流程与 BPE 分词算法技术细节详解

前面我们已经通过三篇文章,详细介绍了 Qwen2.5 大语言模型在 Transformers 框架中的技术细节,包括包和对象加载、模型初始化和分词器技术细节: 深入解析 Transformers 框架(一):包和对象加载中的设计巧思与…...

【Python-AI篇】K近邻算法(KNN)

0. 前置----机器学习流程 获取数据集数据基本处理特征工程机器学习模型评估在线服务 1. KNN算法概念 如果一个样本在特征空间中的K个最相似(即特征空间中最邻近)的样本中大多数属于某一个类别,则该样本也属于这一个类别 1.1 KNN算法流程总…...

aws xray如何实现应用log和trace的关联关系

参考资料 https://community.aws/tutorials/solving-problems-you-cant-see-using-aws-x-ray-and-cloudwatch-for-user-level-observability-in-your-serverless-microservices-applicationshttps://stackoverflow.com/questions/76000811/search-cloudwatch-logs-for-aws-xra…...

centos服务器登录失败次数设定

实现的效果 一台centos服务,如果被别人暴力或者登录次数超过多少次,就拒绝或者在规定时间内拒绝ip登录。这里使用的是fail2ban 安装fail2ban sudo yum install epel-release -y # 先安装 EPEL 源 sudo yum install fail2ban -y配置fail2ban # 复制默…...

实时高效,全面测评快递100API的物流查询功能

一、引言 你是否曾经在网购后焦急地等待包裹,频繁地手动刷新订单页面以获取最新的物流信息?或者作为一名开发者,正在为如何在自己的应用程序中高效地实现物流查询功能而发愁?其实,有一个非常好用的解决方案——快递10…...

第14张 GROUP BY 分组

一、分组功能介绍 使用group by关键字通过某个字段进行分组,对分完组的数据分别 “SELECT 聚合函数”查询结果。 1.1 语法 SELECT column, group_function(column) FROM table [WHERE condition] [GROUP BY group_by_expression] [ORDER BY column]; 明确&#…...

笔记整理—linux驱动开发部分(10)input子系统与相关框架

关于输入类设备的系统有touch、按键、鼠标等,在系统中,命令行也是输入类系统。但是GUI的引入,不同输入类设备数量不断提升,带来麻烦,所以出现了struct input_event。 struct input_event {struct timeval time;//内核…...

[算法初阶]埃氏筛法与欧拉筛

素数的定义&#xff1a; 首先我们明白&#xff1a;素数的定义是只能整除1和本身&#xff08;1不是素数&#xff09;。 我们判断一个数n是不是素数时&#xff0c;可以采用试除法&#xff0c;即从i2开始&#xff0c;一直让n去%i&#xff0c;直到i*i<n c语言: #include<…...

【THM】linux取证 DisGruntled

目录 0x00 房间介绍 0x01 连接并简单排查 0x02 让我们看看做没做坏事 0x03 炸弹已埋下。但何时何地&#xff1f; 0x04 收尾 0x05 结论 0x00 房间介绍 嘿&#xff0c;孩子&#xff01;太好了&#xff0c;你来了&#xff01; 不知道您是否看过这则新闻&#xff0c;我…...

SpringBoot整合Freemarker(四)

escape, noescape 语法 <#escape identifier as expression>...<#noescape>...</#noescape>... </#escape> 用例 主要使用在相似的字符串变量输出&#xff0c;比如某一个模块的所有字符串输出都必须是html安全的&#xff0c;这个时候就可以使用&am…...

centos docker 安装 rabbitmq

安装docker 1.更新现有的软件包 首先&#xff0c;确保您的系统是最新的&#xff0c;可以通过运行以下命令来实现&#xff1a; sudo yum update -y 2.移除旧版本的Docker 如果您之前安装过Docker&#xff0c;可能需要先卸载旧版本。使用以下命令来卸载旧版本的Docker&#…...

手动实现promise的all,race,finally方法

Promise.all 是一个非常有用的工具&#xff0c;它接受一个 Promise 对象数组&#xff0c;并返回一个新的 Promise。当所有输入的 Promise 都成功解决时&#xff0c;新的 Promise 会解决为一个包含所有结果的数组&#xff1b;如果任何一个 Promise 被拒绝&#xff0c;新的 Prom…...

H5移动端预览PDF方法

新建页面 新建一个页面以便去预览对应的pdf 新建完后在 pages.json 文件内去新增对应路由 页面内容 <template><view class"page"><view class"pdf"><view id"demo"></view></view><view class"b…...

uniapp—android原生插件开发(1环境准备)

本篇文章从实战角度出发&#xff0c;将UniApp集成新大陆PDA设备RFID的全过程分为四部曲&#xff0c;涵盖环境搭建、插件开发、AAR打包、项目引入和功能调试。通过这份教程&#xff0c;轻松应对安卓原生插件开发与打包需求&#xff01; 项目背景&#xff1a; UniApp集成新大陆P…...

《潜行者2切尔诺贝利之心》游戏引擎介绍

潜行者2切尔诺贝利之心是基于虚幻5引擎&#xff0c;所以画面效果大家不必担心。游戏目前已经跳票了很久&#xff0c;预计发售时间是2024 年 11 月 21 日&#xff0c;这次应该不会再跳票。 潜行者2切尔诺贝利之心是虚幻5吗 答&#xff1a;是虚幻5。 潜行者官方推特之前回复了…...

winform 加载 office excel 插入QRCode图片如何设定位置

需求&#xff1a;winform 加载 office excel 并加载QRCode图片&#xff0c;但是每台PC打印出来QRCode位置都不太一样&#xff0c;怎么办呢&#xff1f; 我的办法&#xff1a; 1、在sheet中插入一个 textbox &#xff0c;改名 qrcode &#xff08;这个名字随便设置&#xff09…...

简易入手《SOM神经网络》的本质与原理

原创文章&#xff0c;转载请说明来自《老饼讲解神经网络》:www.bbbdata.com 关于《老饼讲解神经网络》&#xff1a; 本网结构化讲解神经网络的知识&#xff0c;原理和代码。 重现matlab神经网络工具箱的算法&#xff0c;是学习神经网络的好助手。 目录 一、入门原理解说 01.…...

21.assert断言

assert&#xff08;断言&#xff09;主要用于在程序运行过程中检查某个条件是否满足&#xff0c;如果不满足则会触发错误并终止程序执行&#xff0c;可以帮助程序员在开发阶段及时发现可能存在的逻辑错误等问题。 通过断言调试程序&#xff0c;abotr() has been called 就是断言…...

15分钟学 Go 第 46 天 : 监控与日志

第46天&#xff1a;监控与日志 学习目标 了解如何实现应用监控与日志管理&#xff0c;掌握相关工具和最佳实践。 内容结构 引言监控的概念与工具 监控的定义常见监控工具 日志管理的概念与工具 日志的重要性常见日志管理工具 实现监控与日志的最佳实践 监控指标日志格式 实战…...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...