首页 > 解决方案 > 从输入流保存临时 pdf 文件的 Azure 函数已损坏

问题描述

我已将 pdf 上传到 blob 存储,当通过 MS Azure Explorer 下载时,它绝对没问题。

我有一个由队列触发的 Azure 函数,并且还有一个与队列消息中命名的 blob 的输入绑定。

当我将传入的 blob 写入磁盘时,大小增加了一倍。此外,pdf 已损坏,无法在 pdf 阅读器中打开。在记事本中打开时,字符与原始文件中显示的字符不同。似乎是一个编码问题,但我们处理的是字节而不是文本,所以不确定为什么会发生这种情况。

这是我的代码(使用 python 3):

import azure.functions as func
import tempfile
import os.path

def main(msg: func.QueueMessage, inputblob: func.InputStream, outputTable: func.Out[str]) -> None:

    with tempfile.TemporaryDirectory() as td:
        f_name1 = os.path.join(td, "old.pdf")
        with open(f_name1, 'wb') as fh:
            fh.write(inputblob.read())

标签: pythonpython-3.xazureazure-functions

解决方案


是的,这看起来坏了,前几个字节被改变了,也许更多(marvin3.jpg是 blob 存储中的源图像)。

十六进制转储

imgcat 图像不好

作为一种解决方法,只需将其添加到您的function.jsonblob 输入绑定中:

"dataType": "binary"

如:

{
  "name": "inputBlob",
  "type": "blob",
  "dataType": "binary",
  "direction": "in",
  "path": "images/input_image.jpg",
  "connection": "AzureWebJobsStorage"
}

你不应该把它放进去(它只需要 JavaScript 工作者),但我猜 SDK 中的某个地方存在一个错误,阻止了正确的类型被推断出来。

完整的工作示例:

def main(req: func.HttpRequest, inputBlob: func.InputStream) -> func.HttpResponse:
    blob = inputBlob.read()

    with open("out.jpg", "wb") as outfile:
        outfile.write(blob)

    return func.HttpResponse(
            "Done. Binary data written to out.jpg",
            status_code=200
        )

imgcat 上的好图片

他们在 Python worker 存储库中进行的端到端测试似乎也表明"dataType": "binary"在使用 blob 输入绑定时应该存在(无论文件类型如何,您都应该获取字节)。

如果您尝试将输入 blob 转换为inputBlob: bytes而不是inputBlob: func.InputStream,如果您没有dataType指定,问题会变得更加明显:

Exception: TypeError: a bytes-like object is required, not 'str'

Python 工作者返回一个字符串而不是字节。

我在这里打开了一个问题,以便更新文档。


推荐阅读