【问题标题】:Upload and download file through same API gateway with presignedURLs通过相同的 API 网关使用预签名 URL 上传和下载文件
【发布时间】:2022-09-22 23:22:47
【问题描述】:

如何:

  1. 将 lambda 函数 (presignedURL) 的输出链接到 API 网关?
  2. 将 presignedURL 转发到用户的浏览器,从而触发下载?

    用户通过 API 将 csv 文件上传到 s3。在 lambda 函数转换数据后,pdf 文件被发送到用户的浏览器。

    因此,我想在下面的app.js 中包含一个下载功能,以方便 AWS API 网关的上传功能。欢迎任何帮助如何包含以下功能:

    • 将 lambda 函数的输出(presignedURL,当可用时最长 30 秒)发送到 API 网关;
    • 将 presignedURL 发送到用户的浏览器,从而触发下载。

    // 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\'
          
     ...

    标签: javascript amazon-web-services aws-lambda aws-api-gateway pre-signed-url


    【解决方案1】:

    这不可能以您希望的方式工作。 lambda 由 S3 触发,对 API 网关一无所知,API 网关也不对特定的 lambda 执行一无所知。

    您在这里需要的是让 lambda 遵循基于原始文件存储上传文件的模式,例如相同的 UUID 文件名,最后只有一个 .pdf。然后让用户调用下载函数,该函数检查 pdf 是否已经存在,如果存在则返回/重定向到预签名的 url,如果不存在则返回错误/“等待几秒钟”消息。

    或者,您需要某种数据库来存储目标文件所在的信息,并使其余逻辑完全相同。

    在任何情况下,您都需要某种文件标识,例如实际文件名或“文件上传过程”的 UUID。如果服务器已经完成处理,客户端可以使用该 ID 请求下载。

    一种不同的方法是例如使用 websockets 来实际通知客户端上传完成,但这只是一种更奇特的方式来做我已经描述过的事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-01
      • 2021-10-03
      • 2019-02-11
      • 2022-11-30
      • 1970-01-01
      • 2020-09-30
      • 2014-05-22
      相关资源
      最近更新 更多