概述
本文将详细介绍如何使用Python的boto3库连接和操作ArcGIS Datastore 11.5内置的Ozone对象存储。Ozone是Hadoop生态系统中的对象存储系统,与S3协议兼容。通过boto3的S3接口,我们可以方便地在Python中读写Ozone存储桶中的对象。
用程序读写ArcGIS Datastore 11.5内置的Ozone对象存储有助于开发三维相关功能。
第一章:Miniconda在Windows上安装
1.1 为什么选择Miniconda
Miniconda是Anaconda的轻量级版本,只包含conda、Python和少量必要包。相比完整的Anaconda,Miniconda占用空间更小,更适合在服务器或开发环境中部署。
1.2 下载Miniconda
Miniconda下载地址:[https://repo.anaconda.com/miniconda/Miniconda3-latest-Windows-x86_64.exe)
下载64位安装程序(Miniconda3-latest-Windows-x86_64.exe)
运行安装程序:双击下载的exe文件
-
选择安装类型:
推荐选择"Just Me"(仅当前用户)
或"All Users"(所有用户,需要管理员权限)
选择安装路径:
-
高级选项:
☑ Add Miniconda3 to my PATH environment variable
☑ Register Miniconda3 as my default Python 3.x
如果担心这个miniconda环境与本机已有其他conda环境冲突则不勾选这两个选项,去安装目录下使用
完成安装:等待安装完成,可能需要几分钟
1.4 验证安装
打开命令提示符(CMD)或PowerShell,执行以下命令:
如果未设置环境变量,就去安装目录 E:\ProgramData\miniconda3\condabin 下打开CMD
# 检查conda版本
conda --version
# 检查Python版本
python --version
# 更新conda到最新版本
conda update conda
1.5 配置conda镜像源(可选,国内推荐)
为了加快包下载速度,可以配置国内镜像源:
# 添加清华镜像源
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
# 显示所有通道
conda config --show channels
# 设置搜索时显示通道地址
conda config --set show_channel_urls yes</pre>
第二章:下载boto3 1.13版本的包以及urllib3、requests
2.1 创建专用环境
为避免包版本冲突,建议为Ozone项目创建独立的conda环境:
# 创建名为ozone的Python环境
conda create -n dans-ozone python=3.9
# 激活环境
conda activate dans-ozone
# 查看当前环境
conda env list</pre>
2.2 安装特定版本的boto3
ArcGIS Datastore 11.5内置的Ozone对boto3版本有一定要求,1.13版本经过测试兼容性较好:
# 通过conda安装boto3的特定版本
conda install boto3=1.13</pre>
注意:如果安装默认版本,则为1.14,读ozone成功,写ozone会失败。
失败截图:

2.3 安装urllib3和requests
# 安装urllib3
pip install urllib3
# 安装requests
pip install requests
第三章:Ozone的客户端证书配置
3.1 Ozone HTTPS连接的安全要求
ArcGIS Datastore 11.5内置的Ozone默认使用HTTPS协议,并且通常使用自签名证书或内部CA签发的证书。客户端需要配置证书验证才能建立安全连接。
3.2 获取Ozone服务器证书
方法一:从浏览器导出证书
使用Chrome/Edge访问Ozone端点URL
点击地址栏的锁图标 → 证书 → 详细信息
选择"复制到文件",导出为Base64编码的CER格式

3.3 配置客户端证书验证
方案一:全局环境变量配置(推荐)
import os
# 设置证书路径
cert_path = "D:\\python\\ozone\\zsChain.pem"
# 配置全局SSL证书
os.environ['AWS_CA_BUNDLE'] = cert_path
os.environ['REQUESTS_CA_BUNDLE'] = cert_path
# 如果证书是自签名的,可以选择性关闭警告
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)</pre>
方案二:在boto3客户端中配置
import boto3
from botocore.config import Config
config = Config(
s3={
'use_ssl': True,
'verify': 'D:\\python\\ozone\\zsChain.pem',
}
)
s3 = boto3.client(
's3',
endpoint_url="https://ags115kl.geoscene.cn:29879",
aws_access_key_id="your_access_key",
aws_secret_access_key="your_secret_key",
config=config
)
3.5 常见证书问题及解决方案
| 问题 | 症状 | 解决方案 |
|---|---|---|
| SSL证书验证失败 | SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] |
1. 确保证书路径正确.2. 确保证书格式为PEM.3. 检查证书是否过期 |
| 自签名证书不被信任 | InsecureRequestWarning |
1. 添加证书到受信任存储2. 使用verify=False(不推荐)3. 导入证书到系统证书库 |
| 证书链不完整 | SSL3_GET_SERVER_CERTIFICATE |
1. 获取完整证书链2. 合并所有中间证书和根证书 |
| 主机名不匹配 | Hostname mismatch |
1. 确保证书CN/SAN包含正确主机名2. 使用IP地址访问3. 在连接时禁用主机名验证 |
第四章:完整代码及运行结果
4.1 完整代码
"""
Python连接ArcGIS Datastore 11.5内置Ozone对象存储
作者: [Dans]
日期: 2025年12月
说明: 该脚本演示如何使用boto3连接和操作Ozone存储桶
"""
import boto3
import logging
from botocore.config import Config
from botocore.exceptions import ClientError
import urllib3
import requests
import os
#urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
# 关闭底层日志,只看结果
boto3.set_stream_logger('botocore', level=logging.ERROR)
# 通过环境变量全局配置SSL
#os.environ['AWS_USE_SSL'] = 'true' # 强制使用SSL
os.environ['AWS_CA_BUNDLE'] = 'D:\\python\\ozone\\zsChain.pem' # 自定义CA证书
os.environ['REQUESTS_CA_BUNDLE'] = 'D:\\python\\ozone\\zsChain.pem' # 自定义CA证书
# ================= 配置区 =================
ENDPOINT_URL = "https://ags115kl.geoscene.cn:29879"
ACCESS_KEY = "f8j5dlg81qpx9914"
SECRET_KEY = "6pemeg0l9hnfcxga"
BUCKET_NAME = "0123456789abcdef"
KEY = "fix_test.txt"
# ==========================================
def run_legacy_probe():
print(f"正在尝试以 [兼容模式] 上传到 {ENDPOINT_URL} ...")
# 关键修改点 1: 强制指定签名版本为 s3v4 (虽然之前也是,但配合下面很重要)
config = Config(
signature_version='s3v4',
retries={'max_attempts': 0},
s3={
'use_ssl': True,
'verify': 'D:\python\ozone\zsChain.pem',
'addressing_style': 'path',
#'payload_signing_enabled': False # <--- 关键!禁止对 Payload 进行流式签名
}
)
s3 = boto3.client(
's3',
endpoint_url=ENDPOINT_URL,
aws_access_key_id=ACCESS_KEY,
aws_secret_access_key=SECRET_KEY,
config=config,
#verify=False
)
try:
s3.head_bucket(Bucket='0123456789abcdef')
print("桶存在")
except ClientError as e:
print(f"桶检查失败: {e}")
try:
# 关键修改点 2: 不要传流(Body=file),直接传字节(Body=bytes)
# 这会迫使 boto3 计算 Content-Length,从而不使用 chunked 编码
s3.upload_file('D:\\python\\ozone\\test.txt', BUCKET_NAME, 'file.txt')
print("Uploaded 'test.txt' to 'bucket/file.txt'")
content = b'a'
s3.put_object(
Bucket=BUCKET_NAME,
Key='/a.txt',
Body=content,
# 显式告诉服务器长度,防止它瞎猜
#ContentLength=len(content_bytes),
#ContentType='text/plain; charset=utf-8'
)
print("\n" + "="*40)
print(" [SUCCESS] 成功了!")
print(" 问题确认:服务端不支持 'aws-chunked' 流式上传。")
print(" 解决方案:在上传代码中禁用 payload 签名或预计算文件大小。")
print("="*40)
except ClientError as e:
print("\n[失败] 依然报错:")
print(e)
# 如果还是 500 且没内容,那就是服务端彻底坏了
except Exception as e:
print(f"\n[未知错误] {e}")
if __name__ == "__main__":
run_legacy_probe()
4.2 执行结果

