通过python脚本上传本地/远程服务器文件到minio

news2025/1/23 17:42:22

前言

        将文件上传到MinIO对象存储后,MinIO会将文件存储为对象(.meta文件),并为每个对象生成相应的元数据。元数据是描述对象的属性和信息的数据。

        通常,元数据包括对象的名称、大小、创建日期等。 在MinIO中,对象的元数据存储在独立的数据库中,而不是直接存储在文件本身中。

        因此,从MinIO中检索文件时,将得到一个包含文件元数据的对象。 如果您希望访问原始文件内容,您可以使用MinIO提供的API或客户端工具来检索对象,并将其保存为原始文件格式。       

需求

        因旧系统改造,需要将原来的服务器上的文件迁移到MinIO,了解后发现无法直接迁移原文件到MinIO,所以想到通过脚本调用MinIO的API上传文件。

实现

        先上代码

import os
import paramiko
from minio import Minio
from minio.error import S3Error
from stat import S_ISDIR

# 连接到远程服务器
def connect_to_remote_server(hostname, username, password):
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect(hostname, username=username, password=password)
    return ssh

# 递归遍历文件夹并上传PNG文件到MinIO
def upload_png_files(ssh, remote_path, bucket_name, minio_path):
    sftp = ssh.open_sftp()
    try:
        # 遍历远程路径下的文件和文件夹
        for item in sftp.listdir_attr(remote_path):
            item_path = os.path.join(remote_path, item.filename)
            print(item.filename)
            # if S_ISDIR(item.st_mode):
            #     # 如果是文件夹,则补充url,递归调用函数处理子文件夹
            #     upload_png_files(ssh, item_path+'/', bucket_name, os.path.join(minio_path, item.filename+"/"))
            if item.filename.lower().endswith('.png'):
                # 如果是PNG文件,则上传到MinIO
                local_path = os.path.join(local_path_prefix, os.path.relpath(item_path, remote_path))
                os.makedirs(os.path.dirname(local_path), exist_ok=True)
                sftp.get(item_path, local_path)
                # print(f"{item.filename} download success")

                # 创建MinIO客户端对象
                client = Minio(minio_server, access_key=minio_user, secret_key=minio_pwd, secure=False)

                # 设置要上传的图像文件的元数据
                metadata = {
                    "Content-Type": "image/png",
                    "X-Amz-Meta-Description": "This is a manually uploaded image"
                }
                content_type = "image/png"

                # 构建MinIO中的对象键
                object_name = os.path.join(minio_path, os.path.relpath(item_path, remote_path))

                # 上传图像文件
                client.fput_object(
                    bucket_name,
                    object_name,
                    local_path,
                    content_type,
                    metadata 
                )
                print(f"{item.filename} upload success to minio")

                # 删除本地临时文件
                os.remove(local_path)
    except S3Error as err:
        print(err)
    finally:
        sftp.close()


# 调用函数连接到远程服务器并上传所有PNG文件到MinIO指定路径
#远程服务器
hostname = "你的源ip"
username = "账号"
password = "密码"
remote_path = "/home/centos/upload/files/"
#本地路径
local_path_prefix = "E://temp/"
#minio服务器
minio_server = "ip:port"
minio_user = "账号"
minio_pwd = "密码"
bucket_name = "pub"
minio_path = "upload/"

ssh = connect_to_remote_server(hostname, username, password)
upload_png_files(ssh, remote_path, bucket_name, minio_path)
ssh.close()

踩坑记录

坑1——依赖导入

        高版本的MinIO依赖中已经不使用ResponseError了

        所以下面会报错“ImportError cannot import name 'ResponseError'”

from minio.error import ResponseError

        应该使用

from minio.error import S3Error

坑2——SSL链接

client = Minio("ip:port",access_key="minio",secret_key="minio")

        以上代码默认启用https,报错如下:

urllib3.exceptions.MaxRetryError: 
    HTTPSConnectionPool(host='10.11.1.62', port=9000):
    Max retries exceeded with url: /pub?location= (Caused by SSLError(SSLError(1, '[SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:1129)')))

        需要使用http,加上 secure=False

