我正在嘗試使用 POST 請求發送檔案,然后使用 paramiko 將其轉發到服務器。我有以下代碼:
@app.route("/", methods=['GET', 'POST'])
def upload():
file = request.files['file']
try:
gethostbyname("servername")
except gaierror:
print(gaierror)
exit()
port = 22
try:
if request.method == 'POST':
filePost = request.args.get('filename')
transport = paramiko.Transport("servername", port))
try:
transport.connect(username="user",password="password", hostkey=None)
sftp = paramiko.SFTPClient.from_transport(transport)
except paramiko.ssh_exception.AuthenticationException as e:
print(e)
exit()
path = '/home/' file.filename
try:
sftp.put(file, path)
except Exception as e:
print(e)
不幸的是,沒有上傳任何內容。恐怕我必須先保存來自 POST 請求的檔案。有可能解決這個問題嗎?還是我錯過了什么?
我的帖子請求中的鍵/值(使用郵遞員):
key:file
value:test.txt
uj5u.com熱心網友回復:
Flasksave不僅接受檔案路徑,還接受類似檔案的物件。要獲取表示 SFTP 服務器上檔案的類檔案物件,請使用ParamikoSFTPClient.open。這樣,您可以將 HTTP 上傳的檔案直接流式傳輸到 SFTP 服務器,而無需將其臨時存盤在 Web 服務器上。
sftp = paramiko.SFTPClient.from_transport(transport)
path = '/home/' file.filename
with sftp.open(path, 'w ', 32768) as f:
file.save(f)
對于32768引數的目的,請參閱寫入使用 Paramiko/pysftp “open”方法打開的 SFTP 服務器上的檔案很慢。
強制性警告:您直接使用低級Transport類繞過了 SSH/SFTP 服務器主機密鑰驗證(您甚至通過 強制執行hostkey=None)。那是一個安全漏洞。要獲得正確的解決方案,請使用SSHClientAPI 并查看Paramiko "Unknown Server"。
uj5u.com熱心網友回復:
您的代碼將受益于一些重組和清理,實際上看起來您在這里和那里洗掉了一些行。
主要問題是您試圖file從 POST 引數中進行 SFTP,而
sftp.put第一個引數期望來自 FS 的檔案路徑。
這是一個重新組織的功能,對我有用。您會注意到該檔案首先保存到 FS( file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))),然后將相同的字串傳遞給sftp.put:
import os
import sys
import paramiko
from werkzeug.utils import secure_filename
from flask import Flask, render_template, redirect, url_for, request, g
UPLOAD_FOLDER = '/tmp'
app = Flask(__name__,
static_url_path='',
static_folder='static')
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
@app.route("/upload", methods=['GET', 'POST'])
def upload():
if request.method == 'POST':
try:
file = request.files['file']
filename = secure_filename(file.filename)
file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
transport = paramiko.Transport("sftphosthere", 22)
try:
transport.connect(username="usernamehere", password="passwordhere", hostkey=None)
sftp = paramiko.SFTPClient.from_transport(transport)
except paramiko.ssh_exception.AuthenticationException as e:
return e
path = '/tmp/' file.filename
try:
sftp.put(os.path.join(app.config['UPLOAD_FOLDER'], filename), path)
return "Sftp OK!"
except Exception as e:
return e
except Exception as e:
return e
else:
return "GET request"
############################################################################################################################
if __name__ == "__main__":
app.run(debug=True, port=8000, host="0.0.0.0")
作為發出 POST 請求的客戶端,您可以使用 curl 命令代替 Postman:
curl -X POST http://flaskserverhere:8000/upload -F "file=@my_testfile.txt"
my_testfile.txt在運行之前,您需要在同一目錄中準備一個檔案(在上面的命令中)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/482467.html
