如何:
- 将lambda函数的输出(预签名URL(链接到API网关
- 将预签名的URL转发到用户的浏览器,从而触发下载
用户通过API将csv
文件上载到s3。lambda函数转换数据后,会向用户的浏览器发送一个pdf
文件。
因此,我想在下面的app.js
中包含一个下载功能,这有助于AWS API网关的上传功能。欢迎提供以下功能的任何帮助:
- 向API网关发送lambda函数的输出(预签名URL,如果可用,最长30秒(
- 将预签名的URL发送到用户的浏览器,以便触发下载
// Upload function
const AWS = require('aws-sdk')
AWS.config.update({ region: process.env.AWS_REGION })
const s3 = new AWS.S3()
const URL_EXPIRATION_SECONDS = 300
// Main Lambda entry point
exports.handler = async (event) => {
return await getUploadURL(event)
}
const getUploadURL = async function(event) {
const Key = `test.csv`
// Get signed URL from S3
const s3Params = {
Bucket: process.env.UploadBucket,
Key,
Expires: URL_EXPIRATION_SECONDS,
ContentType: 'text/csv',
// This ACL makes the uploaded object publicly readable. You must also uncomment
// the extra permission for the Lambda function in the SAM template.
// ACL: 'public-read'
}
console.log('Params: ', s3Params)
const uploadURL = await s3.getSignedUrlPromise('putObject', s3Params)
return JSON.stringify({
uploadURL: uploadURL,
Key
})
}
// Download function (pdf)
const Downloadfunc ...
// Get presignedURL from lambda function output
// Send presignedURL to the browser of the user that triggers a download
...
</div>
<h2 v-if="uploadURL">File uploaded to bucket.</h2>
</div>
<script>
const API_ENDPOINT = 'https://*****.execute-api.us-east-1.amazonaws.com/uploads'
...
这在您想要的工作方式中是不可能的。lambda由S3触发,并且不知道API网关的任何信息,API网关也不知道特定lambda执行的任何信息。
在这里,您需要的是让lambda遵循一个模式来存储上传的文件,该模式基于原始文件,例如,相同的UUID文件名,只是末尾有一个.pdf。然后让用户调用下载函数,该函数检查pdf是否已经存在,并返回/重定向到预签名的url(如果存在(,以及错误/";等待几秒钟";消息(如果它还不存在(。
或者,您需要某种数据库来存储目标文件所在的信息,并且其他逻辑完全相同。
在任何情况下,您都需要文件的某种标识,例如实际文件名的UUID或";文件上传过程";。如果服务器已经完成处理,则客户端可以使用该id请求下载。
一种不同的方法是,例如,使用websocket来实际通知客户端上传完成,但这只是一种更奇特的方式来完成我已经描述过的操作。