从外部源作为 blob 发送到 AWS Textract 的图像文件出现“InvalidParameterType”错误

Posted

技术标签:

【中文标题】从外部源作为 blob 发送到 AWS Textract 的图像文件出现“InvalidParameterType”错误【英文标题】:"InvalidParameterType" error for image files sent as blob to AWS Textract from external source 【发布时间】:2021-12-20 08:47:10 【问题描述】:

目前

我正在尝试让 AWS Textract 处理从 Google Scripts 中的函数提供的图像,该函数被发送到解析的 Lambda。我正在关注https://docs.aws.amazon.com/AWSjavascriptSDK/latest/AWS/Textract.html#analyzeDocument-property上的文档

我的 Google 脚本代码:

function googleFunction(id) 
  
  let file = DriveApp.getFileById(id);
  console.log("File is a " + file.getMimeType());
  let blob = file.getBlob();

  let params = 
    doc: blob,
  ;

  var options = 
    method: "PUT",
    "Content-Type": "application/json",
    payload: JSON.stringify(params),
  ;

  let response = UrlFetchApp.fetch("https://api-path/prod/resolver", options);

我的 Lambda resolver 代码:

"use strict";

const AWS = require("aws-sdk");

exports.handler = async (event) => 
  let params = JSON.parse(event.body);
  console.log("Parse as document...");
  let textract = new AWS.Textract();
  let doc = params["doc"];
  let config = 
    Document: 
      Bytes: doc,
      FeatureTypes: ["TABLES"],
    
  ;
  textract.analyzeDocument(config, function (err, data) 
    console.log("analyzing...");
    if (err) 
      console.log(err, err.stack);
    
    // an error occurred
    else 
      console.log("data:" + JSON.stringfy(data));
     // successful response
  );
;

问题

文件已成功从 Google Scripts 发送到 Lambda,但返回以下错误:

"errorType": "InvalidParameterType",
"errorMessage": "Expected params.Document.Bytes to be a string, Buffer, Stream, Blob, or typed array object"

问题

有没有办法验证 doc 变量的格式是什么,以确保它符合 AWS Textract 的要求? 谁能看到返回错误的可能原因?

注意事项

当同一个文件上传到 S3 bucked 时,Textract 工作正常,并使用以下配置在配置中提供: S3Object: Bucket: 'bucket_name', Name: 'file_name' 我已确认文件为 JPEG

【问题讨论】:

【参考方案1】:

通过 2 处更改让它工作:

    getBytes() 添加到 Google 端代码 将 Buffer.from() 添加到 AWS 端代码

我的 Google 脚本代码:

function googleFunction(id) 
  
  let file = DriveApp.getFileById(id);
  console.log("File is a " + file.getMimeType());
  let blob = file.getBlob().getBytes();

  let params = 
    doc: blob,
  ;

  var options = 
    method: "PUT",
    "Content-Type": "application/json",
    payload: JSON.stringify(params),
  ;

  let response = UrlFetchApp.fetch("https://api-path/prod/resolver", options);

我的 Lambda resolver 代码:

"use strict";

const AWS = require("aws-sdk");

exports.handler = async (event) => 
  let params = JSON.parse(event.body);
  console.log("Parse as document...");
  let textract = new AWS.Textract();
  let doc = params["doc"];
  let config = 
    Document: 
      Bytes: Buffer.from(doc),
      FeatureTypes: ["TABLES"],
    
  ;
  textract.analyzeDocument(config, function (err, data) 
    console.log("analyzing...");
    if (err) 
      console.log(err, err.stack);
    
    // an error occurred
    else 
      console.log("data:" + JSON.stringfy(data));
     // successful response
  );
;

【讨论】:

以上是关于从外部源作为 blob 发送到 AWS Textract 的图像文件出现“InvalidParameterType”错误的主要内容,如果未能解决你的问题,请参考以下文章

我是流的新手,我需要从 ftp 下载文件并作为流发送到 azure stageblock(npm @azure/storage-blob)

从 AWS Glue 表到 RedShift Spectrum 外部表的日期字段转换

使用 C# 从 Azure Blob 复制到 AWS S3

使用 azure 逻辑应用将 blob 从 azure 存储帐户动态发送到电子邮件

使用 Terraform (AWS) 将安全组添加到另一个安全组的入站规则作为源

获取 Azure Blob(图像)并 POST 到外部 API