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

概要

在上一篇文章中,我们介绍了如何使用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'): 列出桶中的对象,提供更详细的控制。
  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用Python API连接Minio,你需要先下载并配置好SSL证书。你可以通过以下步骤来连接Minio: 1. 从Minio服务器上下载SSL证书crt文件,并将其保存到你的开发机器上。你可以使用以下代码来指定证书文件的路径: ```python import os os.environ\['SSL_CERT_FILE'\] = r"path/to/public.crt" ``` 2. 导入`minio`库并创建Minio客户端对象。你需要提供Minio服务器的相关信息,包括`endpoint`、`access_key`和`secret_key`。如果你的Minio服务器是通过HTTPS进行连接的,你还需要将`secure`参数设置为`True`。以下是一个示例代码: ```python import minio MINIO_CONF = { 'endpoint': '10.0.0.2:9000', 'access_key': 'gdzs', 'secret_key': 'gdzs', 'secure': True } client = minio.Minio(**MINIO_CONF) ``` 3. 现在你可以使用Minio客户端对象来执行各种操作,比如获取桶列表或列出桶中的对象。以下是一些示例代码: ```python # 获取桶列表 buck_list = client.list_buckets() print(buck_list) # 列出指定桶中的对象 buck_obj_list = client.list_objects("whiteAPK") ``` 这样你就可以使用Python API连接Minio并执行相应的操作了。如果你遇到了SSL证书验证失败的问题,可以尝试使用方案2中提供的解决方法。 #### 引用[.reference_title] - *1* *2* [python 连接配置SSL证书的Minio服务](https://blog.csdn.net/weixin_44331765/article/details/127731143)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [【高可用对象存储实战】使用Python操作Minio存储桶](https://blog.csdn.net/Deaohst/article/details/128699370)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值