91 lines
3.0 KiB
Python
91 lines
3.0 KiB
Python
import paramiko
|
||
import os
|
||
import posixpath
|
||
|
||
def mkdir_p(sftp, remote_dir):
|
||
"""递归创建远程目录(类似 mkdir -p)"""
|
||
if remote_dir == '/':
|
||
return # 根目录假设已存在
|
||
try:
|
||
sftp.stat(remote_dir)
|
||
return
|
||
except FileNotFoundError:
|
||
pass
|
||
parent_dir = posixpath.dirname(remote_dir)
|
||
if parent_dir != '/':
|
||
mkdir_p(sftp, parent_dir)
|
||
try:
|
||
sftp.mkdir(remote_dir)
|
||
except Exception as e:
|
||
raise RuntimeError(f"创建目录失败: {remote_dir}, 错误: {str(e)}")
|
||
|
||
def sftp_upload(host, port, username, password, local_path, remote_path,file_name):
|
||
# 创建SSH对象
|
||
ssh = paramiko.SSHClient()
|
||
# 允许连接不在know_hosts文件中的主机
|
||
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
|
||
# 连接服务器
|
||
ssh.connect(host, port, username, password)
|
||
|
||
# 创建SFTP会话
|
||
sftp = ssh.open_sftp()
|
||
result = False
|
||
return_path = ""
|
||
try:
|
||
mkdir_p(sftp, remote_path)
|
||
# 上传文件
|
||
target_path = remote_path+"/"+file_name
|
||
sftp.put(local_path, target_path)
|
||
print(f"文件上传成功: {local_path} -> {target_path}")
|
||
result = True
|
||
return_path = target_path
|
||
|
||
finally:
|
||
# 关闭SFTP会话和SSH连接
|
||
sftp.close()
|
||
ssh.close()
|
||
return result,return_path
|
||
|
||
def sftp_upload_one_file(local_path,mkdir_remote_path,file_name):
|
||
|
||
HOSTNAME = '47.106.222.181'
|
||
PORT = 25078 # 默认SSH端口是22
|
||
USERNAME = 'user'
|
||
PASSWORD = 'password'
|
||
# local_path = '/home/cat/shuikeWorkSpace/vscode_code/2025_workspace/shuike_dev/3rdparty/rk3576_NDK/app/node/save_data_app/Snipaste_2025-07-22_16-28-55.jpg' # 本地文件路径
|
||
# remote_path = '/files/
|
||
remote_base_path = "/files/uploads/device_info" #文件系统的鹿鸣
|
||
|
||
remote_path = remote_base_path+"/"+ mkdir_remote_path # 远程文件路径
|
||
print("remote_path1:",remote_path)
|
||
|
||
flag,remote_path = sftp_upload(HOSTNAME, PORT, USERNAME, PASSWORD, local_path, remote_path,file_name)
|
||
|
||
if flag:
|
||
print("上传成功")
|
||
|
||
#远程路径
|
||
print("remote_path2:",remote_path)
|
||
remote_path_without_prefix = remote_path.replace("/files/", "") # /uploads/device_info
|
||
get_url = "http://47.106.222.181:25079/sftp-images/" + remote_path_without_prefix
|
||
# http://47.106.222.181:25079/sftp-images/uploads/device_info
|
||
print("get_url:",get_url)
|
||
|
||
return get_url
|
||
|
||
if __name__ == "__main__":
|
||
# 使用示例
|
||
#本地图片
|
||
# local_path = '/home/cat/shuikeWorkSpace/vscode_code/2025_WorkSpace/snapshot_1.jpg' # 本地文件路径
|
||
local_path = r'D:/ntxm/sensor_data/snapshot_1.jpg'
|
||
|
||
#远程路径
|
||
mkdir_remote_path = "d80801000058/sensor/20250814/20250814_01" #本地存储路径
|
||
|
||
#图片链接
|
||
file_name = 'Snipaste_2025-07-22_16-28-55.jpg' # 远程文件路径
|
||
|
||
#进行上传
|
||
down_url = sftp_upload_one_file(local_path,mkdir_remote_path,file_name)
|
||
|