首页 > 编程语言 >Python连接MinIO进阶教程:文件类型指定、上传与获取预览链接

Python连接MinIO进阶教程:文件类型指定、上传与获取预览链接

时间:2024-08-02 09:28:01浏览次数:17  
标签:MinIO 进阶 Python object bucket content file type name

文章目录

概要

在上一篇文章中,我们介绍了如何使用Python连接MinIO服务器,并进行了基本的文件上传和下载操作。这次,我们将深入探讨一些进阶功能,包括在上传文件时指定内容类型(Content-Type)、获取文件的预览链接(Presigned URL),以及处理文件类型猜测等。

1. 指定文件内容类型

在上传文件到MinIO时,正确设置Content-Type是一个好习惯,它有助于客户端(如Web浏览器)正确地处理文件。Python的mimetypes模块可以帮助我们猜测文件的MIME类型,但有时候你可能需要手动指定它。

首先,我们需要从mimetypes模块中导入guess_type函数来尝试自动猜测文件类型,但也要准备好手动指定。

from mimetypes import guess_type  
from minio import Minio  
from datetime import timedelta  
  
# 假设你已经有了MinIO客户端的实例  
client = Minio(...)  
  
# 文件路径  
source_file = '/path/to/your/file.jpg'  
destination_file = 'file.jpg'  
bucket_name = 'my-bucket'  
  
# 尝试猜测文件类型  
content_type, _ = guess_type(source_file)  
if not content_type:  
    # 如果猜测失败,手动指定  
    content_type = 'image/jpeg'  # 根据文件实际类型指定  
  
# 上传文件,并指定内容类型  
try:  
    with open(source_file, 'rb') as file_data:  
        client.put_object(bucket_name, destination_file, file_data, content_type=content_type)  
    print(f"File {destination_file} uploaded with content-type {content_type}.")  
except Exception as err:  
    print(err)

2. 获取文件的预览链接(Presigned URL)

Presigned URL允许你在一定时间内,无需额外的身份验证即可访问MinIO中的对象。这在需要临时分享文件时非常有用。

from datetime import timedelta  
  
# 创建一个代表1天的时间差  
expires = timedelta(days=1)  
  
# 生成Presigned URL  
try:  
    presigned_url = client.presigned_get_object(bucket_name, destination_file, expires=expires)  
    print(f"Presigned URL for {destination_file}: {presigned_url}")  
except Exception as err:  
    print(err)

使用fput_object上传文件

fput_object是一个高级函数,它允许你直接从一个文件路径上传文件,而不需要手动打开文件。这可以简化代码,并减少资源消耗。

try:  
    # 使用fput_object上传文件,并指定内容类型  
    client.fput_object(bucket_name, destination_file, source_file, content_type=content_type)  
    print(f"File {destination_file} uploaded with fput_object and content-type {content_type}.")  
except Exception as err:  
    print(err)

4. 完整示例与总结

将上述内容组合起来,你可以创建一个完整的脚本来上传文件,指定其内容类型,并生成一个预览链接。

from minio import Minio  
from mimetypes import guess_type  
from datetime import timedelta  
  
# MinIO配置  
endpoint = 'your-minio-endpoint'  
access_key = 'your-access-key'  
secret_key = 'your-secret-key'  
bucket_name = 'my-bucket'  
  
# 初始化MinIO客户端  
client = Minio(endpoint, access_key=access_key, secret_key=secret_key, secure=True)  
  
# 文件路径  
source_file = '/path/to/your/file.jpg'  
destination_file = 'file.jpg'  
  
# 尝试猜测文件类型  
content_type, _ = guess_type(source_file)  
if not content_type:  
    content_type = 'application/octet-stream'  # 未知类型时的默认MIME  
  
# 上传文件  
try:  
    client.fput_object(bucket_name, destination_file, source_file, content_type=content_type)  
    print(f"File {destination_file} uploaded successfully.")  
except Exception as err:  
    print(err)  
  
# 生成Presigned URL  
expires = timedelta(days=1)  
try:  
    presigned_url = client.presigned_get_object(bucket_name, destination_file, expires=expires)  
    print(f"Presigned URL for {destination_file}: {presigned_url}")  
except Exception as err:  
    print(f"Failed to generate presigned URL: {err}")  

Minio 客户端(通过 minio-py 库)提供了多种方法来与 MinIO 服务进行交互。以下是一些常用的方法列表,这些方法允许你执行文件上传、下载、桶操作、对象管理以及更多功能。请注意,这个列表并不完整,因为 MinIO 的 API 在不断更新和扩展,但它涵盖了大多数基本和常用的操作。
桶(Bucket)操作

make_bucket(bucket_name, region=None, tags=None, policy=None): 创建一个新的桶。
list_buckets(): 列出所有桶。
bucket_exists(bucket_name): 检查桶是否存在。
remove_bucket(bucket_name): 删除一个空桶。
remove_objects(bucket_name, objects, recursive=False): 删除桶中的一个或多个对象。
remove_bucket_force(bucket_name): 强制删除桶及其所有内容(慎用)。

对象(Object)操作

