我有一个带有lambda和S3存储桶的API网关.我所要做的就是通过API POST请求表单数据上传一个PDF文件.

当我上传一个超级简单的PDF时,例如:https://www.africau.edu/images/default/sample.pdf,它工作得很好.所有内容都正确反映. 然而,如果PDF文件更复杂,我得到的是一个具有相同页数的空PDF文件.没有内容.我不确定是什么导致了这一点..

这就是我接收API请求的方式.我通过文本比较比较了原始内容,原始内容是相同的:


import { parse } from "parse-multipart-data"

const contentType = event.headers["Content-Type"] || event.headers["content-type"]
const boundary = contentType?.split("boundary=")[1]
const parts = parse(Buffer.from(eventBody), boundary)
let result = {
   file: {},
 } as FileRequestDecoded

      for (let i = 0; i < parts.length; i++) {
        const part = parts[i]
        if (part.type === "application/pdf") {
          // Get only one file to upload
          console.log("pdf found ", part.filename)
          
          result.file = {
            id: `${fileId}-${part.filename!}`.toLowerCase(),
            name: part.filename!,
            data: part.data, // This is the file data
          }
        }
      }

这就是我上传到S3的方式(可能是我搞砸的部分)

      await this.s3.putBufferData(
        this.bucketName,
        `pdfs/${fileData.file.id}`,
        fileData.file.data
      )

  async putBufferData(bucketName: string, key: string, data: Buffer) {
    const command = new PutObjectCommand({
      Bucket: bucketName,
      Key: key,
      Body: data,
      ContentType: 'application/pdf',
    })

    await this.s3Client.send(command)
  }


推荐答案

还有另一种方法可以更好地处理复杂的PDF文档(应用程序/pdf).

通过API Gateway传递二进制数据可以替换为使用预签名的URL.也就是说,您通过API Gateway的请求可以调用S3操作来生成一个预签名的URL,并将其返回给客户端.

然后,客户端可以使用该预先签名的URL将PDF上传到S3存储桶.这里有一个非常类似的示例应用程序,它展示了这个应用程序的逻辑.

这款应用的不同之处在于,图片和PDF文档不同,上传到S3存储桶中.

Create a photo asset management application that lets users manage photos using labels

有关此示例无服务器应用程序的更多背景信息可在此处找到:

Cloud Journeys: Building a Serverless Image Recognition Website with Machine Learning

Node.js相关问答推荐

在编译时强制不缩小类型范围

创建查询以展开数组并筛选出具有特定值的元素之后的元素

Nestjs swc 错误:找不到模块项目路径/src/app.module

当API返回400状态代码时,使用Reactjs fetch获取错误消息

bcrypt.compare 每次都返回 false

Docker node_modules 文件夹上的 React 应用程序不可用

当我try 从本地主机发布新产品时收到错误消息

使用`useLocalStorage`和`useDebounce`时如何解决Next.js中的react-hydration-error

使用 Node.js 在 MongoDB 中搜索

无服务器无法获取所有记录事件对象验证失败?

node.js 中 res.setHeader 和 res.header 的区别

如何以编程方式检测nodejs中的调试模式?

判断一个数组中的每个元素是否都在第二个数组中

如何在 Node.js 中等待子进程完成

使用 NodeJS 将新对象附加到 DynamoDB 中的 JSON 数组

遍历 NodeJS 中的一系列日期

处理快速异步中间件中的错误

将 Heroku App 连接到 Atlas MongoDB 云服务

Nodejs将字符串转换为UTF-8

如何从 Node.js 应用程序Ping?