【问题标题】:How to download a file from blob and send it has a file response如何从 blob 下载文件并发送它具有文件响应
【发布时间】:2023-03-04 16:07:01
【问题描述】:

我有一个客户端页面,它将列出容器中的所有文件,在选择文件时,文件名和容器名称将发送到服务器。 服务器应启动文件下载并发送文件作为对客户端请求的响应,请参考下图:

我试过 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 下载文件的正确方法。

【问题讨论】:

    标签: python azure download blob


    【解决方案1】:

    您正在为所有 blob 使用固定文件名“file.txt”,这可能是原因。在这里使用流似乎没用。尝试 get_blob_to_path() 代替,查看以下修改后的代码:

    --- // 你的代码 // ---

    block_blob_service.get_blob_to_path(container_name, local_file_name, local_file_name)
    # 注意我在这里重用了 local_file_name,因此不需要输入/输出 blob return send_file(local_file_name,attachment_filename=local_file_name,as_attachment=True,mimetype='text/plain')


    完整代码:

    @app.route("/blobs/testDownload/")
     def testDownload():
     container_name =request.args.get("containerName")
     print(container_name)
     local_file_name= request.args.get("fileName")
    
    # Download as a file
    block_blob_service.get_blob_to_path(container_name, local_file_name, local_file_name)
    
    
    return send_file(local_file_name,attachment_filename=local_file_name,as_attachment=True,mimetype='text/plain')
    

    看看有没有用!

    【讨论】:

      【解决方案2】:

      尽量不要对扩展名进行硬编码,因为扩展名是 blob 名称的一部分,无论您使用的是 documentation 中的哪种方法。当您首先在本地下载文件时,请查看 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。

      【讨论】:

        猜你喜欢
        • 2021-03-20
        • 2017-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-25
        • 1970-01-01
        • 1970-01-01
        • 2017-08-20
        相关资源
        最近更新 更多