fput_object(bucket_name, object_name, file_path, content_type='application/octet-stream', metadata=None): 从文件路径上传对象。
fput_stream(bucket_name, object_name, stream, content_type='application/octet-stream', metadata=None, size=None): 从文件流上传对象。
get_object(bucket_name, object_name, file_path='', offset=0, length=None): 下载对象到文件路径或作为字节流返回。
stat_object(bucket_name, object_name): 获取对象的元数据。
copy_object(bucket_name, object_name, dest_bucket_name, dest_object_name, metadata=None): 复制对象到另一个桶。
remove_object(bucket_name, object_name): 删除对象。

Presigned URL

presigned_get_object(bucket_name, object_name, expires=timedelta(days=7), response_headers=None, request_date=None, method='GET'): 生成一个用于 GET 请求的 Presigned URL。
presigned_put_object(bucket_name, object_name, expires=timedelta(days=7), content_type='application/octet-stream', response_headers=None, request_date=None): 生成一个用于 PUT 请求的 Presigned URL。

桶策略和元数据

set_bucket_policy(bucket_name, policy_json): 设置桶的访问策略。
get_bucket_policy(bucket_name): 获取桶的访问策略。
set_bucket_tags(bucket_name, tags): 设置桶的标签。
get_bucket_tags(bucket_name): 获取桶的标签。

其他

list_objects(bucket_name, prefix='', recursive=False): 列出桶中的对象。
list_objects_v2(bucket_name, prefix='', recursive=False, start_after='', delimiter='', max_keys=1000, fetch_owner=False, encoding_type='url'): 列出桶中的对象,提供更详细的控制。

标签:MinIO,进阶,Python,object,bucket,content,file,type,name
From: https://blog.csdn.net/weixin_44217158/article/details/140863438

相关文章

  • Python装饰器
    Python装饰器TableofContents引子函数式调用语法糖加上参数login函数有参数装饰器本身有参数装饰有返回值的函数多个装饰器灵活运用想理解Python的装饰器,首先要知道在Python中函数也是一个对象,所以可以:将函数赋值给变量将函数当做参数返回一个函数......
  • Python数据容器(2)
    一、数据容器:tuple(元组)1.定义同列表一样,但是形成后不可修改单个元组需要加上单独的逗号2.特定可以容纳多个数据可以不同数据类型混装运行数据重复不可修改支持循环3.特例元组中如果有list列表,则可以修改list中的数据4.常用操作下标查询语法:元组.index(元素)统计个......
  • Python数据容器(1)
    一、数据容器入门1.定义一份变量多个数据一个数据称为1个元素2.特点是否支持重复元素是否可以修改是否有序3.类别列表(list)元组(tuple)字符串(str)集合(set)字典(dict)二、数据容器:list(列表)1.下标索引把列表元素取出来(左到右0→123)(右到左-1→-123)序号也可......
  • 初学Python:第五天
    今天学习了有关于字典的定义和相关操作:1、新增元素语法:字典[key]=value结果:字典被修改,新增了元素更新元素语法:字典[key]=value结果:字典被修改,元素被更新注意:字典key不可以重复,所以对已存在的key执行上述操作,就是更新value值2、删除元素语法:字典.pop(Key)结果:获得......
  • 在 Python 生成器中使用“with”语句管理资源
    今天,在编程时,我发现自己在生成器函数内管理资源(ssh连接),类似于以下内容:def_yield_fname(host_address,usr,pwd,datapath):withparamiko.SSHClient()asssh_client:ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())ssh_client.......
  • Avro:在 Python 中使用多处理进行解码
    就最佳性能和更少延迟而言,哪种异步方法更适合解码从Kafka主题消耗的Avro消息?我正在使用Avro库的并发future,并且我仍然可以看到类似的执行时间与不使用并发future的情况相比。fromavro.ioimportBinaryDecoder,DatumReaderfromconfluent_kafka.avro.cached_sc......
  • 白盒测试基础与实践:Python示例及流程图设计
    文章目录前言一、白盒测试是什么?主要特点常用方法优点缺点二、白盒测试常用技术语句覆盖判定覆盖条件覆盖判定/条件覆盖条件组合覆盖路径覆盖三、程序流程图设计四、测试用例设计1.基本路径法2.语句覆盖3.判断覆盖4.条件覆盖5.判断/条件覆盖6.条件组合覆盖总结......
  • Amazon SQS 入门:从基础到进阶的完整指南
    这是对AmazonSimpleQueueService(AmazonSQS)的历史年表的介绍。AmazonSQS作为AWS的基础设施服务之一,于2004年11月首次推出,提供全托管的消息排队服务。为了迎接即将到来的2024年11月的20周年,我们提前撰写了这篇文章,以纪念这一里程碑。文章总结了SQS从诞生至今的主要功能和......
  • 【python的语法特点,如注释规则、代码缩进、编写规范等】
    介绍一下python的语法特点,如注释规则、代码缩进、编写规范等Python是一种广泛使用的高级编程语言,以其简洁易读的语法、丰富的标准库和强大的第三方库而闻名。下面我将详细介绍Python的一些基本语法特点,包括注释规则、代码缩进、以及编写规范等。一、注释规则Python......
  • 深圳大学-数据科学导论实验-python数据探索
    实验目的与要求掌握python编程基础。掌握数据探索基本操作。实验环境WindowsPyCharm实验数据salaries.csv"","rank","discipline","yrs.since.phd","yrs.service","sex","salary""1","Prof","B",......