python - 从输入流保存临时 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())
解决方案
是的,这看起来坏了,前几个字节被改变了,也许更多(marvin3.jpg是 blob 存储中的源图像)。
作为一种解决方法,只需将其添加到您的function.json
blob 输入绑定中:
"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
)
他们在 Python worker 存储库中进行的端到端测试似乎也表明"dataType": "binary"
在使用 blob 输入绑定时应该存在(无论文件类型如何,您都应该获取字节)。
如果您尝试将输入 blob 转换为inputBlob: bytes
而不是inputBlob: func.InputStream
,如果您没有dataType
指定,问题会变得更加明显:
Exception: TypeError: a bytes-like object is required, not 'str'
Python 工作者返回一个字符串而不是字节。
我在这里打开了一个问题,以便更新文档。
推荐阅读
- gatsby - Gatsby Build 不会为非页面组件生成 html
- office-js - Office word web addin中的拖放操作
- node.js - Webpack 生产构建样式不出现
- php - 权限被拒绝:无法打开索引目录:/var/www/html/
- dynamics-crm - 在 Dynamics CRM 统一界面中的查找字段下隐藏或删除“更改视图”选项
- c# - 在 C# 中是否可以通过反射检查方法是否是迭代器?
- phaser-framework - Phaser 3 - 设置图形对象的锚点
- java - 如何使用 forEach() 方法通过 Java 8 迭代 AWS 预留 EC2 实例?
- react-native - React modal 元素不覆盖屏幕的左侧
- javascript - 在 redux saga 中使用 setTimeOut 内的 yield