client = Minio("ip:port",access_key="minio",secret_key="minio",secure=False)

坑3——设置Content-Type或者Metadata的Content-Type属性

        这两种方式都可以解决类型识别问题

        Metadata 的 Content-Type 是指对象的元数据的类型,而 content-type 是指对象的内容类型。 它可以是任何类型,但通常是 JSON 或 XML。它包含有关对象的信息,例如对象的创建时间、修改时间、大小等。

        content-type 是指对象的内容类型,它可以是任何类型,但通常是文本、图像、视频或音频。它告诉浏览器如何处理对象。

        注意:下图显示的是Content-Type,不是Metadata 的 Content-Type。

        

官方文档API

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1268366.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

振南技术干货集:各大平台串口调试软件大赏(1)

注解目录 (串口的重要性不言而喻。为什么很多平台把串口称为 tty,比如 Linux、MacOS 等等,振南告诉你。) 1、各平台上的串口调试软件 1.1Windows 1.1.1 STCISP (感谢 STC 姚老板设计出 STCISP 这个软件。&#xf…

FPGA程序执行相关知识点

1.目前,大多数FPGA芯片是基于 SRAM 的结构的, 而 SRAM 单元中的数据掉电就会丢失,因此系统上电后,必须要由配置电路将正确的配置数据加载到 SRAM 中,此后 FPGA 才能够正常的运行。 常见的配置芯片有EPCS 芯片 &#x…

基于傅里叶变换的运动模糊图像恢复算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1、傅里叶变换与图像恢复 4.2、基于傅里叶变换的运动模糊图像恢复算法原理 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 %获取角度 img…

[密码学]DES

先声明两个基本概念 代换(substitution),用别的元素代替当前元素。des的s-box遵循这一设计。 abc-->def 置换(permutation),只改变元素的排列顺序。des的p-box遵循这一设计。 abc-->bac DES最核心的算法就是…

从零搭建AlibabaCloud微服务项目

1&#xff0c;创建maven项目工程如下 equipment-admin 后台equipment-applet 前台或小程序端或app、h5equipment-common 公共模块equipment-gateway 网关equipment-mapper mapper层操作数据库equipment-model 实体类对应数据库表 2&#xff0c;在父pom文件引入依赖 <proper…

找不到 sun.misc.BASE64Decoder ,sun.misc.BASE64Encoder 类

找不到 sun.misc.BASE64Decoder &#xff0c;sun.misc.BASE64Encoder 类 1. 现象 idea 引用报错 找不到对应的包 import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder;2. 原因 因为sun.misc.BASE64Decoder和sun.misc.BASE64Encoder是Java的内部API&#xff0c;通…

二叉树OJ题之二

今天我们一起来看一道判断一棵树是否为对称二叉树的题&#xff0c;力扣101题&#xff0c; https://leetcode.cn/problems/symmetric-tree/ 我们首先先来分析这道题&#xff0c;要判断这道题是否对称&#xff0c;我们首先需要判断的是这颗树根节点的左右子树是否对称&#xff0…

qt-C++笔记之主线程中使用异步逻辑来处理ROS事件循环和Qt事件循环解决相互阻塞的问题

qt-C笔记之主线程中使用异步逻辑来处理ROS事件循环和异步循环解决相互阻塞的问题 code review! 文章目录 qt-C笔记之主线程中使用异步逻辑来处理ROS事件循环和异步循环解决相互阻塞的问题1.Qt的app.exec()详解2.ros::spin()详解3.ros::AsyncSpinner详解4.主线程中结合使用的示…

图面试专题

一、概念 和二叉树的区别&#xff1a;图可能有环 常见概念 顶点&#xff08;Vertex&#xff09;&#xff1a; 图中的节点或点。边&#xff08;Edge&#xff09;&#xff1a; 顶点之间的连接线&#xff0c;描述节点之间的关系。有向图&#xff08;Directed Graph&#xff09;&…

05、基于梯度下降的协同过滤算法

05、基于梯度下降的协同过滤算法理论与实践Python 开始学习机器学习啦&#xff0c;已经把吴恩达的课全部刷完了&#xff0c;现在开始熟悉一下复现代码。对这个手写数字实部比较感兴趣&#xff0c;作为入门的素材非常合适。 协同过滤算法是一种常用的推荐算法&#xff0c;基于…

vue3+ts 实现时间间隔选择器

需求背景解决效果视频效果balancedTimeElement.vue 需求背景 实现一个分片的时间间隔选择器&#xff0c;需要把显示时间段显示成图表&#xff0c;涉及一下集中数据转换 [“02:30-05:30”,“07:30-10:30”,“14:30-17:30”]‘[(2,5),(7,10),(14,17)]’[4, 5, 6, 7, 8, 9, 10, …

SpringBoot项目发送邮件

&#x1f4d1;前言 本文主要是【SpringBoot】——SpringBoot项目发送邮件的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f3…

【人工智能Ⅰ】实验2:遗传算法

实验2 遗传算法实验 一、实验目的 熟悉和掌握遗传算法的原理、流程和编码策略&#xff0c;理解求解TSP问题的流程并测试主要参数对结果的影响&#xff0c;掌握遗传算法的基本实现方法。 二、实验原理 旅行商问题&#xff0c;即TSP问题&#xff08;Traveling Salesman Proble…

每日一题 2336. 无限集中的最小数字(中等)

感觉就是模拟它的两个过程就行了啊 class SmallestInfiniteSet:def __init__(self):self.small 1self.delset set()def popSmallest(self) -> int:ans self.smallself.delset.add(self.small)while self.small in self.delset:self.small 1return ansdef addBack(self,…

MATLAB | 官方举办的动图绘制大赛 | 第三周赛情回顾

MATHWORKS官方举办的迷你黑客大赛第三期(MATLAB Flipbook Mini Hack)的最新进展&#xff01;&#xff01; 很荣幸前三周都成为了阶段性获奖者~&#xff1a; https://ww2.mathworks.cn/matlabcentral/communitycontests/contests/6/entries/13382 https://ww2.mathworks.cn/mat…

展开运算符(...)

假如我们有一个数组&#xff1a; const arr [7,8,9];● 我们如果想要数组中的元素&#xff0c;我们必须一个一个手动的去获取&#xff0c;如下&#xff1a; const arr [7,8,9]; const badNewArr [5, 6, arr[0], arr[1],arr[2]]; console.log(badNewArr);● 但是通过展开运…

计算机基础知识61

JsonResponse 功能例子 你自己写一个类&#xff0c;实现JsonResponse 功能&#xff0c;不需要传safeFalse&#xff0c;无论字典或列表&#xff0c;都能完成序列化返回给前端 1 响应头例子 四种情况&#xff0c;在响应头返回数据 xxxx # 第一种情况 JsonResponse def show(req…

软件测试项目大全,看你需要哪一个

软件测试是使用人工或者自动的手段来运行或者测定某个软件系统的过程&#xff0c;其目的在于检验它是否满足规定的需求或弄清预期结果与实际结果之间的差别。 在软件投入使用前&#xff0c;要经过一系列的严格测试&#xff0c;才能保证交付质量。 一、引言 1.编写目的 本文档…

Nat. Mach. Intell. | 预测人工智能的未来:在指数级增长的知识网络中使用基于机器学习的链接预测

今天为大家介绍的是来自Mario Krenn团队的一篇论文。一个能够通过从科学文献中获取洞见来建议新的个性化研究方向和想法的工具&#xff0c;可以加速科学的进步。一个可能受益于这种工具的领域是人工智能&#xff08;AI&#xff09;研究&#xff0c;近年来科学出版物的数量呈指数…

Kong处理web服务跨域

前言 好久没写文章了&#xff0c;大概有半年多了&#xff0c;这半年故事太多&#xff0c;本文写不下&#xff0c;就写写文章标题问题&#xff01; 问题描述 关于跨域的本质问题我这里不过多介绍&#xff0c;详细请看历史文章 跨域产生的原因以及常见的解决方案。 我这边是新…