文章目录
概要
在上一篇文章中,我们介绍了如何使用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