python - 如何从 blob 下载文件并发送它具有文件响应
问题描述
我有一个客户端页面,它将列出容器中的所有文件,在选择一个文件时,文件名和容器名称一起发送到服务器。服务器应启动文件下载,并应发送文件作为对客户端请求的响应,请参考下图:
我试过get_blob_to_stream
@app.route("/blobs/testDownload/")
def testDownload():
container_name =request.args.get("containerName")
print(container_name)
local_file_name= request.args.get("fileName")
with BytesIO() as input_blob:
with BytesIO() as output_blob:
# Download as a stream
block_blob_service.get_blob_to_stream(container_name, local_file_name, input_blob)
copyfileobj(input_blob, output_blob)
newFile = str(output_blob.getvalue())
with open("file.txt","a") as f:
f.write(newFile)
f.close()
return send_file('file.txt',attachment_filename='sample.txt',as_attachment=True,mimetype='text/plain')
但是正在下载的文件只有文本文件格式,我想下载文件而不管它的格式。我知道这不是通过 Web API 下载文件的正确方法。
解决方案
尽量不要对扩展进行硬编码,因为扩展是 blob 名称的一部分,无论您使用的是文档中的哪种方法。当您首先在本地下载文件时,请查看 get_blob_to_path 方法。本地文件名与 blob 容器中的文件名相同。
您可以尝试获取容器中每个 blob 文件的 blob.name。Blob 名称包含文件扩展名(您只需要解析它),您可以将其用作上述方法的参数,这样您就不必对其进行硬编码:下面您可以找到一个如何迭代的示例通过容器中的文件并获取 blob 名称,您可以针对您的用例进行调整:
block_blob_service = BlockBlobService(account_name=accountName, account_key=accountKey)
# create container if not exists called 'batches'
container_name ='batches'
block_blob_service.create_container(container_name)
# Set the permission so the blobs are public.
block_blob_service.set_container_acl(container_name, public_access=PublicAccess.Container)
# Calculation
blobs = block_blob_service.list_blobs(container_name)
for blob in blobs.items:
file_name = blob.name
所以现在你可以对'/'使用file_name和split方法,最后一项是filename.extension。
推荐阅读
- python - to_date() 的 cx_Oracle 字符串表示会引发错误
- angular - 如何使用 Angular CurrencyPipe 显示便士(个)位置?
- haskell - Haskell 中的并行“任何”或“全部”
- python - 在 Python 递归函数中确定偶数/奇数迭代
- r - 提取最短匹配字符串正则表达式
- python - 如何在python中比较字符串时间
- node.js - 如何在代码中使用公钥功能实现 openssl smime 加密
- node.js - Google Analytics Reporting v4 中的过滤器问题
- ansible - 在 Ansible 库存组中使用通配符无法按预期工作
- javascript - 单击按钮时增加显示的数字