【问题标题】:Serve file downloaded with Paramiko SFTP in Flask在 Flask 中提供使用 Paramiko SFTP 下载的文件
【发布时间】:2015-08-05 13:23:01
【问题描述】:

我编写了一个 Flask 应用程序来浏览具有 Paramiko 的 SFTP 支持的远程系统。我希望客户端能够在浏览时下载远程文件。如何使用 Paramiko 下载文件并使用 Flask 提供服务?

@app.route('/download/path:<path:to_file>/')
def download(to_file):
    ssh = paramiko.SSHClient()
    privatekeyfile = os.path.expanduser(key)
    mykey = paramiko.RSAKey.from_private_key_file(privatekeyfile)
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect(hostname=host, username=user, pkey=mykey)
    transfer = ssh.open_sftp()

    # what do I do here to get the file and serve it?
    download = transfer.~SOME_MAGIC~(to_file)
    return download

【问题讨论】:

  • 你想让用户下载什么样的文件?
  • 任意。任何不是文件夹的东西
  • 虽然我相信我们可以假设它们将是文本,而不是二进制......但如果有的话,我会寻求通用解决方案。但是,如果您有文字内容,请分享

标签: python flask sftp paramiko


【解决方案1】:

使用SFTPClient.getfo 从远程路径复制文件,然后发送包含数据的响应。如果数据太大,请使用SpooledTemporaryFile 将数据存储在内存或临时文件中。

import os
from tempfile import SpooledTemporaryFile
from flask import Flask
from paramiko import SSHClient

app = Flask(__name__)

@app.route('/remote_download/<path:path>')
def remote_download(path):
    client = SSHClient()
    client.connect('host')
    transfer = client.open_sftp()

    with SpooledTemporaryFile(1024000) as f:  # example max size before moving to file = 1MB
        transfer.getfo(path, f)
        f.seek(0)
        r = app.response_class(f.read(), mimetype='application/octet-stream')

    r.headers.set('Content-Disposition', 'attachment', filename=os.path.basename(path))
    return r

app.run()

您应该检查路径是否有效,否则如果路径类似于../sibling/path/secret.txt,则会出现安全问题。

【讨论】:

    猜你喜欢
    • 2022-06-18
    • 1970-01-01
    • 2017-10-09
    • 1970-01-01
    • 1970-01-01
    • 2011-03-06
    • 2021-04-26
    • 2022-01-21
    • 1970-01-01
    相关资源
    最近更新 更多