如何使用Python生成Minio文件的免登录直接下载链接
实现方法
你需要的无需登录即可直接访问的临时分享下载链接,直接使用Minio Python SDK提供的presigned_get_object方法即可生成。该方法返回带权限签名的临时访问链接,和Minio UI控制台点击「分享」按钮生成的链接逻辑完全一致,不需要提前把存储桶设置为公开访问权限。
核心参数说明
- 前两个必填参数依次为目标存储桶名、对象在桶内的完整路径/文件名
expires:可选参数,链接有效时长,单位为秒,默认值为604800(即7天),和控制台默认分享有效期匹配,可按需自定义时长,比如传入3600即代表链接1小时后失效- 额外可选参数
response_headers:可自定义返回头,比如需要让链接在浏览器内直接预览图片/PDF而非触发下载,可传入{"response-content-disposition": "inline"},默认行为是触发文件下载,和控制台默认效果一致
注意事项
- 初始化Minio客户端时填写的
endpoint必须是终端用户实际可访问的地址(如果Minio部署在反向代理后,不要填内网地址),否则生成的链接无法正常访问 - 如果你部署Minio时启用了HTTPS,初始化客户端时要把
secure参数设为True,否则生成的链接会使用http协议导致访问异常 - 原代码中
fput_object传参有误:该方法直接接收本地文件路径作为参数,不需要手动打开文件、传入文件大小,手动打开文件传对象的写法是put_object方法的调用方式
完整可运行代码
from minio import Minio import os def getMinioClient(access, secret): return Minio( endpoint="localhost:9000", access_key=access, secret_key=secret, secure=False, ) if __name__ == "__main__": client = getMinioClient("admin", "Secret_key123") try: file_name = "myfile.csv" bucket = "file_bucket" # 上传本地文件 client.fput_object( bucket_name=bucket, object_name=file_name, file_path=file_name ) print("文件上传完成") # 原有本地下载逻辑保留 client.fget_object(bucket, file_name, f"{file_name}_downloaded") # 生成有效期7天的匿名分享下载链接 share_download_link = client.presigned_get_object( bucket_name=bucket, object_name=file_name, expires=604800 ) print(f"匿名可直接访问的下载链接:{share_download_link}") except Exception as e: print(e)
生成的链接直接复制到浏览器地址栏即可触发文件下载,无需登录Minio账号,签名到期后链接会自动失效,无法再访问对应文件。
内容的提问来源于stack exchange,提问作者young_minds1
相关产品推荐
相关产品推荐

