开发者社区 > 云原生 > Serverless > 正文

函数计算word转PDF 调用报错 是什么原因呢?

函数计算word转PDF 调用报错 是什么原因呢?File \"app.py\", line 123, in invoke\n word_file = evt[\"word_file\"]\n"
{"events": [{

        "eventName": "ObjectCreated:PostObject",

        "eventSource": "acs:oss",

        "eventTime": "2024-05-21T03:37:55.000Z",

        "eventVersion": "1.0",

        "oss": {

            "bucket": {

                "arn": "acs:oss:cn-hangzhou:1924093879995655:test-pjg-fc001",

                "name": "test-pjg-fc001",

                "ownerIdentity": "1924093879995655",

                "virtualBucket": ""},

            "object": {

                "deltaSize": 15190,

                "eTag": "39E4B354020542297B22F606D114778E",

                "key": "testfc.docx",

                "objectMeta": {"mimeType": "application/vnd.openxmlformats-officedocument.wordprocessingml.document"},

                "size": 15190},

            "ossSchemaVersion": "1.0",

            },

        "region": "cn-hangzhou",

        "requestParameters": {"sourceIPAddress": "203.119.160.25"},

        "userIdentity": }]}

目前不清楚word_file数据格式或类型表达什么含义

展开
收起
三分钟热度的鱼 2024-05-29 17:53:46 15 0
1 条回答
写回答
取消 提交回答
  • 根据您提供的错误信息和事件数据,问题似乎出在函数尝试从事件中提取word_file字段时。错误信息表明在代码第123行,您尝试从触发事件(evt)中获取名为word_file的键值,但似乎并没有找到它,导致了KeyError异常。
    您的事件数据是一个OSS触发器的事件结构,用于通知当OSS桶中对象创建(在这个例子中是.docx文件)后触发函数。但是,这个事件结构中并没有直接包含文件内容,而是提供了文件的元数据和位置信息。因此,如果您希望直接在函数内部处理这个Word文档(比如转换为PDF),您需要做的不仅仅是从事件中读取文件名或路径,还需要进一步下载文件内容进行处理。
    解决步骤如下:

    理解期望数据格式: 从错误信息来看,您的函数代码期望evt(即触发事件)中直接包含一个名为word_file的字段,这可能意味着您的函数设计之初是希望直接从事件中拿到文件内容或者至少是文件的直接下载链接。但实际上,OSS触发器的事件数据并不直接包含文件内容。

    修改函数逻辑: 鉴于OSS事件仅提供了文件的元数据和存储位置,您需要修改函数逻辑,利用OSS SDK从桶中下载指定的文件到函数执行环境中,然后再进行转换操作。您需要在函数中添加代码来实现以下步骤:

    使用OSS SDK(例如oss2库)根据事件中的oss.object.key(即文件名)和oss.bucket.name(即桶名)下载文件到函数的临时存储目录。
    之后,您可以使用适合的库或服务(如python-docx和pdfkit或者类似工具)来处理Word文档并转换为PDF。

    示例代码片段:
    from oss2 import Auth, Bucket
    def download_word_from_oss(bucket_name, object_key, local_path):
    auth = Auth('', '')
    bucket = Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', bucket_name)
    bucket.get_object_to_file(object_key, local_path)
    def handle_event(evt, context):

    获取事件中的文件名和桶名

    word_key = evt["oss"]["object"]["key"]
    bucket_name = evt["oss"]["bucket"]["name"]
    下载Word文件到函数的临时目录
    temp_word_path = "/tmp/" + word_key
    download_word_from_oss(bucket_name, word_key, temp_word_path)
    接下来,您可以在这里添加转换Word到PDF的逻辑
    示例代码假设您已经有一个convert_to_pdf函数
    pdf_path = convert_to_pdf(temp_word_path)
    处理完成后,可以考虑上传PDF回OSS或者进行其他操作

    请注意,上述代码仅为示例,您需要替换和为您的实际OSS访问密钥,同时确保您的函数具有访问OSS的适当权限。此外,您还需要实现或引入合适的库来执行Word到PDF的实际转换操作。
    注意事项:

    确保函数实例有足够的内存和临时存储空间来处理和存储文件。
    考虑到文件下载和转换可能增加函数执行时间,监控函数的执行时间和超时设置,必要时调整函数的超时时间。
    保持函数执行环境的安全,避免泄露敏感信息,比如访问密钥,可以考虑使用环境变量或密钥管理系统来管理密钥。此回答整理自钉群“阿里函数计算客户【已满,加2群:64970014484】”

    2024-05-29 21:15:01
    赞同 展开评论 打赏

快速交付实现商业价值。

相关产品

  • 函数计算
  • 热门讨论

    热门文章

    相关电子书

    更多
    Serverless开发平台: 让研发效能再提升 立即下载
    Serverless 引领云上研发新范式 立即下载
    All in Serverless 阿里云核心产品全面升级 立即下载