网站产品展示单页模板,做网站赚钱难,网站建设一个月多少钱,wordpress换头像不显示不出来简介
通常情况下#xff0c;应用程序上传文件到AWS S3#xff0c;会使用aws-sdk#xff0c;但是有些情况下#xff0c;客户端应用会有安装限制#xff0c;比如不能安装aws-sdk#xff0c;此时我们就需要通过其他方式实现文件上传与下载。
这里我们提供一个服务端#…简介
通常情况下应用程序上传文件到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?bucketmybucketkeyabc.tar.gzuuid12345const 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?bucketmybucketkeyabc.tar.gz即可获取签名的文件下载链接。