4.3 代码说明
4.3.1 关键配置项
1.证书配置:
通过环境变量AWS_CA_BUNDLE和REQUESTS_CA_BUNDLE设置证书路径
2.确保使用PEM格式的证书文件
boto3客户端配置:
signature_version='s3v4':Ozone要求使用S3v4签名
addressing_style='path':使用路径样式寻址
payload_signing_enabled=False:关键配置,禁用payload签名,避免chunked编码问题
连接参数:
3.endpoint_url:Ozone服务器地址
aws_access_key_id和aws_secret_access_key:从ArcGIS Datastore管理员处获取
4.3.2 解决的关键问题
SSL证书验证:通过配置自定义CA证书解决自签名证书信任问题
签名版本:明确指定使用S3v4签名算法
chunked编码问题:通过禁用payload签名避免Ozone不支持的流式上传
总结
本文详细介绍了如何使用Python的boto3库连接和操作ArcGIS Datastore 11.5内置的Ozone对象存储。通过正确的证书配置、boto3客户端配置和错误处理,可以稳定可靠地在Python应用中集成Ozone存储功能。
关键点总结:
环境准备:使用Miniconda创建独立Python环境
依赖管理:安装特定版本的boto3和相关库
客户端证书配置:正确配置客户端SSL证书以建立安全连接
错误处理:完善的异常处理确保应用健壮性